Skip to main content

Cancel-flow retention for small SaaS

Turn the cancel click into a reason to stay.

A lightweight Stripe retention layer for SaaS under $20k MRR. Install in 5 lines, match each cancellation reason to a useful save, and prove the recovered revenue without inflating the number.

5 lines
to install
3 routes
to retain
1 ledger
to prove ROI

The full loop

From cancel intent to auditable recovery.

churnplug connects the customer moment, the Stripe action, and the evidence row—without making you stitch together five products.

01Install

Add one hosted script

Mint a short-lived identity token on your backend, then open churnplug from your existing cancel button.

SDK ready

02Understand

Ask why they’re leaving

A Shadow DOM modal captures the reason without inheriting or breaking your product’s styles.

Reason selected

03Retain

Route to the right save

Offer a bounded discount, a pause, or extra access with a personal founder follow-up.

Offer accepted

04Execute

Apply it safely in Stripe

A tenant-scoped restricted key updates the subscription while webhook signatures protect the event stream.

Stripe updated

05Prove

Credit only defensible ROI

Every saved amount lands in a drillable ledger with a bounded horizon and stored methodology.

+$87 evidenced

Two leaks, one system

Save customers before and after payment fails.

Active churn needs a relevant conversation. Passive churn needs timely, transactional recovery. Both should resolve into the same trustworthy ledger.

Active churn

They click “Cancel”

Main course
reason_selectedtoo_expensive
offer_accepted50% × 3 months
subscription_updatedcancel_at_period_end: false

Passive churn

A payment fails

Safety net
invoice.payment_failedattempt 1 of 3
magic_link_clickedStripe-hosted update
invoice.paidrecovery attributed

Reason-aware retention

Three useful routes. No random coupon roulette.

Each offer is tied to a stated problem and bounded by eligibility rules, so customers get an appropriate option and you keep control of margin.

0150% × 3 months

Discount

Price is the blocker. Apply a time-bounded coupon with a per-customer redemption cap.

02Pause × 2 months

Pause

Timing is wrong. Pause collection and automatically resume when the customer is ready.

03+30 days access

Founder save

The product is missing something. Extend access and trigger a personal follow-up email.

Evidence, not vanity

Every recovered dollar comes with a receipt.

Revenue is credited only after an explicit retention action or a paid invoice following a clicked dunning link. The amount, source, and methodology stay drillable.

Explore the live ROI ledger

Saved revenue this month

$261

Net after fee

+$182

Cancel savesub_•••8A2

3 months × $29 MRR

+$87
Payment recoveryin_•••4FC

Clicked Magic Link → paid

+$58
Cancel savesub_•••1D9

2 months × $58 MRR

+$116

Conservative by design: some customers might have stayed anyway. churnplug stores the methodology instead of claiming perfect causation.

Small footprint, serious boundaries

Built for founders who read the security page.

Your browser never sees a Stripe secret, churnplug never renders a card form, and tenant isolation is a required CI gate.

  • Stripe restricted keys live in Supabase Vault
  • Short-lived, signed customer identity tokens
  • Cross-tenant isolation enforced by Postgres RLS
  • Stripe-hosted card updates keep card data away
  • Signature-verified, idempotent webhook processing
  • Single-use hashed Magic Update Links

Your next cancellation is a signal

Start listening before the customer leaves.

Install the hosted SDK, run the real cancel flow, and inspect the exact ledger row it creates.