Cohort Analysis
Upstream: Martech Stack & Automation — instrumentation, tooling, and data plumbing. This page covers measurement execution.
The decision this page enables: whether each month’s acquired users are as good as last month’s — not just whether you acquired more of them.
What cohort analysis is (and why it matters)
Section titled “What cohort analysis is (and why it matters)”A cohort is a group of users or customers who share a start event in the same time window — usually signup week or signup month. Cohort analysis tracks how that group behaves over time: Do they come back? Do they pay? Do they expand?
Aggregate metrics lie. If you grow signups 40% but the new cohort retains 30% worse than last quarter, headline growth hides a quality problem. Cohort analysis is how Marketing catches channel decay, campaign fatigue, and activation regressions before they show up in churn.
Use cohort analysis when:
- CAC looks fine but revenue per cohort is falling.
- You launched a new channel and need to compare 12-month quality, not 7-day conversion.
- Product changed onboarding and you need before/after retention proof.
Core concepts
Section titled “Core concepts”Cohort table vs retention curve
Section titled “Cohort table vs retention curve”| Artifact | What it shows | Best for |
|---|---|---|
| Cohort table | Grid: rows = signup period, columns = period since signup (Week 0, 1, 2…), cells = % still active or paying | Spotting which vintage degraded; exporting to board decks |
| Retention curve | Line chart: x = time since signup, y = % retained; one line per cohort or aggregated | Visual diagnosis of flattening vs decay |
| Activation cohort | Same structure but cohort start = first activation event instead of signup | Separating acquisition quality from activation quality |
flowchart LR
raw["Raw events<br/>signup, session, payment"]
table["Cohort table<br/>rows = vintage, cols = period"]
curve["Retention curve<br/>lines = cohorts over time"]
raw --> table --> curve
table --> diag["Diagnostic:<br/>which vintage broke?"]
curve --> diag
Retention types
Section titled “Retention types”- Usage retention — % of cohort with ≥1 session (or core action) in period N. Marketing cares when usage predicts upgrade.
- Revenue retention — % of cohort still paying in period N. Stronger signal for subscription businesses.
- Logo retention (B2B) — % of accounts still active. Pair with seat retention inside accounts.
NRR and NDR from a marketing lens
Section titled “NRR and NDR from a marketing lens”Net Revenue Retention (NRR) and Net Dollar Retention (NDR) are usually reported company-wide, but Marketing should slice them by acquisition cohort and acquisition channel:
- NRR by signup vintage — did the customers we acquired in Q1 expand or contract over 12 months?
- NRR by channel — paid social cohorts vs. organic vs. referral; which source produces expanders?
Marketing doesn’t own NRR operationally (CS and Product do), but Marketing owns the quality of who enters the cohort. If paid search cohorts show 95% gross retention but 80% NRR while organic shows 110% NRR, reallocate budget.
NRR formula (account-level, 12-month window):
NRR = (Starting MRR from cohort + Expansion − Contraction − Churn) ÷ Starting MRR × 100Marketing slices to request from Finance or RevOps:
| Slice | Question |
|---|---|
| NRR by signup quarter | Are newer vintages worse expanders? |
| NRR by first-touch channel | Which acquisition source brings expanders? |
| NRR by initial plan tier | Did freemium produce lower-NRR logos than trial? |
| Gross retention vs NRR gap | Is churn the problem or lack of expansion? |
Target: best channel NRR ≥105% at 12 months for B2B SaaS; ≥95% for B2C subscription.
Revenue cohort table (companion to usage cohort)
Section titled “Revenue cohort table (companion to usage cohort)”Usage retention tells you engagement; revenue retention tells you money. Build both.
| Signup month | M0 revenue | M1 | M2 | M3 | M6 | M12 | M12 NRR ||--------------|------------|----|----|----|----|-----|---------|| Jan 2026 | $10,000 | 92%| 88%| 85%| 82%| 78% | 98% || Feb 2026 | $12,400 | 94%| 90%| 87%| | | |Cell values = % of M0 revenue retained (not % of customers). A cohort can retain users but lose revenue if downgrades dominate — common in PLG when free tier absorbs inactive paid users.
Activation cohort comparison
Section titled “Activation cohort comparison”Signup cohorts conflate top-of-funnel quality with onboarding effectiveness. Activation cohorts fix that:
- Signup cohort: users grouped by
signup_date. - Activation cohort: users grouped by
first_workout_completed_dateorfirst_doc_created_date.
If signup cohorts look bad but activation cohorts look good, acquisition is fine — activation is the bottleneck. If both look bad, the channel is sending the wrong users.
How to do it (step by step)
Section titled “How to do it (step by step)”- Pick the cohort anchor event. Default: signup date. Alternative: first payment, first activation. Document one primary anchor; don’t switch mid-analysis.
- Pick the retention event. One core action that defines “still engaged” — e.g.,
session_start,workout_completed,doc_edited. Avoid vanity events (page view). - Choose period grain. Weekly for first 12 weeks (fast feedback); monthly for 12–24 month LTV views.
- Build the cohort table in product analytics or SQL. Rows = signup week; columns = Week 0, 1, 2…; cell =
% of cohort with retention event in that week. - Plot retention curves. Overlay last 6–8 cohorts. Look for parallel lines (healthy) vs. fanning down (quality decay).
- Segment cohorts. Break by channel, campaign, geography, plan type. Compare curves, not just Week-4 point estimates.
- Connect to revenue. Join cohort table to payment events for revenue retention and simple LTV-by-vintage estimates.
- Review monthly in growth meeting. Assign owners when a vintage underperforms by >5 pts at Week 4.
Reading a retention curve — four patterns
Section titled “Reading a retention curve — four patterns”flowchart TD
subgraph patterns["Retention curve shapes"]
flat["Flattening<br/>drops then levels — healthy"]
cliff["Cliff<br/>>40% drop W0→W1 — broken onboarding"]
slow["Slow decay<br/>steady decline — needs habit loop"]
smile["Smiling<br/>newer cohorts above older — shipping works"]
end
| Pattern | What it looks like | Likely cause | First action |
|---|---|---|---|
| Flattening | Steep drop W0–W2, then flat 15–25% | Normal; optimize from flat line upward | Improve Week-1 habit triggers |
| Cliff | >40% gone after Week 1 | Onboarding failure or wrong audience | Place: Logistics friction audit |
| Slow decay | Linear slide, no flatten by W8 | Weak core loop | Product engagement work; lifecycle emails secondary |
| Smiling | March cohort > February > January | Recent fix working | Document what changed; protect the change |
| Frowning | May cohort < April < March | Acquisition quality decay | Pause worst channel; check creative/message fit |
Minimum cohort size rule
Section titled “Minimum cohort size rule”Before acting on a cohort delta, check sample size:
Approximate margin of error at 95% confidence ≈ 1.96 × sqrt(p × (1-p) / n)
Example: 35% retention, n=200 → MoE ≈ ±6.6 pts 35% retention, n=80 → MoE ≈ ±10.4 pts (too noisy to reallocate spend)Rule: n ≥ 100 per cohort before channel budget decisions; n ≥ 300 before killing a channel entirely.
Templates
Section titled “Templates”Cohort table (copy-paste structure)
Section titled “Cohort table (copy-paste structure)”Metric: [% with ≥1 core action in period | % still paying]Anchor: [signup date | activation date]Grain: [weekly | monthly]Segment: [all | channel = ___ | campaign = ___]
| Cohort (signup week) | Week 0 | Week 1 | Week 2 | Week 3 | Week 4 | Week 8 | Week 12 ||----------------------|--------|--------|--------|--------|--------|--------|---------|| 2026-W18 (Apr 28) | 100% | ___% | ___% | ___% | ___% | ___% | ___% || 2026-W19 (May 5) | 100% | ___% | ___% | ___% | ___% | | || 2026-W20 (May 12) | 100% | ___% | ___% | | | | || 2026-W21 (May 19) | 100% | ___% | | | | | |
Benchmark row (trailing 90d avg at Week 4): ___%Alert threshold: Week 4 ≥5 pts below benchmark → investigateRetention-curve diagnostic worksheet
Section titled “Retention-curve diagnostic worksheet”Analysis date: [YYYY-MM-DD]Product / segment: [e.g., fitness app — iOS US]Retention event: [e.g., workout_completed]Periods shown: [Week 0–12]
1. Shape classification (check one): [ ] Flattening — curve levels off at ≥___% by Week ___ (healthy) [ ] Slow decay — steady linear drop (acceptable if flatten expected later) [ ] Cliff — >50% drop Week 0→1 (onboarding or targeting failure) [ ] Smiling — later cohorts outperform earlier (improvement working) [ ] Frowning — later cohorts underperform (quality decay — URGENT)
2. Cohort comparison (Week 4 retention): Best recent cohort: [W___] at ___% Worst recent cohort: [W___] at ___% Spread: ___ pts
3. Segment drill (Week 4): Organic: ___% Paid social: ___% Referral: ___% Largest gap: [channel] vs [channel] = ___ pts
4. Hypothesis: [e.g., "Meta campaign W20 drove low-intent installs; creative promised weight loss in 7 days"]
5. Action: Owner: [name] | Due: [date] | Action: [pause campaign / fix onboarding / tighten targeting]Activation-cohort comparison worksheet
Section titled “Activation-cohort comparison worksheet”Purpose: Separate acquisition quality from activation/onboarding quality.
Signup cohort anchor: [signup_date]Activation cohort anchor: [first_completed_workout_date | first_doc_created_date]Activation definition: [specific event + threshold]
| Comparison | Signup cohort W4 retention | Activation cohort W4 retention | Gap | Interpretation ||------------|---------------------------|-------------------------------|-----|----------------|| All users | ___% | ___% | ___ | || Channel A | ___% | ___% | ___ | || Channel B | ___% | ___% | ___ | |
Decision rules:- Signup bad, activation good → fix acquisition targeting or messaging- Signup good, activation bad → fix onboarding / TTFV (see Place: Logistics)- Both bad → channel-quality problem; pause spend- Both good → scale channelMetrics to track
Section titled “Metrics to track”| Metric | Target (B2B SaaS) | Target (B2C subscription) | Notes |
|---|---|---|---|
| Week-1 retention (signup cohort) | 40–60% | 35–55% | Below 30% → onboarding or targeting issue |
| Week-4 retention (signup cohort) | 25–40% | 20–35% | Primary marketing health signal |
| Week-12 retention | 15–25% | 12–22% | Compare to Week-4 ratio; should flatten |
| D30 revenue retention | 70–85% of first-month payers | 65–80% | Trial-to-paid cohorts only |
| NRR by acquisition channel (12mo) | ≥100% for best channel | ≥95% minimum | Below 90% → stop scaling that channel |
| Cohort LTV/CAC ratio (6mo vintage) | ≥3× | ≥2.5× | Use same vintage for LTV and CAC numerator |
| Activation cohort vs signup cohort gap (W4) | <10 pts | <10 pts | Larger gap → activation bottleneck |
| Cohort payback period | ≤12 months | ≤8 months | By channel, not blended |
Worked examples
Section titled “Worked examples”SaaS workspace (B2B)
Section titled “SaaS workspace (B2B)”Setup: Cohort anchor = workspace created (signup). Retention event = doc_edited or comment_posted in week N. Segment by acquisition channel.
Cohort table excerpt (Week 4 usage retention):
| Signup month | Organic | Paid search | Product-led referral |
|---|---|---|---|
| Feb 2026 | 38% | 31% | 52% |
| Mar 2026 | 36% | 28% | 50% |
| Apr 2026 | 34% | 22% | 48% |
Diagnosis: Paid search Week-4 retention dropped 9 pts over three months while organic held steady. Investigation showed new search ads drove traffic to a generic “productivity” landing page, not the team-workspace message. Activation cohort comparison confirmed signup and activation cohorts both degraded for paid search — acquisition quality problem, not onboarding.
NRR by channel (12-month, customers acquired in 2025):
| Channel | Gross retention | NRR |
|---|---|---|
| Referral | 92% | 112% |
| Organic | 88% | 105% |
| Paid search | 79% | 94% |
Action: Cut paid search budget 30%; reinvest in referral program and content. Set alert: any channel with Week-4 retention <25% for two consecutive cohorts triggers automatic spend review.
Consumer fitness app (B2C)
Section titled “Consumer fitness app (B2C)”Setup: Cohort anchor = install date. Retention event = workout_completed in week N. Revenue retention tracked separately on trial-start cohorts.
Retention curve read:
- Feb installs: Week-1 = 48%, Week-4 = 28%, curve flattens ~22% by Week-12. Healthy smiling curve after onboarding redesign in January.
- May installs: Week-1 = 41%, Week-4 = 19%. Frowning — newer cohorts worse.
Activation cohort comparison:
| Metric | Signup cohort W4 | Activation cohort W4 |
|---|---|---|
| Instagram paid | 19% | 34% |
| App Store organic | 31% | 42% |
Instagram paid signup cohort looks terrible, but users who complete one workout retain similarly to organic. Problem: only 28% of Instagram installs complete workout 1 vs. 55% organic. Fix creative-to-onboarding promise alignment, not retention emails.
Revenue retention (trial-start cohorts, D30 still paying):
| Trial start month | D30 paid retention |
|---|---|
| Mar 2026 | 71% |
| Apr 2026 | 68% |
| May 2026 | 61% |
Marketing partners with Product on Day-0–3 lifecycle. Cohort table shared weekly in growth standup.
Revenue cohort detail (trial-start, D30 paid retention by channel):
| Channel | Trials Mar | D30 paid | D30 % | 6mo LTV/CAC |
|---|---|---|---|---|
| App Store organic | 2,400 | 1,680 | 70% | 2.4× |
| Meta Ads | 1,800 | 1,044 | 58% | 1.6× |
| Influencer coded | 620 | 465 | 75% | 2.8× |
Meta underperforms on both retention and unit economics — consistent story across usage and revenue cohorts.
Common pitfalls
Section titled “Common pitfalls”- Cohort size too small. Weekly cohorts with <100 users produce noisy percentages. Aggregate to monthly or use confidence intervals.
- Changing the retention event. Switching from
sessiontocore actionresets all baselines. Pick one event and hold it. - Ignoring seasonality. B2C fitness apps see January cohorts behave differently from July. Compare year-over-year, not just month-over-month.
- Signup-only view. Always run activation cohort comparison when Week-1 retention cliffs — otherwise you misdiagnose onboarding as channel quality.
- Blended cohort LTV. Averaging LTV across channels hides that one channel’s cohort never pays back. Always segment.
- Peeking at Week-1 only. Early retention can look fine while Week-8 collapses. Review at least through Week-4 and Week-12 monthly.
- NRR without vintage slice. Company-wide NRR masks that last quarter’s paid cohorts are dragging the number down.
Tools / further reading
Section titled “Tools / further reading”- Product analytics: Amplitude (Retention chart), Mixpanel (Insights), PostHog (Lifecycle), Heap (automatic capture).
- Warehouse SQL: BigQuery / Snowflake + dbt for cohort tables with custom segments.
- BI: Looker, Hex, Mode — board-ready cohort heatmaps.
- Mobile: Firebase, Adjust — install cohorts with channel attribution.
- Canonical read: Lean Analytics ( Croll & Yoskovitz ) — cohort chapters; Amplitude’s Retention Playbook (free).
Cross-links
Section titled “Cross-links”- Funnel: Retention — engagement and churn signals from a marketing lens.
- Funnel: Overview — where cohort analysis fits in A→C→R.
- ROI / ROAS — LTV and payback by cohort vintage.
- Place: Logistics — activation and TTFV when activation cohorts lag signup cohorts.
- Customer Success: Retention — post-sale programs that influence cohort NRR.
- Martech Stack & Automation — event taxonomy that makes cohort tables trustworthy.