Guide · facts checked 4 Nov 2026
How to read cancel reasons and match an offer to each
Stripe's customer portal can ask a cancelling customer to pick from 8 preset reasons and type their own if they pick Other. You find the answers on the subscription's page in the Dashboard, in Stripe Sigma, and in the customer.subscription.updated webhook. The useful step is the one after: map each reason to one offer, and to no offer where an offer would be the wrong answer.
Where the reasons come from
Stripe's cancellation page in the customer portal can collect a reason when a customer cancels. You choose which of the standard reasons your customers see, and a customer who picks Other reason can type their own words.
| Reason the customer picks | What it usually means |
|---|---|
| It’s too expensive | The price is the problem, or the value does not feel like the price. |
| I need more features | They needed something the product does not do. |
| I found an alternative | They found another tool and are leaving for it. |
| I no longer need it | They no longer need it, or never got into the habit. |
| Customer service was less than expected | A support experience went badly. |
| Ease of use was less than expected | They could not get the value out of it. |
| Quality was less than expected | It did not work the way they expected. |
| Other reason | Anything else; the free-text box opens. |
The middle column is interpretation, not Stripe's wording. Treat it as the thing to check in the free text, not as a fact about any one customer.
Where to read them in Stripe
- The subscription page. Billing → Subscriptions → open the subscription. Good for one customer at a time.
- Stripe Sigma. Query the billing data when you want counts by reason. Stripe has templates for Billing queries.
- The webhook. The reason arrives in the
customer.subscription.updatedevent, so your own code can react the moment someone cancels. The Stripe cancel flow guide shows a handler.
Stripe's performance reporting also groups free-text cancellation comments with AI, which saves reading every comment when you have a few hundred.
From reason to offer: a starting point
A retention offer is only worth showing if it answers the reason the person gave. A discount for someone who says they no longer use the product is a discount for a customer who still will not use it. The table is a place to start from; your own numbers should overrule it.
| Reason | Offer to try | Offer to avoid |
|---|---|---|
| It’s too expensive | A time-limited discount, or a cheaper plan | An open-ended discount that becomes the new price |
| I need more features | Ask which feature; a pause if it is on your list to build | A discount; the price was not the problem |
| I found an alternative | Ask which one; a plan change if price is the gap | Chasing someone who has already moved |
| I no longer need it | A pause for a set number of weeks | A discount on something they do not open |
| Customer service was less than expected | A personal reply from you | A coupon in place of an answer |
| Ease of use was less than expected | A short help offer, or a simpler plan | A pause that ends with the same confusion |
| Quality was less than expected | Ask what went wrong | Any offer; fix the product and say so |
| Other reason | Read the free text first | A generic offer |
The Quality row ends in no offer on purpose, and Customer service in a reply instead of a coupon. A cancel flow that always offers something teaches you nothing, and it trains customers to cancel for the coupon. The pause, discount and downgrade guide covers what each offer costs.
How to apply a reason in Stripe retention rules
Stripe's retention rules can use the cancellation reason as a condition. A rule can say: show an offer only when the reason is “It’s too expensive” and the subscription is older than 6 months. Conditions can also use the subscription's age in months, total billing spend, subscription status and metadata on the subscription or the customer. A customer must meet every condition in a branch to get its offer; Stripe tries branches in the order you set them and uses the first that matches.
That covers the case where one reason maps to one fixed offer. It does not read the free-text box. If “Other” carries most of your cancellations, the words are where the signal is.
A weekly routine for a small SaaS
- Once a week, list the cancellations and their reasons. At 20 to 50 a month, ten minutes in a spreadsheet is enough.
- Read every free-text comment. If a phrase appears three times, it is a roadmap item or a pricing question, not noise.
- Count by reason. If one reason is over a third of the cancellations, that is the offer to build first.
- Write the one offer for that reason and the one reason you will not make an offer for.
- Check the result against a holdout, not just the accepted offers: what counts as a save.
Watch one reason turn into an offer
Run a sample cancel session: play a subscriber, pick a reason, type a sentence, and see the offer, the wording and the Stripe change that come back.
90 seconds, no sign-up. You play the subscriber; the AI answers, and “Cancel anyway” is always one click away.