Skip to content

Cohort Analysis

First PublishedByAtif Alam

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.
ArtifactWhat it showsBest for
Cohort tableGrid: rows = signup period, columns = period since signup (Week 0, 1, 2…), cells = % still active or payingSpotting which vintage degraded; exporting to board decks
Retention curveLine chart: x = time since signup, y = % retained; one line per cohort or aggregatedVisual diagnosis of flattening vs decay
Activation cohortSame structure but cohort start = first activation event instead of signupSeparating 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
  • 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.

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 × 100

Marketing slices to request from Finance or RevOps:

SliceQuestion
NRR by signup quarterAre newer vintages worse expanders?
NRR by first-touch channelWhich acquisition source brings expanders?
NRR by initial plan tierDid freemium produce lower-NRR logos than trial?
Gross retention vs NRR gapIs 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.

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_date or first_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.

  1. Pick the cohort anchor event. Default: signup date. Alternative: first payment, first activation. Document one primary anchor; don’t switch mid-analysis.
  2. Pick the retention event. One core action that defines “still engaged” — e.g., session_start, workout_completed, doc_edited. Avoid vanity events (page view).
  3. Choose period grain. Weekly for first 12 weeks (fast feedback); monthly for 12–24 month LTV views.
  4. 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.
  5. Plot retention curves. Overlay last 6–8 cohorts. Look for parallel lines (healthy) vs. fanning down (quality decay).
  6. Segment cohorts. Break by channel, campaign, geography, plan type. Compare curves, not just Week-4 point estimates.
  7. Connect to revenue. Join cohort table to payment events for revenue retention and simple LTV-by-vintage estimates.
  8. 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
PatternWhat it looks likeLikely causeFirst action
FlatteningSteep drop W0–W2, then flat 15–25%Normal; optimize from flat line upwardImprove Week-1 habit triggers
Cliff>40% gone after Week 1Onboarding failure or wrong audiencePlace: Logistics friction audit
Slow decayLinear slide, no flatten by W8Weak core loopProduct engagement work; lifecycle emails secondary
SmilingMarch cohort > February > JanuaryRecent fix workingDocument what changed; protect the change
FrowningMay cohort < April < MarchAcquisition quality decayPause worst channel; check creative/message fit

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.

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 → investigate
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]
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 channel
MetricTarget (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 retention15–25%12–22%Compare to Week-4 ratio; should flatten
D30 revenue retention70–85% of first-month payers65–80%Trial-to-paid cohorts only
NRR by acquisition channel (12mo)≥100% for best channel≥95% minimumBelow 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 ptsLarger gap → activation bottleneck
Cohort payback period≤12 months≤8 monthsBy channel, not blended

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 monthOrganicPaid searchProduct-led referral
Feb 202638%31%52%
Mar 202636%28%50%
Apr 202634%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):

ChannelGross retentionNRR
Referral92%112%
Organic88%105%
Paid search79%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.

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:

MetricSignup cohort W4Activation cohort W4
Instagram paid19%34%
App Store organic31%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 monthD30 paid retention
Mar 202671%
Apr 202668%
May 202661%

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):

ChannelTrials MarD30 paidD30 %6mo LTV/CAC
App Store organic2,4001,68070%2.4×
Meta Ads1,8001,04458%1.6×
Influencer coded62046575%2.8×

Meta underperforms on both retention and unit economics — consistent story across usage and revenue cohorts.

  • 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 session to core action resets 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.
  • 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).