Problem
An overall retention rate mixes people who joined at different times. It can hide whether newer groups are returning more often.
Solution
Group people by when they joined. Give each group a row and each elapsed period a column, showing the share still active in each cell.
Reading across follows one group over time. Reading down compares groups at the same age. Leave future periods clearly unavailable rather than showing them as zero.
Define what counts as active and show each group’s starting size. Use a consistent color scale so differences are comparable. Better retention in a newer group is evidence to investigate, not proof that a particular product change caused it.
Use when
Repeat use matters and people need to compare groups at the same stage after joining.
Don’t use when
The product is genuinely one-and-done, where retention is the wrong question. Also avoid it with small cohorts: a row of forty people produces percentages that swing on a handful of individuals and read as signal.
Trade-offs
New groups have less history, so they cannot answer long-term questions yet. Small groups can produce unstable percentages. The grid needs clear labels because its empty triangle can be mistaken for missing data.
Checklist
- What defines the cohort—signup date, first purchase, first meaningful action?
- What counts as retained in a period, and is that definition visible?
- Are cohort sizes shown alongside the percentages?
- Is there a minimum cohort size below which cells are suppressed?
- Are period buckets days, weeks or months, and do they match the product’s natural rhythm?
- Does the colour scale run over a range that makes real differences visible?
- Can the viewer read down a column easily, or does the layout only support rows?
- Does anything mark when a significant product change shipped?
- Is the newest cohort visually distinguished as incomplete?
- Would the same data as a set of decay curves communicate better to this audience?
Compare
Amplitude and Mixpanel treat the grid as interactive analysis: cohort definition, retention event and period granularity are all controls, and the grid recomputes, which is what makes it a tool rather than a report. Looker and similar BI tools express it as a pivot with conditional formatting, so the analysis lives in SQL and the grid is presentation—flexible, and easy to build subtly wrong. Grafana has no cohort concept; the nearest thing is a heatmap over a query someone shaped into cohort-by-period, which works and gives up the row and column semantics that make the pattern readable. GitHub’s contribution graph is worth naming as the cousin that made this cell-grid reading habit mainstream, even though it plots calendar time rather than cohort age.
Related
Funnel shows drop-off through steps. Calendar heatmap aligns values by calendar date. Heatmap provides the general grid form.
Compare periods compares time windows without separating groups. Sequential and diverging scales controls the color encoding.