Audit retention

Cohorts, churn and the real reasons people leave.

Stone viaduct reflected in still water

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.

Old stone arch over a mountain stream

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.

Old stone bridge in a river town

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.