Churn risk, without a CS team.
The warning signs in Stripe billing and product usage, and how to rank at-risk customers so the biggest ones get your time first.
How to identify at-risk customers before they churn
An at-risk customer is one whose behavior has changed in a way that usually comes before leaving. To find them, compare each customer with their own past, not with your average customer. A team that has always logged in twice a week is fine at twice a week. A team that went from daily to twice a week is telling you something.
Ask three questions about every paying customer:
- Is the money still coming in? A failed payment, an open invoice, or a card that expires before the next charge.
- Are they paying for less? Fewer seats, a lower plan or a smaller usage bill.
- Are they still using it? Fewer active days, no recent use of the thing they pay you for, or features dropped.
Customers rarely leave in one step. They leave quietly: seats cut, logins fall, then the cancel. So one signal on its own is a reason to look, and two or more together are a reason to act.
Write down a reason with a date for every customer you flag, for example "removed 3 seats on Sep 12" or "no reports sent since Aug 30." A reason you can read beats a number you can't explain, and it tells you what to say when you reach out.
How to predict customer churn without a data team
You don't need a model to start. A simple points-based score, checked against customers who already left, gets a small team most of the way there, and it fits in a spreadsheet.
- List your recent leavers. Export canceled subscriptions from Stripe for the past year. For each one, note what changed in the weeks before the cancel: payments, seats, plan and usage.
- Find the signals that repeat. Count how often each signal appears among leavers, then among customers who stayed. A signal common to both is noise. One that shows up mostly among leavers earns points.
- Score every customer from 0 to 100. Give each signal points by how well it separated leavers from stayers. Let a scheduled cancel or an unrecovered failed payment put a customer straight at the top, whatever else is true.
- Test it honestly. Score last year's customers as they looked a month before each cancel. Count how many leavers the score would have flagged, and how many customers it flagged who stayed. Both numbers matter: a list full of false alarms gets ignored.
- Review it weekly. Work the top of the list, then adjust the points when the list surprises you.
Before you start, run your numbers through a churn rate calculator, so you know how many customers you lose in a typical month and how many a good list should catch.
If you'd rather not maintain the sheet, churn prediction software does the same work from your Stripe data. North Metric gives every paying customer a 0–100 risk score, a level (Likely, Possible or Safe) and up to three reasons, each with data and dates.
See money at risk in your own Stripe, and the first five customers to act on.
Warning signs in Stripe billing
Stripe already holds the strongest churn signals. They sit on different objects, so they're easy to miss. These are the ones to watch:
| Signal | Where it shows in Stripe | What it tells you |
|---|---|---|
| Cancel scheduled | cancel_at_period_end is true, or cancel_at is set | The decision is made. You have until the period ends. |
| Failed payment | invoice.payment_failed, subscription past_due | Often a card problem, not a decision |
| Hard decline | Codes such as lost_card, stolen_card, incorrect_number | Stripe can't retry without a new card |
| Seats or plan cut | Lower quantity or a cheaper price on the subscription | Contraction often comes before a cancel |
| Discount ending | The end date on a repeating discount | The price goes up, and the customer notices |
| Card expiring | Card expiry date before the next charge | A failed payment waiting to happen |
Failed payments need care. Stripe can retry them for you: its recommended default for Smart Retries is 8 tries within 2 weeks (Stripe docs, checked Oct 18, 2026). Two cases fall through. Stripe doesn't retry a hard decline until the customer adds a new payment method, and it doesn't retry when there is no payment method on file. Those customers need a personal note from you straight away. Everyone else needs a note when Stripe's retries end, not while they are still running.
Two quieter signs are worth a look. New customers who never got set up are a known risk, so watch the first few billing cycles closely. And when someone does cancel, read cancellation_details.feedback. If you collect a cancel reason, Stripe stores the customer's choice there, such as too_expensive, unused or missing_features. Totaled over time, those reasons show you which kind of churn you have.
Warning signs in product usage
Usage moves before billing does. A customer who stopped working in your product keeps paying until someone notices the charge, which is why usage gives you the earliest warning. Watch three things per account:
- Active days falling. Fewer days with real activity, compared with the account's own recent weeks.
- The core action stopping. The one thing they pay you for, such as sending invoices or running reports, hasn't happened in longer than usual.
- Features dropped. A feature they used every week has gone quiet, or an integration was disconnected.
Match the source to how each customer pays. On flat or seat plans, usage lives in your product: event tracking such as PostHog, or your own database. On usage-billed plans that run on Stripe's Billing Meters, usage is already in Stripe, and a fading customer shows up as metered usage falling before the invoice shrinks. Hybrid plans need both, because the platform fee can stay flat while the usage part fades.
Two cautions. Measure per account, not per user: on a B2B plan, one person going quiet matters less than the whole team going quiet. And allow for seasons: a drop in a month that is always quiet for your customers isn't a warning on its own.
The guide to churn indicators covers how to measure each of these signs.
Rank by money at risk
A list sorted by risk alone sends you to the wrong customers, because the customer most likely to leave is often a small one. Sort by MRR multiplied by risk score instead, so a large account that is slipping comes before a tiny account that is nearly gone.
Example: three at-risk customers, with the risk score taken as a share of 100.
| Customer | MRR | Risk score | Risk-weighted MRR |
|---|---|---|---|
| Customer A | $2.4K/mo | 45 | $1,080/mo |
| Customer B | $800/mo | 70 | $560/mo |
| Customer C | $90/mo | 90 | $81/mo |
Sorted by risk, Customer C comes first. Sorted by money at risk, Customer A does, and that is where an hour of your time does the most good.
Then match the move to the customer. Ask two questions: is this customer valuable, and why are they at risk? A simple line for valuable is your median MRR. A valuable customer whose usage dropped gets a short personal note from you with one question. One with a failed card gets a card-update note once Stripe's retries end. One who scheduled a cancel gets a save email before the period ends. A low-value customer who is barely using the product may need nothing at all.
This is the list North Metric keeps for you: every paying Stripe customer ranked by MRR × risk score, and a drafted move for each one at risk that you approve, or rules you set once.
Whatever you use, keep a short log of who you contacted and what happened. Better still, leave a small comparison group of similar at-risk customers alone. That is how you tell money kept because of your moves from money that would have stayed anyway.
Fair questions.Straight answers.
A change that usually comes before leaving: a scheduled cancel, a failed payment that isn't recovered, fewer seats or a lower plan, or usage falling against their own past. One signal is a reason to look. Two or more together are a reason to act.