Your dashboard says retention is 32%. Product asks: “Is that better than last month?” You shrug. Half of “active users” signed up this week. Half signed up two years ago during a conference promo that never repeated. Averaging them is like averaging the height of toddlers and adults and calling it the company’s height.
Cohorts fix that habit. You group customers by a shared starting moment (signup week, first purchase month, first activate day), then track what they do later along a clock that starts at zero for each group. Retention curves, pay-down curves, and expansion curves become comparable. Customer analytics stops being a blender.
This is Part 3 of Customer analytics basics. Part 1 set product-shaped funnel stages. Part 2 fixed conversion math. Here we follow people over time after they enter. Pair with the metrics series for definition discipline and Learn for the wider map.
What you’ll learn
- What a cohort is (and is not)
- The flow: signup week → activity later → retention curve → compare cohorts
- How to read a retention grid without fooling yourself
- Acquisition vs behavioral cohorts, and B2B account cohorts
- A worked toy grid, SQL sketch, mistakes, and practice
Cohort means shared start, shared clock
A cohort is a set of actors who share an origin event in a time bucket. Classic: all users with account_created in the week of Jan 6. Their “week 0” is that signup week. “Week 4 retention” means they were active in the fourth week after signup, not “active in calendar week 4 of the year.”
That relative clock is the whole point. Calendar MAU mixes ages. Cohort retention compares like with like: how Jan signups behave at the same age as Feb signups.
The idea in four steps

- Signup week (or origin bucket): assign each user a cohort_id from the origin event.
- Activity later: define what counts as retained (session, key action, paid status).
- Retention curve: for each age (W1, W4, W8…), compute active / cohort size.
- Compare cohorts: did Feb’s curve sit above Jan’s after a product change?
Origin is not always signup. First purchase cohorts matter for commerce. First activate cohorts matter when signup is cheap and value is not. First paid cohorts matter for churn after revenue starts. Name the origin in the metric title: signup_cohort_w4_retention, not generic “retention.”
Reading a retention grid
Grids put cohort labels on rows and age buckets on columns. Cells are percentages of the original cohort still active (or still paid) at that age. Toy example:

