# Cohort grid > Retention differs by when people arrived; the viewer needs cohorts side by side over time. - Canonical: https://patterns.konigi.com/dashboards/cohort-grid - Group: Visual representation - Level: implementation - Status: published - Updated: September 10, 2026 - Also called: retention grid, triangle chart, cohort table --- ## Problem Retention is 34%. That number is compatible with a product that is steadily improving and one that is steadily rotting, because it averages together people who joined two years ago with people who joined last week. ## Solution Group people by when they arrived, then follow each group forward. One row per cohort, one column per period since joining, each cell holding the share still active. Colour the cells so the grid reads as a shape. The layout produces a triangle, and the triangle is what makes it work. Older cohorts have more columns filled because more time has passed; the newest cohort has only its first cell. Reading is two-directional and each direction answers a different question. **Across a row** is the decay curve for one cohort: how fast that particular group fell away, and whether it flattened into a stable base or kept dropping. **Down a column** is the comparison that actually matters, and it is the reason this beats a line chart. Column three holds every cohort's week-three retention, which means product changes become visible: if the last four cohorts have a better week three than the four before them, something you shipped worked. A single averaged retention number cannot show that, because it mixes cohorts at different ages. The shape people look for is a flattening curve. Retention that declines and then plateaus means a real base of returning users. Retention that keeps declining through every column means the product is a leaky bucket regardless of how good acquisition looks. ## Use when Usage is repeat-visit by nature, the population is large enough for percentages to be stable, and you need to know whether changes are working rather than only how things stand. ## 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 Cohort grids are dense and take teaching. Someone seeing one for the first time reads the triangle as missing data rather than as elapsed time. The newest cohorts, which are the ones you most want to judge, have the fewest cells and the least evidence, so the grid is structurally worst at answering the most urgent question. Cohort size varies down the rows, so a percentage in a row of 80 and one in a row of 8,000 look identical and are not comparable. And the definition of "active" carries the whole result while sitting nowhere on the chart. ## 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 is the same drop-off question compressed into one sequence with time removed. Calendar heatmap uses the same cell-grid encoding against calendar time. Heatmap is the general form. Compare periods is the coarser way to ask whether things are improving. Sequential and diverging scales governs whether the colour ramp reveals or flattens the differences. ## Examples ### Tableau Public (Salesforce) Thousands of dashboards made by people who are not designers, published without a review step. The best available sample of what the pattern language looks like in the wild. **Cohort Retention Analysis** — captured September 11, 2026, Tableau Public embed view; workbook published by Tyran Christian. analytical, medium density, light theme, desktop-web. The triangle, exactly as the entry describes it: thirteen monthly cohorts down the side, thirteen periods since joining across the top, and each row one cell shorter than the last because younger cohorts have had less time. Reading down column two gives the comparison the grid exists for—37%, 22%, 19%, 15%, then a slow climb back to 24%—which no single averaged retention number could show. Two things undercut it. The first column is 100% for every cohort by definition, and it takes the darkest step on the ramp, so the one column carrying no information anchors the scale and compresses every real value between 2% and 50% into what is left. And look along the staircase edge: 9%, 4%, 3%, 2%, 4%, 2%, 4%, 2%, 3%, 4%. Every row's final cell falls off a cliff relative to its neighbour, because that period is still in progress and is being drawn as though it were complete. Hotspots in this capture: - [Cohort grid](https://patterns.konigi.com/dashboards/cohort-grid) *(this pattern)* — One row per cohort, one column per period since joining. The triangle is the shape, not a rendering accident. - [Cohort grid](https://patterns.konigi.com/dashboards/cohort-grid) *(this pattern)* — 50% then 9%. The last cell in every row is a partial period drawn as a finished one. - [Sequential and diverging scales](https://patterns.konigi.com/dashboards/sequential-and-diverging-scales) — Column one is 100% for everyone and takes the darkest step, so a constant sets the top of the ramp. - [Ratio and rate](https://patterns.konigi.com/dashboards/ratio-and-rate) — Cohort dates, and no cohort size. A 100% first cell could be ten people or ten thousand. ## Related patterns - [Funnel](https://patterns.konigi.com/dashboards/funnel) — People move through steps and the viewer needs to see where they leave. - [Calendar heatmap](https://patterns.konigi.com/dashboards/calendar-heatmap) — Daily activity over a year, read for streaks and gaps. - [Heatmap](https://patterns.konigi.com/dashboards/heatmap) — Thousands of events per second can't be drawn as points; the viewer needs density. - [Compare periods](https://patterns.konigi.com/dashboards/compare-periods) — Today's line means nothing without last week's line under it. - [Sequential and diverging scales](https://patterns.konigi.com/dashboards/sequential-and-diverging-scales) — Magnitude and direction need encoding in color, and the wrong ramp lies. ## Sources - [Cohort analysis](https://en.wikipedia.org/wiki/Cohort_analysis) - [Grafana, Heatmap panel](https://grafana.com/docs/grafana/latest/visualizations/panels-visualizations/visualizations/heatmap/) - [Bach et al., Dashboard Design Patterns](https://dashboarddesignpatterns.github.io/patterns.html) --- Screenshots on patterns.konigi.com are reproduced for commentary and criticism. Product names and marks belong to their owners.