Audit retention
Cohorts, churn and the real reasons people leave.

Read the retention curve before anything else. If it flattens, the product keeps a core of customers and every other lever in the audit compounds on top. If it keeps sliding toward zero, new customers just refill a leaking bucket, and that becomes the headline of your audit.
Say a B2B SaaS at 2M ARR sells quoting software on monthly and annual plans. All numbers here are invented for the method.
Collect the raw material and fix the definitions
You need the subscription history from billing, product usage events, the cancellation reasons, support tickets and CRM notes on lost accounts. Then agree on formulas, because “churn” means something different to almost everyone in the room.
| Metric | Formula | Answers |
|---|---|---|
| Logo churn | Customers lost in the period / customers at the start | How many accounts leave |
| Gross revenue retention | (Start MRR - churn - contraction) / start MRR | How much revenue survives, expansion excluded |
| Net revenue retention | (Start MRR - churn - contraction + expansion) / start MRR | Whether the base grows by itself |
Take a group of customers worth 100,000 of MRR on the first of the month. They lose 3,000 to churn and 1,000 to downgrades, and add 2,500 in upgrades. GRR is 96% and NRR is 98.5% for that month.
Annual contracts hide churn until renewal, so compute their retention on the contracts that came up for renewal in the period. Mixing them with the whole base makes the figure look better than it is.
Published averages rarely match your market, your price point or your contract length, and I would not grade anyone on them. Judge retention against three things: your older cohorts, your other segments, and your CAC payback. If customers leave before they have paid back their acquisition cost, you have your answer.
Build the cohort table
This query assumes a subscriptions table with one row per subscription. It groups accounts by their first month as a customer and counts how many are still active at the end of each following month, keeping only complete months.
WITH customers AS (
SELECT
account_id,
date_trunc('month', min(started_at)) AS cohort_month,
CASE WHEN bool_or(ended_at IS NULL) THEN NULL
ELSE max(ended_at) END AS churned_at
FROM subscriptions
GROUP BY account_id
),
offsets AS (
SELECT generate_series(0, 18) AS month_n
)
SELECT
c.cohort_month,
o.month_n,
count(*) AS cohort_size,
count(*) FILTER (
WHERE c.churned_at IS NULL
OR c.churned_at >= c.cohort_month + make_interval(months => o.month_n + 1)
) AS active_accounts
FROM customers c
CROSS JOIN offsets o
WHERE c.cohort_month + make_interval(months => o.month_n + 1)
<= date_trunc('month', now())
GROUP BY 1, 2
ORDER BY 1, 2;
Lay the result out as a triangle of percentages, then read it in both directions.
| Cohort | Month 1 | Month 3 | Month 6 | Month 12 |
|---|---|---|---|---|
| Q1 last year | 94% | 86% | 78% | 71% |
| Q2 last year | 93% | 84% | 74% | 66% |
| Q3 last year | 90% | 79% | 68% | |
| Q4 last year | 88% | 74% |
Reading across shows the shape of the curve. Reading down shows whether you are getting better. In this example each new cohort is weaker than the one before, which usually means acquisition has drifted away from the customers who stay. Run the same table in revenue as well, since a base can lose many small accounts and keep nearly all its money.
Segment until the average breaks
An average retention rate describes nobody. Cut the table by company size, plan, acquisition channel, use case and whether the account activated in its first weeks.
| Segment | Accounts | Still active at 12 months |
|---|---|---|
| 50 to 500 people, activated in week 1 | 180 | 84% |
| 50 to 500 people, not activated in week 1 | 120 | 52% |
| Under 50 people, activated in week 1 | 210 | 58% |
| Under 50 people, not activated in week 1 | 340 | 23% |
A table like this settles several arguments at once. It defines who you should be acquiring, which feeds the ICP chapter, and it shows how much of your churn was decided in the first week, which sends you back to activation.
Sort churn by type
Each kind of departure has a different owner and a different fix, so tag every lost account from the last twelve months.
| Type | How to recognize it | Where the fix sits |
|---|---|---|
| Involuntary | Failed payment, no cancellation request | Dunning, card updates, payment reminders |
| Early | Leaves within the first months, little usage | Onboarding and promise made at signup |
| Wrong fit | Outside the target from day one | Acquisition and qualification |
| Value decay | Usage declines over several months | Product, customer success |
| Champion left | Main user departs, usage stops | Multi-user adoption, handover process |
| Project ended | One-off need, job done | Pricing model, a lighter plan to stay on |
| Competitor | Named alternative, feature or price gap | Product, positioning |
| Business closed | Company shut down or was acquired | Exclude from the fix list |
Start with involuntary churn. It requires no change of mind from anyone, and fixing it is usually a matter of settings and emails.
Get the real reasons
Cancellation surveys give you the polite version: “too expensive” and “not using it enough” often cover a missing outcome or a departed champion. Interview eight to ten accounts that left in the last few months, and read their usage, tickets and CRM notes first, so you can question the story.
- What were you trying to get done when you signed up?
- When did you first think about stopping, and what had just happened?
- Who took the decision, and who was consulted?
- What are you using now, and what does it do better?
- What would have had to be true for you to stay?
Interview a few of your best customers with the same questions, since what keeps them is often the sharpest material you will get for positioning. Then code the answers into a grid, with the stated reason next to the real one.
| Account | Stated reason | Real reason | Type | Preventable? | Signal available before leaving |
|---|---|---|---|---|---|
| Example A | Too expensive | Only one user, never rolled out | Value decay | Yes | One active seat for 90 days |
| Example B | Not using it | Sales manager left | Champion left | Partly | Admin inactive for 30 days |
The last column turns the interviews into a system. Signals that appear before departures can be turned into a health score and an alert for customer success.
Price what retention is worth and deliver
Simple LTV is monthly margin per customer divided by monthly churn. At 400 of margin and 2% monthly churn, that is 20,000. At 1.5%, it is 26,667, a third more value per customer with no extra spend on acquisition. Use that number to rank retention against the other opportunities, and take expansion to the monetization chapter.
Deliver the cohort tables, the segmented view, the tagged list of lost accounts, the interview grid and an action list where each item names the churn type it targets.
Your next step: export twelve months of cancellations, tag each one with a type from the table above, and book your first three interviews with customers who left recently.