The heatmap is beautiful. Deep green on the left, soft fade to the right, a little annotation that says “retention improving.” Someone zoomed the y-axis so a drop from 42% to 38% looks like a cliff recovery. The newest cohort has twelve customers and a heroic month-one rate. Nobody mentions that the old cohorts used a different “active” definition before the CRM migration. The chart is not neutral. Charts never are. They can still be honest.
This is Part 3 of Finance analytics for non-finance. Part 1 covered ARR and MRR. Part 2 locked churn and retention vocabulary. This part is about drawing cohort retention so the picture matches the definition, the sample size, and the calendar, not the mood of the presenter.
What you’ll learn
- What a cohort retention chart is actually claiming
- Do’s and avoid’s for scales, labels, and mixed definitions
- How incomplete periods and tiny n distort curves and heatmaps
- A worked multi-cohort table you can chart without theater
- A pre-publish checklist for any retention visual in a board or ops pack
What a cohort chart claims
A cohort retention chart groups entities by a shared start event (often first paid month, signup month, or contract start), then measures a retention outcome at later ages (month 0, month 1, month 2, …). The visual might be:
- Lines: one line per cohort, x-axis = age, y-axis = retention rate
- Heatmap: rows = cohort start, columns = age, color = rate
- Bars: retained count or rate at a fixed age across cohorts
Every cell is a ratio or a count under a definition stack from Part 2: who counts, what active means, which window, how you report. The chart does not free you from that stack. It multiplies the cost of getting the stack wrong, because people remember pictures.
Commercial cohorts for finance packs usually mean: accounts that became paying in month M, still paying (or still at least X MRR) at age T. Product activity cohorts (opened the app in week 1) are related science with different denominators. Do not paste product curves into a revenue meeting without a label the size of a billboard.
Rule of thumb: If the chart needs a five-minute verbal footnote to be true, put the footnote on the chart. Voice notes do not travel with the PNG.
Honesty rules for retention charts
Start with a simple do / avoid pair. These are not aesthetic preferences. They are how audiences get misled.

Label the cohort and the outcome
Title patterns that help:
- “Logo retention by first paid month (still paying at month age)”
- “Gross MRR retained from starting cohort MRR by age”
- “Net MRR including expansion for cohorts by first paid month”
If gross and net can both appear in the pack, they need different titles and preferably different colors or chart families so they are not skimmed as twins.
Same y-scale when comparing
Small multiples with different y-ranges are a classic lie engine. If January’s chart runs 0% to 100% and February’s runs 70% to 90%, February looks calmer and “better managed” even when it is worse. Prefer a shared 0% to 100% axis for rate charts unless you have a strong, labeled reason to zoom, and even then show a full-scale inset.
Show n
A cohort of 8 logos can print a 100% month-two retention with one happy path. A cohort of 800 is a different epistemic object. Put n on the legend, as a label at age 0, or in a companion table. Heatmaps without n are fashion, not analysis.
Avoid cut-axis theater
Truncated axes make small moves look existential. Sometimes you need to see a 2-point change. Use a second chart or a table of deltas rather than a single glamour axis that forgets the baseline.
Do not mix definitions across cohorts
If “active” meant “logged in” before May and “paid invoice” after May, you do not have one series. You have a methodology break. Draw a vertical line, split the chart, or recompute history under one definition. Silent breaks are how “retention improved after the reorg” becomes corporate folklore.
Incomplete periods and survivor tricks
The newest cohort has not lived through month 6 yet. If your heatmap colors empty future cells as zero, you invent a death spiral. If you color them the same as “no data” gray without a legend, people still guess wrong. Standard practice: only plot ages the cohort has fully completed under your as-of date. Leave the future blank or hatched.
Another trick: averaging all cohorts’ month-3 rates without weights. A tiny cohort and a huge cohort should not vote equally if you claim a company-level age profile. Prefer weighted averages by cohort size, or show a distribution rather than a single heroic mean.
Currency and expansion create a third trick. Logo retention curves and net MRR retention curves can move in opposite directions. That is allowed by math. It is not allowed to put “retention” in the title without saying which.
Worked example: four cohorts, honest table first
Build the table before the chart. Toy logo retention (still paying) for accounts first paid in each month. Values are retained count / starting count. Incomplete ages are marked n/a, not zero and not a dash glyph that readers might misread.
| Cohort | n | M0 | M1 | M2 | M3 |
|---|---|---|---|---|---|
| Jan | 100 | 100% | 82% | 74% | 70% |
| Feb | 80 | 100% | 80% | 72% | 68% |
| Mar | 90 | 100% | 85% | 76% | n/a |
| Apr | 12 | 100% | 92% | n/a | n/a |
Observations worth putting in prose next to any chart:
- Apr’s 92% M1 looks best and is least trustworthy on n alone.
- Jan and Feb are comparable through M3; Mar is not complete at M3.
- A line chart should not invent Apr M2 by carrying forward or by plotting zero.
SQL sketch for a month-age logo retention spine (toy):
WITH base AS (
SELECT account_id, DATE_TRUNC('month', first_paid_at) AS cohort_month
FROM accounts
WHERE first_paid_at IS NOT NULL
),
aged AS (
SELECT
b.cohort_month,
b.account_id,
DATE_DIFF('month', b.cohort_month, d.month_start) AS age_month,
d.is_paying
FROM base b
JOIN account_month d
ON d.account_id = b.account_id
)
SELECT
cohort_month,
age_month,
COUNT(*) AS accounts_observed,
AVG(CASE WHEN is_paying THEN 1.0 ELSE 0.0 END) AS logo_retention
FROM aged
WHERE age_month >= 0
AND cohort_month + INTERVAL '1' MONTH * age_month
<= DATE '2026-04-30' -- only completed ages
GROUP BY 1, 2
ORDER BY 1, 2;The filter on completed ages is the anti-lie. Adjust to your warehouse dialect. The spirit matters more than the function names: do not compute month-6 retention for a cohort that is only three months old.

