Back to blog
Market

Cohort Analysis for Retention: Reading the Curve, Not the Average

6 min read

A single retention number — "we retain 85% of users" — is close to meaningless. It blends loyal customers who have been paying for two years with last week's discount-driven signups who churn in 30 days. Cohort analysis fixes this by grouping users by when they arrived and tracking what fraction of each group is still active N periods later. Done right, it is the single most diagnostic metric a subscription business has. Done wrong — small samples, no segmentation, blended cohorts — it produces confident-looking charts that say nothing true.

What cohort retention analysis actually measures

A cohort is a group of users who share a start event, almost always signup month or week. Retention analysis then tracks, for each cohort, what percentage is still active at period 1, period 2, period 3, and so on. The output is usually a triangular grid: rows are cohorts, columns are periods since signup, and each cell is a retention percentage (Count.co).

The core SQL pattern is consistent across tools: assign each user to a cohort (DATE_TRUNC on signup date), compute a period offset for each activity event relative to that cohort's start, then divide active users in each period by the cohort's period-0 size, often with a window function like active_users * 100.0 / FIRST_VALUE(active_users) OVER (PARTITION BY cohort_month ORDER BY period_number) (StrataScratch, Sqlism).

-- period offset per user activity event
WITH cohorts AS (
  SELECT user_id, DATE_TRUNC('month', MIN(created_at)) AS cohort_month
  FROM events
  GROUP BY user_id
),
activity AS (
  SELECT e.user_id, c.cohort_month,
         DATE_TRUNC('month', e.created_at) AS activity_month
  FROM events e
  JOIN cohorts c USING (user_id)
),
periods AS (
  SELECT cohort_month,
         DATEDIFF('month', cohort_month, activity_month) AS period_number,
         COUNT(DISTINCT user_id) AS active_users
  FROM activity
  GROUP BY 1, 2
)
SELECT cohort_month, period_number,
       active_users * 100.0 / FIRST_VALUE(active_users)
         OVER (PARTITION BY cohort_month ORDER BY period_number) AS retention_pct
FROM periods
ORDER BY cohort_month, period_number;

Monthly cohorts are the standard grain for B2B SaaS because they smooth day-to-day noise; weekly cohorts suit high-frequency consumer apps where a month is too coarse to see anything (PopSQL).

Why blended averages lie

A blended retention number mixes loyalists with last month's discount-driven signups and hides every real trend underneath (TryPropel). If you acquired 500 users in January through organic search and 500 in February through a 50%-off promo, blending their retention into one "January+February cohort" number tells you nothing about either acquisition channel's actual quality. The fix is always to keep cohorts separate and compare curves, not single points.

Warning

A cohort of fewer than 30 accounts produces a noisy curve that looks like a signal but isn't. Don't draw conclusions from small early cohorts, and don't panic over a single bad month with low volume (Userpilot).

Benchmarks by business model

Retention curves differ enormously by category, and comparing your SaaS product to an e-commerce benchmark (or vice versa) produces false alarms in either direction.

Model Typical curve shape Key benchmark
B2B SaaS (contractual) Steep early drop, then flattens ~46.9% retained after month 1; contractual retention bottoms near 71% by month 12, flattening to ~64% by month 24 (Userpilot, Livmo)
E-commerce (non-contractual) Collapses fast, no floor 52% repeat by month 3, ~28% by month 12 (TryPropel)
DTC subscription (consumables) Cliff at first repeat, then sticky Once a customer buys twice, 85–90% retention from that point forward (TryPropel)
SaaS net revenue retention Can exceed 100% via expansion Median NRR drifted from ~105% (2021) to ~101% (2024) (Livmo)

An 84% logo retention rate is generally considered good for early-stage or mid-market SaaS (Alexander Jarvis). Median annual subscriber churn across the Recurly network ranges from 3.22% for SaaS up to 4.99% for education products, underscoring that "good retention" is category-relative, not absolute (TryPropel).

The 2026 problem: AI tourists inflate early cohorts

AI-assisted onboarding — chat-driven signup flows, AI copilots that let a curious visitor "try it in two clicks" — has created a new distortion: cohorts inflated by users who sign up out of curiosity, poke around once, and never return. This drags down month-0 and month-1 retention numbers without reflecting genuine product-market mismatch (Userpilot).

The practical fix from the same source: measure month-12 retention against a month-3 baseline instead of month-0. By month 3, most of this tourist churn has already cleared out of the cohort, so the remaining curve reflects users who made a real decision to stay.

Segmenting cohorts to find the real signal

Aggregate retention curves tell you that something is wrong; segmentation tells you what. Break cohorts down by:

  • Acquisition source/campaign — if all channels weaken simultaneously, suspect the product or a pricing change; if one channel underperforms while others hold steady, the problem is acquisition quality, not the product (Userpilot)
  • Activation behavior — did the user complete a key setup action in the first session? Cohorts split by activation status routinely show 2–3x retention gaps
  • Plan tier — enterprise and self-serve cohorts should never be blended; their retention dynamics (and the actions that fix them) are unrelated
  • Time period, year-over-year — compare the same calendar periods across years and annotate holidays, campaign bursts, and launches so a seasonal dip isn't misread as product failure (Userpilot)

From analysis to action: what moves the curve

Cohort analysis is diagnostic, not prescriptive — it tells you where the leak is, not how to patch it. In practice, the biggest curve-shape changes come from three levers:

  1. Activation redesign. Moving a key "aha moment" earlier in onboarding is the single most common fix for a steep month-0-to-month-1 drop.
  2. Second-purchase/second-session incentives. For non-contractual and DTC models, the jump from first-to-second purchase is the pivotal moment — once crossed, retention stabilizes sharply (the 85–90% figure above) (TryPropel).
  3. Expansion revenue for the retained base. In SaaS, once logo churn is under control, NRR above 100% comes from upsell/cross-sell into the surviving cohort, not from acquiring new logos (Livmo).

Tooling notes

You don't need a dedicated analytics platform to start — the SQL pattern above runs in any warehouse (BigQuery, Snowflake, Postgres) against a raw events table. Purpose-built tools (Amplitude, Mixpanel, Count.co, Cube) add cohort-grid visualization and segmentation UI on top of the same underlying query, which is worth adopting once you're running this analysis weekly rather than ad hoc (Cube).

Actionable takeaway

Stop reporting a single retention percentage. Build the cohort grid, keep cohorts separate by acquisition source and month, require a minimum cohort size of 30 before drawing conclusions, and — for 2026 specifically — anchor your "true" retention baseline at month 3 rather than month 0 to filter out AI-driven tourist signups. If your month-3-to-month-12 curve is flattening above your category benchmark, your product has found its retained core; if it's still sloping down, the leak is still open and segmentation by source and activation status is where to look next.


Sources: Userpilot, Stripe, Alexander Jarvis, Livmo, TryPropel, Count.co, StrataScratch, Sqlism, PopSQL, Cube

Get new posts as they publish

No spam — just the next post, straight to your inbox.

Keep reading

Discussion