Most cancellations aren’t final. Make the second offer.
Reoffer sits behind your cancel button. It asks why someone is leaving, shows the one offer that fits their answer, and changes their Stripe subscription only after they say yes.
No SDK. Swap one link. Works in feedback-only mode until you connect Stripe.
What’s making you leave?
- It costs too much
- Not using it
- Need a break
- Something’s broken
30% off your next 3 months
Growth drops from $49.00 to $34.30 a month until 12 Jan 2027, then returns to the regular price.
I understand my next 3 invoices will be $34.30.
Applied
Confirmed by Stripe
What Reoffer does
Runs through your Stripe
An accepted offer becomes a real coupon, free cycle or pause on the customer’s subscription, made through Stripe Connect.
Offers follow the reason
Price complaints, quiet accounts and product gripes each get the reply you chose for them.
Saves are confirmed
A yes is logged as intent. It counts as saved only once Stripe reports the change went through.
Useful before Stripe
Skip the connection and the page still collects reasons, then hands customers back to your billing page.
A bare cancel button tells you nothing.
One click, one lost subscription, and a gap in your MRR chart with no explanation attached.
Today
- 1
Customer clicks Cancel
That click is the whole conversation.
- 2
Subscription ends
No question asked, nothing offered.
- 3
You notice next month
In the MRR chart, with no reason.
A churned customer and a guess about why.
With Reoffer
- 1
Customer clicks Cancel
They land on your Reoffer page instead.
- 2
They say why
One of a few reasons, plus their own words.
- 3
They see one fitting offer
A discount, a free cycle, a pause, or a person.
- 4
You see what happened
Applied, declined or cancelled, with the reason attached.
Every exit leaves a reason. Some customers don’t leave at all.
Pick a reason. See the reply.
You choose one offer for each kind of reason. Here’s how a sample setup answers.
The customer said
It costs too much
“We like it, but the budget got cut this quarter.”
Your rule
Price → 30% off for 3 months
What they see
30% off your next 3 months
Stay on Growth at a lower price while things are tight.
- Today
- $49.00 a month
- Next 3 invoices
- $34.30 each
- From 12 Jan 2027
- $49.00 a month
If they accept: A coupon is added to the subscription.
Sample setup with made-up prices. Nothing on this page talks to Stripe.
Live in an afternoon.
Setup is settings, not engineering. The only change in your product is where the cancel button points.
- Step 1
Connect Stripe
Authorise Reoffer with Stripe Connect. We keep the account ID only. You never paste a key, and no access token is stored.
Stripe account
acct_••••4Q2mConnected · Live - Step 2
Choose an offer per reason
Pick a discount, a free cycle, a pause or a person for each kind of reason, and decide who qualifies.
- Price30% off · 3 months
- Not using itPause · 60 days
- Product issueTalk to a person
- Other1 free cycle
- Step 3
Point your cancel button at Reoffer
Use your hosted page link, or have your backend create a one-time secure link per customer with a single API call.
POST /api/v1/reoffers { projectId, stripeCustomerId, stripeSubscriptionId } → { url: "https://reoffer.com/r/…" } - Step 4
Read the outcomes
Every session ends as applied, declined, cancelled or failed, with the customer’s reason attached.
- li@quietpine.examplePause · 60 daysApplied
- omar@brightloop.example30% · 3 monthsProcessing
- ana@tallgrass.example—Cancelled
No Stripe connection yet? The page runs in feedback-only mode: it collects reasons and sends customers back to your billing page.
Three offers, one clear exit.
Every offer spells out the money and the dates before anyone agrees to anything.
A discount for a while
- Best for
- Price objections.
- The customer sees
- The percentage, how many invoices it covers, and the new amount.
- In Stripe
- A coupon on the subscription. The regular price returns afterwards.
A free billing cycle
- Best for
- People who never got going.
- The customer sees
- One cycle at $0 and when normal billing resumes.
- In Stripe
- A one-time 100% coupon on the next invoice. Not offered on annual plans.
A pause
- Best for
- Seasonal or temporary breaks.
- The customer sees
- How long the pause lasts and the exact restart date.
- In Stripe
- Payment collection pauses; the subscription stays. Monthly plans only.
Feedback only
- Best for
- No Stripe connection yet, or no offer fits.
- The customer sees
- The reason question, then your billing page or the Stripe portal.
- In Stripe
- Nothing changes. Reoffer never claims a change it didn’t make.
A yes isn’t a save until Stripe says so.
Each step is recorded separately, so the number you call saved is one your Stripe dashboard agrees with.
Shown
An eligible offer was on screen.
Accepted
The customer ticked the box and said yes. Nothing has changed yet.
Processing
Reoffer is making the change in Stripe.
Applied
Stripe confirmed it. The only state counted as saved.
Not applied. Declined, cancelled anyway, or refused by Stripe. Logged with the reason, never counted as saved.
- Cancel attempts
- 214
- Offers shown
- 151
- Saved (applied)
- 47
- Est. revenue kept
- $2,180/mo
Why people said they were leaving
- Price34%
- Not using it27%
- Product issue21%
- Other18%
Made-up numbers to show the layout. Not a customer result. Estimated revenue kept is a projection from applied offers at current prices, not booked revenue.
For teams without a retention department.
You don’t need a churn specialist to run a decent cancel flow. You need the reason, one good offer, and an honest record.
- Learn why people leave, in their own words
- Answer the reason instead of showing everyone a coupon
- Let Stripe do the billing maths
- Rehearse the whole flow in Stripe test mode first
- Report saves you can defend
- Run several products from one account
Pick a plan by size, not by features.
Every plan includes the full product. Plans differ only in how many products you run and how many reoffers are included.
Solo
One product, one offer page, every offer type.
$29/ month
- Products
- 1
- Sessions included
- 100
- Recommended
Growth
For teams who check their churn number every week.
$49/ month
- Products
- 2
- Sessions included
- 500
Studio
For agencies and operators running several products.
$99/ month
- Products
- 10
- Sessions included
- 1,500
Every plan includes
- Hosted offer page with your logo and colours
- Stripe Connect, test and live
- Discount, free-cycle and pause offers
- Offers matched to the reason given
- Secure per-customer links via API
- Analytics, session history and CSV export
A session is one customer opening your offer page. Monthly billing through Stripe. Cancel any time from your account settings.
Questions founders ask first.
Only what the customer accepted: a coupon for a discount, a one-time 100% coupon for a free cycle, or paused collection for a pause. It works through Stripe Connect, so the change happens in your own Stripe account, and nothing changes until the customer says yes.
Yes. The offer shows the new amount, how long it lasts and when normal billing returns. They tick a box to confirm, and declining is always one click.
Only when Stripe confirms the change. Accepted-but-pending and failed attempts are tracked separately and never counted as saved.
Yes. Connect a Stripe test-mode account and run test subscriptions through the flow first. A preview also lets you click through your page with sample data.
The page works in feedback-only mode: it asks why, records the answer and sends the customer to your billing page or the Stripe customer portal to finish. It never claims to have changed their bill.
No. Reoffer sits in front of it. Customers who still want to leave can cancel through Reoffer or carry on to your portal.
For the hosted page, none: swap one link. For secure per-customer links, your backend makes one API call and redirects to the URL it gets back.
Active Stripe subscriptions with a single price. Metered, multi-item and schedule-managed subscriptions fall back to feedback-only, so nothing unexpected happens to them.
Give your next cancellation a second offer.
Set up the page, rehearse it in test mode, and go live when you’re happy with it.