Before any retention visual leaves your laptop, run the checklist card: definition linked, sample size noted, period aligned. If any box is empty, the chart is a draft, not a decision tool.
Heatmaps versus lines
Heatmaps are good for scanning many cohorts and ages at once. They are bad at precise comparison of close rates because color bins hide differences. Lines are good for shape and comparison of a few cohorts. They get spaghetti fast. A practical pack often uses:
- A table with n and key ages (M1, M3, M6, M12)
- A line chart of the last six complete cohorts on a shared axis
- Optional heatmap in appendix for the archaeology crowd
Color scales should be monotonic and colorblind-safe. Diverging scales that center on an arbitrary “good” threshold can smuggle a target into the visual. If 70% is the internal target, draw a reference line on a line chart rather than re-binning the heatmap until everything below target looks like a crisis red.
Period alignment and calendar scars
Month-end billing, annual renewals clustered in January, and enterprise procurement cycles create calendar scars. A cohort that starts in December may show weird M1 behavior because of holidays and invoice timing, not product quality. Annotate known scars. Do not “explain” every dip with product narratives if the dip is seasonal cash timing.
Align periods when you compare channels or segments. If self-serve cohorts are monthly and enterprise cohorts are quarterly, say so. Forcing both onto a monthly chart without enough enterprise volume creates noise that looks like insight.
Common mistakes
- Plotting incomplete ages as zero. Invents churn.
- Hiding n. Turns luck into strategy.
- Mixing logo and net revenue curves under one legend color family without labels.
- Changing y-scales across slides in the same deck.
- Comparing pre-migration and post-migration cohorts without a break marker.
- Using a rainbow heatmap that implies ranking the eye cannot decode.
- Averaging unweighted cohort rates and calling it “company retention.”
- Presenting the chart without the Part 2 definition stack in a footnote.
How to practice
- Reproduce one official retention chart from a table with n and completed ages only.
- Redraw it with a forced 0% to 100% y-axis and with n labels. Note what story changes.
- Compute M3 logo retention for the last six complete cohorts. Mark any cohort with n under 30 as low confidence.
- Add a one-sentence definition under the chart that a new hire could understand.
- If you also track product activity retention, place it on a different slide so the meeting cannot blend the two by accident.
That closes Finance analytics for non-finance for this three-part arc: vocabulary for ARR/MRR, definitions for churn and retention, and charts that do not smuggle a narrative past the definition. For more structured learning paths, visit the Learn hub. When metric definitions need the same care as pipelines, revisit the metrics series and data quality series.
Quick recap
- Cohort charts claim a start event, an age, and a retention definition.
- Label cohort, outcome, and n; keep comparable y-scales.
- Do not plot incomplete ages as failure; leave them out or mark n/a.
- Tables before charts catch sample size and methodology breaks early.
- Heatmaps scan; lines compare; both need honest color and axes.
- Run the checklist: definition linked, sample size noted, period aligned.
Sources
- ChartMogul. Cohort analysis and retention reporting guides for subscription businesses. https://blog.chartmogul.com/cohort-analysis/
- Amplitude. “Playbooks: retention” (product-analytics cohort framing; useful contrast with commercial retention). https://amplitude.com/docs/analytics/charts/retention-analysis
- Google. “Data visualization: chart junk and scales” style guidance appears across Material and analytics education posts; see also Few’s principles commonly taught via Stephen Few on chart integrity.
- Paddle. SaaS metrics resources (ties cohort thinking back to MRR movement). https://www.paddle.com/resources/saas-metrics
- Observable / Mike Bostock materials on scales and visual encoding (general viz craft for honest axes). https://observablehq.com/@d3/learn-d3-scales
Keep going
Same lessons in your feed
Short diagrams and hooks on Instagram, X, and Facebook.
