Subscriptions
Churn analysis for subscription ecommerce
Customer churn analysis is working out who leaves, when, and why, so you know which fix to fund. Your churn rate tells you how much churn you have. The analysis tells you which subscribers it comes from and what happened to them first.
Split voluntary and involuntary churn first
Every other cut is muddied until you separate customers who chose to cancel from customers whose payment failed. They respond to different fixes and different teams own them, so a single blended number can hide a billing problem behind a product one, or the other way round.
Most billing systems record which it was. Stripe, for example, records a cancellation reason on canceled subscriptions. It's payment_failed when the subscription was canceled automatically after a failed payment, payment_disputed after a dispute, and cancellation_requested when it was canceled through the API or dashboard. It also has a separate field for the reason the customer chose, if your flow collects one. Shopify subscription apps and other billing tools have their own equivalents; check which field yours uses before you export.
The churn rate guide covers the formula and published benchmarks for each half. From here on, analyze the two halves separately.
Build a cohort retention table
Illustrative numbers for a made-up brand, not benchmarks.
A cohort is every subscriber who started in the same month. The table shows what share of each cohort is still subscribed one, two, three, and six months later. Read across a row to see how one cohort decays. Read down a column to see whether newer cohorts hold up better or worse than older ones at the same age.
| Cohort | Started | Month 1 | Month 2 | Month 3 | Month 6 |
|---|---|---|---|---|---|
| February | 1,150 | 79% | 68% | 61% | 48% |
| March 40% off first order | 2,400 | 58% | 44% | 37% | 27% |
| April | 1,300 | 81% | 70% | 63% | 50% |
| May | 1,250 | 80% | 69% | 62% | — |
In this example the March cohort ran a deep first-order discount and doubled signups. By month six it has 648 subscribers left. At February's month-six rate it would have kept about 1,152. The blended churn rate for April and May would rise, and without the table it would look like a product or fulfilment problem that started in spring.
The May row stops at month three because that cohort isn't six months old yet. Leave those cells blank. Filling them with current numbers mixes subscribers who have had six months to cancel with ones who have had three.
Do it in a spreadsheet
- Export every subscription, active and canceled, with start date (column B), end date (C, blank if active), end reason (D), acquisition channel (E), and first-order discount (F). Add the main product if you sell more than one.
- Add a cohort column (G):
=TEXT(B2,"yyyy-mm") - Add months active (H):
=DATEDIF(B2, IF(C2="", TODAY(), C2), "m") - Label each row (I):
=IF(C2="", "active", IF(D2="payment_failed", "involuntary", "voluntary")). Change the reason text to match your billing tool's export. - For each cohort and each month mark, count the share still active. For the March cohort at month three:
=COUNTIFS(G:G, "2026-03", H:H, ">="&3) / COUNTIF(G:G, "2026-03"). Only fill a cell if the cohort is at least that many months old. - Build the table twice more: once counting only voluntary cancels as losses, once counting only involuntary. A cohort that looks bad in one and normal in the other tells you where to look.
- Re-cut the voluntary table by channel, by first-order discount, and by product. Most of what a churn analysis finds shows up here, as one channel or one offer whose cohorts fall away faster.
Refresh it monthly. The aim is to notice within a month or two when a new cohort starts falling below the ones before it.
Cancellation reasons
Cohorts tell you when people leave. The reasons they give tell you what to change. Collect them at the moment of cancellation with one short single-choice question, plus an optional free-text box. Stripe's built-in list is a reasonable starting point: too expensive, no longer needed, found an alternative, quality, customer service, too complex, missing features, and other. For physical products, add the ones that come up most: too much product, didn't like the flavor or scent, and delivery problems.
Read the free text every month and recode it. A rising share of "other" usually means a reason is missing from the list. Then put reasons against cohorts and products. "Too expensive" concentrated in one discounted cohort is a pricing-cliff problem at the first full-price order. Spread evenly across cohorts, it's more likely the price or the positioning.
The same reasons drive which offer a cancellation flow shows, and which message a win-back campaign sends later.
Leading indicators
A cancellation is the last thing a subscriber does. These usually come first, and most of them are already in your subscription app, helpdesk, and shipping data:
- Skipping orders, especially two in a row.
- Pausing, or moving to a longer interval between orders.
- Removing items or downgrading to a smaller size.
- A support ticket about a damaged, late, or lost delivery, or about a billing surprise.
- A carrier exception on their last shipment, whether or not they contacted you.
- A first failed renewal attempt, or a saved card that expires next month.
- The first order at full price after an introductory discount ends.
Test each one against your history: of subscribers who did this, what share canceled in the next 60 days, compared with subscribers who didn't? Keep the signals that separate the two groups clearly, and route each to a response. A delivery exception gets a proactive message from support. A second skip gets a frequency suggestion. An expiring card gets the card-update steps in the failed payments guide.
When churn prediction models are worth it
A churn prediction model scores every active subscriber on how likely they are to cancel. It earns its cost when three things are true at once:
- You have enough history and enough cancellations for the model to learn from. A few hundred canceled subscribers is thin.
- You would treat high-risk subscribers differently, with an offer, a call, or a product change, and that treatment costs enough that you can't give it to everyone.
- The simple rules above have stopped finding new risk. If a skip-plus-ticket flag already catches most cancellations, a model adds little.
Many brands under a few hundred thousand subscribers get further from the spreadsheet, the reason data, and a handful of rule-based flags. When you do build a model, judge it the same way you judge a flag: keep a holdout, intervene on the rest, and compare cancellations between the two.
What the involuntary half costs
If the split shows a large involuntary share, the Payments Leak Calculator puts a yearly number on failed renewals, alongside declined checkouts, chargebacks, and fees.
Questions
What is customer churn analysis?
Breaking churn down by when customers leave, which groups they belong to, and why they left, so you can tell which changes would keep more of them. For subscriptions, it usually means cohort retention tables, a split between voluntary and involuntary churn, and cancellation reasons.
What data do you need for a churn analysis?
A list of every subscription with its start date, end date, and end reason. Acquisition channel, first-order discount, product, and the cancellation reason the customer chose make it much more useful.
How often should you run it?
Monthly for the cohort table. Each new cohort adds a row, and the useful signal is a new row falling below the ones above it.
What is a cohort retention table?
A grid with one row per signup month and one column per month since signup. Each cell is the share of that cohort still subscribed at that age.
Sources: Stripe's Subscription object API reference (cancellation reason and feedback fields). Checked October 2026. The cohort table uses made-up numbers to show the method.