· Venturi Code
Most subscription apps cancel the moment someone clicks "Cancel". A short flow in between can keep a share of those customers, as long as it helps them rather than traps them.
The flow in four steps
- Ask why, with one tap: too expensive, not using it enough, missing a feature, switching to something else, temporary pause.
- Offer the alternative that fits the reason: a discount or a cheaper plan for "too expensive", a pause for "not using it enough" or a temporary break, a note about the roadmap or a personal reply for "missing a feature".
- Confirm clearly what happens: when access ends, what happens to their data, and that they can come back.
- Cancel immediately if they still want to. One more click, no hidden steps.
Keep it honest
Making cancellation hard backfires: it causes chargebacks, angry reviews and, in some places, legal trouble. Many jurisdictions require online cancellation to be as easy as signing up. Two screens at most, and the cancel button always visible.
Wiring it to Stripe
- Pause: set
pause_collectionon the subscription instead of cancelling. - Discount: apply a coupon to the subscription for the next few months.
- Downgrade: switch the subscription item to the cheaper price.
- Cancel: set
cancel_at_period_endso they keep access until the end of what they paid for.
Do all of these on the server, after checking the signed-in user owns the subscription. Record the reason they gave: it’s the most useful product feedback you’ll get.
Don’t forget involuntary churn
Some customers leave without deciding to: their card fails. Turn on Stripe’s automatic retries and show an in-app banner asking them to update their card. It’s often the easiest revenue to win back.
The shortcut
Venturi Pro includes a cancel flow with reason-based save offers and a failed-payment banner for Next.js. Add them with npx venturi-dev add cancel-flow failed-payment-banner.