Cancellation flow for SaaS

Your users leave silently.

RetainFast is one script tag on your billing page. It intercepts your cancel button, asks the one question you never get answered, makes the right offer, and hands the outcome back to your own code.

One script tag · Zero dependencies · Shadow DOM · No Stripe OAuth

<5KB

gzipped, zero deps

0

Stripe permissions

5 min

typical install

$12

a month, after the intro

The cancel button is the least designed screen in your product.

Stripe's portal

Asks one canned question, offers one coupon, and keeps the answer somewhere you will never look at it.

The $250/mo tools

Want write access to your Stripe account before they will show you a single screen. That is a long afternoon and a real risk.

So you ship a confirm()

And lose the customer, the reason they left, and the one chance you had to offer them something.

How it works

Three steps, about five minutes.

  1. 01

    Paste one script tag

    Add data-retainfast to the cancel button you already have. Nothing else about your billing page changes.

  2. 02

    Build the flow

    Reasons, offers, copy, colour — in the dashboard, with the real widget previewing beside you as you type.

  3. 03

    Your code does the billing

    onSave hands you the offer they took. onCancel hands you the reason. You call Stripe exactly the way you do today.

<script src="https://retainfast.xyz/w.js" data-key="rf_pub_xxx" defer></script>

<button data-retainfast>Cancel subscription</button>

<script>
  // your code, your billing provider
  RetainFast.onSave   = ({ offer })  => yourApi.applyOffer(offer.value);
  RetainFast.onCancel = ({ reason }) => yourApi.cancelSubscription(reason);
</script>

That is the whole integration. RetainFast never asks for a Stripe key, never holds a token, and never issues a refund on your behalf — because it cannot. Your backend stays the only thing that can move money.

Where it sits

Between doing nothing and paying $3,000 a year.

Stripe portalChurnkey etc.RetainFast
Cancellation reasonsOne canned listYesYes
Offers that vary by reasonOne couponYesYes
Save-rate analyticsNoYesYes
Needs Stripe write accessn/aYesNever
Setup timeMinutesHalf a dayFive minutes
PriceFree$250+/mo$25, then $12/mo

Competitor pricing as published at the time of writing

What you get

Everything, for one payment.

—The flow editor

Add, remove and reorder reasons. Attach an offer to each one. Pick your accent colour and watch the real widget update as you type.

—The analytics

A funnel from opened to saved, save rate per offer, a reason breakdown, and every word your customers typed on the way out.

—Shadow DOM isolation

Your host CSS cannot leak in and ours cannot leak out. The widget looks identical on a Tailwind app and a fifteen-year-old Bootstrap theme.

—Zero dependencies

One vanilla JavaScript file under 5KB gzipped. No React, no bundler, no supply chain to worry about.

—Fails quietly

If our analytics endpoint dies, the error is swallowed. Our bad day must never become an outage on your billing page.

—Never touches Stripe

No OAuth, no API keys, no write access, ever. There is no configuration in which we could move your money.

Live demo

This is the real widget.

Not a video, not a screenshot. The same file your customers would load, running the flow that is configured in the dashboard right now.

A pretend billing page

Hit cancel. The log underneath shows what your backend would receive.

Prefer it on its own? Open the full-page demo.

Questions

The ones that actually get asked.

Does RetainFast need access to my Stripe account?

No, and there is no setting that turns it on. We never ask for an API key, never run a Stripe OAuth connection, and hold no token that could move your money. RetainFast owns the interface your customer sees and the analytics you read; your own backend performs every billing action, exactly as it does today. That single constraint is why installing takes five minutes instead of half a day, and why putting a stranger's script on your billing page is a reasonable thing to do.

How long does it take to install?

About five minutes, and the whole of it is copy and paste. You add one script tag to your billing page, put a data-retainfast attribute on the cancel button you already have, and wire two callbacks — onSave and onCancel — to the billing code you have already written. There is no SDK to learn, no migration, no webhook to configure and no back-and-forth with our support. If your cancel button is already a button, you are most of the way there.

How is this different from Stripe's built-in cancellation survey?

Stripe's portal asks one fixed question, from a list you cannot edit, and can attach a single coupon to the answer. It then files the response somewhere you will realistically never look. RetainFast lets you write the questions yourself, attach a different offer to each reason — a discount for price, a pause for the ones who are too busy, a downgrade for light users — and shows you a save-rate funnel for each one. It also runs on your own billing page rather than on Stripe's, so it matches your product instead of interrupting it.

Can I customise the questions and offers?

That is most of the product. In the dashboard you add, remove and reorder the reasons, write the headline and subheading in your own voice, and attach an offer to each reason with its own copy and call to action. Offers can be a coupon, a pause, a downgrade or anything custom your backend knows how to honour. You pick the accent colour and corner radius, and the real widget previews beside you as you type, so you are never guessing what your customers will see.

What happens if your service goes down?

Your billing page keeps working, because it was built on the assumption that we will eventually have a bad day. If the configuration endpoint fails to answer, the widget falls back to its built-in defaults and still shows a working cancel flow. If the analytics endpoint fails, the error is swallowed silently and nothing is thrown into your page. And because your own code performs the billing, a total outage on our side cannot stop a customer from cancelling or block a save you have already granted.

What happens when someone accepts an offer?

The widget calls your onSave handler with the offer you configured, including its type and its value. Your own code decides what that means and applies it through your billing provider. RetainFast records that it happened so the funnel adds up, and nothing more — a saved event is an analytics record of what the browser did, never a financial one. Your billing provider stays the only source of truth about money.

Is $25 really all I pay to start?

Yes. $25 is charged once at checkout and covers your first 3 months for one site. After that it renews at $12 a month, and you can cancel in one click and keep the rest of the period you paid for. There is no per-seat charge, no setup fee, and no commission on the revenue you save. Fair use is 2,000 cancel sessions a month; past that the widget carries on working normally and the counters simply pause.

What data do you store about my customers?

The reason they picked, the offer they were shown, and any freeform text they chose to type. No names, no email addresses, no IP addresses, and no cookies set on your visitors. Events are added to a single monthly counter rather than stored one row per person, so what we hold is an aggregate that cannot be traced back to an individual. That is a deliberate design choice, not an oversight — it also means there is nothing to hand over in a subject access request.

Can I use it on more than one site?

A licence covers one site, identified by the domains you allow in the dashboard. If you run several products, buy a licence for each — even three of them still costs less than a single month of the enterprise retention tools. Requests from a domain you have not added are rejected, which is also what stops anyone else using your public key to pollute your numbers.

PricingNormally $12 a month. $25 for your first 3 months, then $12 a month.

$25 covers your first 3 months. After that it is $12/month. Cancel whenever you like — it is a subscription, not a contract.

  • —3 months for the price of two
  • —Up to 2,000 cancel sessions a month
  • —Every future update included
  • —Cancel in one click, keep the rest of the period
  • —30-day refund, no argument
  • —Whop handles tax and invoicing
$25 for 3 months · then $12/mo · cancel any time