| Cohort | W1 | W4 | W8 |
|---|---|---|---|
| Jan | 100% | 40% | 28% |
| Feb | 100% | 44% | 30% |
How to read it without storytelling malpractice:
- W1 at 100% often means “active in week of signup” by construction if signup implies activity. Sometimes W0 is signup week and W1 is the next week. Label axes.
- Compare same column across rows to judge cohort quality over time (Feb vs Jan at W4).
- Compare across columns within a row to see decay shape (steep drop early vs slow bleed).
- Do not compare Jan’s W8 (mature) to Feb’s W4 (younger age) as if they were the same milestone.
- Incomplete cells for recent cohorts should be blank or marked immature, not zero.
In the toy grid, Feb is slightly healthier at W4 and W8. That may be product, seasonality, channel mix, or noise. Cohorts reduce age bias; they do not remove causal humility.
Define “active” like an adult
Retention is only as good as the activity definition:
- Any session: easy, often inflated by push notifications and accidental opens.
- Key action: aligned with activation from Part 1; better product signal.
- Paid retained: still subscribed / not churned; finance-relevant.
- Revenue retained: still paying above a threshold (expansion/contraction aware).
Pick one primary retention definition for the company narrative. Keep others as secondary. Five “retention” charts with five meanings is how leadership loses trust in the word.
Acquisition cohorts vs behavioral cohorts
Acquisition cohorts use origin = first touch or signup time. Great for channel quality and onboarding changes.
Behavioral cohorts use origin = did a thing (first project created, first invite). Great for understanding users who reached a milestone, not for “is paid marketing better?” unless you carefully bridge back to acquisition.
Do not mix them in one unlabeled chart. “Users who invited a teammate retain at 70%” is not comparable to “all signups retain at 30%” as a channel score.
B2B and account-level cohorts
For multi-seat products, account cohorts often matter more than user cohorts. An account that signed in January may add seats in March; user-level signup cohorts will miss expansion. Define:
- Account origin date (first paid invoice? first seat activated? opportunity close?).
- Retained meaning (still paid, seats ≥ 1 active, usage above threshold).
- Whether logos or ARR weighted retention is the headline.
Logo retention can look fine while NRR (net revenue retention) tells a different story. Both are cohort ideas with different success definitions. Label them.
Worked example: notes app signup cohorts
Using the SaaS from Part 1. Origin: account_created week. Active: at least one note_created or note_edited in the age week. Cohort size is users who signed up that week after filters.
Toy sizes: Jan week cohort N = 2,000; Feb week cohort N = 2,200. Activity counts produce the percentages in the grid above (Jan W4 = 800 actives → 40%; Feb W4 = 968 → 44%).
-- Weekly signup cohort retention sketch
-- age_week 0 = week of signup; 1 = next week, etc.
WITH signups AS (
SELECT
user_id,
date_trunc('week', account_created_at) AS cohort_week,
account_created_at
FROM analytics.user_signups
WHERE is_employee = FALSE
),
activity AS (
SELECT
user_id,
date_trunc('week', event_at) AS activity_week
FROM analytics.events
WHERE event_name IN ('note_created', 'note_edited')
GROUP BY 1, 2
),
aged AS (
SELECT
s.cohort_week,
s.user_id,
CAST(
date_diff('week', s.cohort_week, a.activity_week)
AS INTEGER
) AS age_week
FROM signups s
JOIN activity a ON a.user_id = s.user_id
WHERE a.activity_week >= s.cohort_week
)
SELECT
cohort_week,
age_week,
COUNT(DISTINCT user_id) * 1.0
/ MAX(cohort_size) AS retention_rate
FROM aged
JOIN (
SELECT cohort_week, COUNT(*) AS cohort_size
FROM signups
GROUP BY 1
) c USING (cohort_week)
WHERE age_week IN (0, 1, 4, 8)
GROUP BY 1, 2
ORDER BY 1, 2;Dialect functions vary (BigQuery, Snowflake, DuckDB). The logic does not: origin bucket, age in periods, distinct actives over original size. When assistants write the SQL, verify age calculation and immature cohorts. See How to check AI-written SQL.
Curves beat single-number retention
A single “retention = 32%” without age is incomplete. Prefer:
- W1, W4, W8 (or D1, D7, D30) as a small set of headline ages.
- Full curves for deep dives.
- Segment overlays (channel, platform) as secondary, pre-registered when used for ship decisions.
Early steep drop often means activation failure (Part 1). Parallel curves that sit higher after a feature launch may mean better onboarding. Curves that start fine then dive at day 30 may mean billing or notification debt. The shape is the diagnosis hint; the experiment is still how you confirm causes (Experimentation culture series).
Seasonality, mix shifts, and false victories
February cohorts may retain better because of seasonality, not because of your redesign. Channel mix shifts (more brand, less paid social) can move cohort quality without product changes. Always ask: what else changed in acquisition when the curve moved?
Also watch survivor bias in “power user cohorts.” Studying only users who reached month 6 tells you about survivors, not about typical signups.
Rolling retention, classic retention, range retention
Tooling vendors use different counting rules:
- Classic N-day: active on exactly day N (strict).
- Unbounded / “on or after”: sometimes used; can inflate late ages.
- Range: active any day in days 7-13 for “week 2.”
- Bracket / rolling: platform-specific; read the docs before comparing to warehouse SQL.
If BI says 40% and SQL says 36%, first diff the counting rule, not the philosophy of the company.
Common mistakes
- Calendar retention labeled as cohort retention.
- Comparing immature cells to mature cells.
- Tiny cohorts (N = 40) narrated like strategy truth.
- Changing “active” definition mid-year without versioning.
- User cohorts for account revenue stories without a bridge.
- Chasing one lucky week cohort instead of a run of weeks.
- Ignoring reinstalls and identity merges that duplicate origins.
Linking cohorts back to funnels and conversion
Cohorts do not replace funnels. Funnels show step friction for a flow. Cohorts show whether people who entered keep showing up and paying. A healthy Activate step with weak W8 retention means you taught people to start, not to stay. A weak Signup step with strong retention among those who make it may mean acquisition targeting or signup UX is the constraint, not the core product loop.
In practice, put one funnel card and one cohort curve on the same one-pager for product reviews. Same week’s acquisition story, same definitions family, two time orientations: path and age.
How to practice this week
- Write your primary origin event and primary “active” event in one sentence each.
- Build a 2-cohort by 3-age toy grid from real data (even if N is small).
- Mark which cells are immature today.
- Compare warehouse numbers to your product analytics tool for one cell; document the counting rule gap.
- Present one curve shape insight to a partner (“early drop” vs “late drop”) without claiming causality.
Quick recap
Cohorts give customers a shared start and a shared clock. Retention grids compare ages honestly. Define origin, active, and maturity. Curves and step ages beat a single blended percentage. This closes Customer analytics basics: stages, conversion math, and time-based cohorts so customer numbers mean the same thing on Monday and on the board deck.
Sources
- Croll and Yoskovitz, Lean Analytics (retention and cohort thinking by model): https://leananalyticsbook.com/
- Amplitude Docs on retention analysis and cohort charts: https://help.amplitude.com/hc/en-us/articles/230403947-Retention-Analysis
- Mixpanel Docs on retention: https://docs.mixpanel.com/docs/reports/retention
- Reforge blog on retention and engagement (practical product analytics essays): https://www.reforge.com/blog
- Google HEART paper (experience quality alongside retention-style measures): https://research.google/pubs/pub36299/
