churnguardianDocs
Cancel Flows

Cancel Flows: getting started

Everything you need to intercept cancellations with smart offers: how the flow works, how to tune it, and how to connect it to your app with the entrance API.

What are Cancel Flows?

Cancel Flows is our featured offer for keeping customers who are trying to cancel. When someone cancels inside your app, you send them to a page we host for you. That page shows their plan, offers them a discount to stay, and if they still want to leave, collects a reason and schedules the cancellation. Every step shows up in your Cancel Flows dashboard.

Two pieces work together:

  • The entrance. A small API your own backend calls at cancel time to get the link for that customer.
  • The smart offer picker. We learn which discount your customers actually accept, per plan, and stay safely inside the guardrails you set.

How it works

  1. A customer clicks “cancel” in your app. Your server calls our entrance endpoint with their Stripe customerId and subscriptionId.
  2. We create a session, pick a sensible offer for that plan, and hand back a hosted link like https://churnguardian.com/cancel/[token].
  3. You send the customer to that link. No login, nothing to set up on their side.
  4. They see their plan and an offer, for example “20% off for 3 months”. They can apply it or continue canceling.
  5. If they accept, we apply a discount to that subscription and note how much revenue you kept. If they decline, we record their reason and, if they insist, schedule the cancellation for the end of the billing period.
  6. Results appear in your dashboard as they happen: acceptance rates, saved revenue, and how each plan is doing.

How offers are chosen

Rather than showing every customer the same discount, we learn which offers your customers accept and quietly favor those over time. It all happens inside the limits you set, so we can never suggest something you would not be comfortable approving.

A few things worth knowing:

  • Start safe. When a plan has little data yet, we offer the middle of what you allow. Not the deepest, not the cheapest. Predictable, and a fair place to begin.
  • Get smarter. As customers respond, we steer toward offers that are accepted more often. You can watch this in the Offer Performance heatmap.
  • Respect billing cycles. Annual plans only ever get 12-month offers. Quarterly and other multi-month plans only get offers that match their billing cycle, unless you turn those rules off.

You can also turn adaptive offers off at any time. Every plan then simply receives the single base offer you choose. We keep recording results either way, so you can compare before switching back.

What you configure

Everything lives on the Cancel Flows settings tab. The defaults shown in parentheses are safe to run as-is.

SettingDefaultWhat it does
Discount range20% to 40%The smallest and largest discounts we can offer
Duration range1 to 3 monthsHow long an offered discount lasts
StrategyBalancedHow quickly we try new offers. Balanced is the middle ground
Respect billing cyclesOnAnnual and multi-month plans get offers that match how they bill
Adaptive offersOnMaster switch. Off means every plan gets the base offer
Base offerMiddle of the rangeThe one offer used when adaptive is off, and our baseline for comparison

Strategy choices at a glance:Conservative plays it safe and keeps offers consistent. Balanced, the default, learns reliably without surprises. Aggressive learns as fast as possible, handy for lower-volume plans.

Discounts are capped between 5% and 95%, and durations between 1 and 12 months. Changes apply to new sessions right away.

Reading your dashboard

The dashboard compares your results with adaptive offers on and off. A small, stable share of your customers always receives your fixed offer instead of an adaptive one; the rest are served adaptive offers. This group is your control, and it keeps the comparison honest over time.

Save Rate is how often a customer accepts an offer and is still subscribed roughly a month later. A discount that looks good on paper only counts once it actually keeps the customer around. Value Boost is how much better the adaptive results are than the fixed offer.

We run a statistical check before calling any difference meaningful. Until there is enough data to trust the numbers, they are shown with a "no significant difference yet" note, so early days don't mislead you.

Entrance API

Your backend calls this the moment a customer tries to cancel. It is protected by your entrance key, which you can see on the settings tab. The key is shown once when created, and you can rotate it any time.

POST

Asks for a hosted link for a particular customer and subscription.

Request
curl -X POST https://churnguardian.com/api/cancel-flow/entrance \
  -H "Authorization: Bearer YOUR_ENTRANCE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customerId":"cus_...","subscriptionId":"sub_..."}'
Response 200
{
  "ok": true,
  "url": "https://churnguardian.com/cancel/[token]",
  "combo": { "discountPct": 20, "durationMonths": 3 }
}

Redirect the customer's browser to url. The combo field tells you which offer was chosen for this session, which can be handy for your own logging.

GET

If a POST is awkward for your stack, the same call works as a GET and replies with a 307 redirect straight to the hosted page.

Request
curl -i "https://churnguardian.com/api/cancel-flow/entrance?customerId=cus_...&subscriptionId=sub_..." \
  -H "Authorization: Bearer YOUR_ENTRANCE_KEY"

Likely errors

StatusMeaning
401Missing or invalid Authorization header
400Missing customerId or subscriptionId, or the subscription isn't available for this account
Keep the entrance key on your server only. Never put it in the browser. If you think it leaked, rotate it on the settings tab and old keys stop working right away.

What customers see

Each link is tied to one subscription and works once. The page at https://churnguardian.com/cancel/[token] shows:

  • The plan and price they were about to cancel.
  • An offer, for example “Keep your plan, 20% off for 3 months”.
  • A short question about why they are leaving, and clear choices to apply the offer or continue canceling.

If the customer accepts, we apply a discount to that subscription only, so other subscriptions on the same account are never affected. If they choose to cancel, we schedule it for the end of the current billing period. Visiting a finished link again never applies anything twice.

Session statuses

StatusMeaning
StartedThe link was created but the customer hasn't opened it yet
Offer shownThe customer opened the page and saw the offer
Offer acceptedDiscount applied, the plan stays active
Offer declinedThe customer turned the offer down
CanceledThe customer continued, and the subscription is set to cancel at the end of the period

Trying it out

  1. Make sure your connected Stripe account has some test customers and subscriptions, for example a couple of different plans.
  2. Call the entrance API (above) with one of those cus_… and sub_… pairs.
  3. Walk the flow yourself: accept an offer once and cancel once. Then check Stripe to confirm the discount (or the scheduled cancellation) and watch the dashboard update.

Questions people ask

Does the customer need an account to use the page?

No. The link itself is the pass, and it only works for the one subscription it was created for.

Can we ever get an offer we didn't approve?

No. Every offer stays inside the discount and duration ranges you set.

What happens if Stripe is unreachable when someone accepts?

Nothing is applied and nothing is lost. The customer sees a friendly error and the offer stays available to try again.

Does this get in the way of my dunning campaign?

Not at all. Dunning recovers failed payments, while Cancel Flows intercepts customers canceling on purpose. They work alongside each other on the same Stripe account.

How do I know which offers are working?

The Offer Performance heatmap shows acceptance rates across all offers, and the Segments table shows the best performers for each plan.