Getting started
Ship your first cancel flow.
Pick a starter template, tune the offer, publish v1. Three minutes if you trust the defaults; ten minutes if you want to read each step. Cancel flows are cancel-as-easy-as-signup by default — the cancel button is always one tap away.
Before you start
- Stripe connected. Offers act on real subscriptions, so connect Stripe first — Connect Stripe. (You can build and simulate a flow without it; you just can't apply offers to live customers.)
- A plan with the flow builder. Cancel flows are a paid feature. On the free tier the Cancel flows page shows an upgrade card instead of the builder; upgrade and the New flow button appears.
- Admin access on the workspace — publishing a version is admin-gated.
1. Pick a starter template
- From the workspace nav, open Cancel flows → New flow.
- Pick the closest template to your business — there's a dozen, spanning common SaaS niches: SaaS Standard, Pause Instead, Annual Upsell, Dev Tool / API Service, Agency / Pro Service, Newsletter / Content, Fitness / Wellness, B2B with Account Teams, Hobby / Consumer App, Education / Course Platform, Productivity / Personal, or Blank (survey + confirm only).
- Give the flow a name (and tick defaultif it should be the one your embed snippet runs). Create it — the flow opens in the canvas builder with the template's nodes wired up: survey, optional save stories, offer, confirm, and the two end states.
2. Tune the offer
Click the Offer node. The right rail shows the variant picker. Pick the right mechanic for your cohort, fill in the percent / duration / target price, and write your headline + body copy. The variants:
- Discount — percent off (1–100%) for N billing periods (0 = forever).
- Pause — pause collection for N months (0 = indefinite, until resumed).
- Downgrade — switch the subscription to a cheaper Stripe price ( single-item subscriptions).
- Gift— give N free months “on us” (1–12). Mechanically a 100%-off coupon, framed and reported as a gift.
- Schedule call — hand the customer a Cal.com / Calendly link instead of an automated action. Good for high-LTV cohorts.
- Trial extension — add 1–90 days to the trial end (only meaningful while the customer is still
trialing). - Annual upsell — convert a monthly subscriber to an annual price, framed as an upgrade.
Add fallback offers if you want a chain — declining the primary discount can route to a pause offer, then to a “schedule call” offer, then to confirm. You can chain up to 2 fallbacks (3 offers total per node) — survey data shows a third decline almost never converts.
3. Simulate it
Click Simulate in the builder header. The simulator walks you through the flow as a customer would, without any Stripe call or session row — nothing is charged, changed, or logged. Toggle between Draft (your in-progress edits) and Live (what your customers see right now) to compare before you publish over the top.
4. Publish
Click Publish (top-right of the canvas). We snapshot the current draft as version 1 with 100% traffic; the header badge flips to live · v1. Future drafts publish as v2, v3, etc. Two ways to A/B test: split traffic across whole published versions on the Versions & traffic page, or — to test just the offer (say 25% vs 40% off, or pause vs discount) — add 2–4 variants right on the Offer node. Each visitor gets a stable arm for their session, and the Versions page shows a per-arm save-rate readout so you can see which is leading.
5. Wire up the customer-facing surface
Publishing makes the flow live; now point something at it. Three ways, and you can use more than one:
- Embedded modal — load the SDK and call
Backstop.cancel(…)on your existing “Cancel subscription” button to open the flow as a modal on your own site. See Embed Backstop. This is the recommended path, and the one that closes the Stripe-portal bypass — route cancellations through Backstop. - Hosted redirect (no SDK) — same backend signer, but instead of a modal your button gets a Backstop-hosted
/cancel/<token>URL and redirects there. Good for CSP-locked sites or anywhere you'd rather not load a script. It's the “Hosted webpage” toggle in the same snippet panel. - Automatic follow-up link — if a customer starts your cancel flow but drops off mid-way, Backstop can email them an offer reminder with a
/cancel/<token>link back to the same flow. Nothing to wire up — it follows whatever you publish here. (Note: failed-payment dunning emails link to card-update, not cancel — those are the recovery side of the product.)
The copy-paste snippet — your slug and base URL pre-filled — lives at the bottom of the Cancel flows page under Embed on your site. The snippet runs your default published flow, which is why naming one as default in Section 1 matters.
6. Read the analytics
Once real customers hit a published flow, open Cancel flows → Analytics. Pick a window (7 / 30 / 90 days) up top. What you get:
- Save rate— saved ÷ resolved (saved + canceled). Abandoned sessions aren't counted as a loss here; they show separately.
- Outcome mix — a donut splitting saves by type:
saved · discount,saved · pause,saved · downgrade,saved · other, vscanceledandabandoned. - Why people leave — the top survey reason codes, ranked. Your richest product signal; mine the free-text too.
- Step funnel — started → answered survey → reached offer/confirm → saved / canceled, with the drop-off at each step so you can see where the flow leaks.
- Per-flow performance and recent sessions — compare flows and spot-check individual outcomes.
Per-version and per-offer-arm save rates live on the Versions & traffic page (from the builder header), where an A/B running long enough surfaces a leading arm.
Common mistakes
- Built it but never wired the button. Publishing only makes the flow available — customers reach it through the embed snippet (Section 5). No snippet, no traffic.
- Left the Stripe portal as an open back door.If your customers can still cancel from Stripe's billing portal, they bypass your save flow entirely. Turn off “Customers can cancel subscriptions” in Stripe and route through Backstop — here's how.
- A schedule-call / stories template still in draft. Those land as drafts until you fill the booking URL / story content and hit Publish. Check the header badge —
draftmeans no customer sees it. - Downgrade / annual-upsell pointing at the wrong price. The target must be a real
price_…in the sameStripe account (and the same mode) you connected. A stale or test-mode price ID won't apply. - Forgot the default. The embed snippet runs your default flow. If nothing is marked default, set one so the right flow is what customers actually get.