From one chart to a vocabulary
a2 gave you the cohort table and its heatmap. This session turns the same table into every other chart the retention conversation needs, teaches the one averaging trap that quietly corrupts most of them, and ends in the course's signature simulator: a real cohort engine in your browser where you flatten the curve lever by lever - and discover what doubling the ad budget does and does not buy. Companion notebook: notebooks/a3_viz_gallery.ipynb.
The shape is the diagnosis 7 min live
Take any cohort row from a2's table and plot it left to right: that is a retention curve. Three shapes exist, and they map one-to-one onto business verdicts. Investors literally sort companies by which shape they see - a curve that flattens above zero means a durable core of users found lasting value; a curve that slides to zero means the bucket leaks everything, and growth is a treadmill of ever-more acquisition.
LiveFlatten the curve: the product goal in one sentence4 min▶
Casey Winters' formulation is the cleanest: a flattened retention curve of your key action, at its natural frequency, plus month-over-month growth in new users, is product-market fit. Not the D1 number, not the download count - the flat part. Everything a product team does for retention is one of two moves:
- Raise the asymptote - get more of each cohort into the durable core (better onboarding, better habit loops, loyalty economics).
- Bend the tail up - resurrect the churned (winback campaigns, reactivation nudges). The only move that creates a smile.
And the benchmark discipline from a1 applies to shapes too: in the 2025 GameAnalytics data (11,600 games), the median mobile game holds under 4% of players at day 7 - most curves in the wild slide to zero. A curve that flattens anywhere above zero already puts you in the minority.
The one graph behind a $1B exit. Dollar Shave Club's cohort curves flattened near 50% at six months - category-leading in Second Measure's transaction data. That flat tail, not the viral video, was the durable-revenue story Unilever paid one billion dollars for. Investors do not read your deck's adjectives; they read the tail of your curve.
Self-studyThe truncated-cohort trap: why "average retention" quietly lies4 min read▶
The obvious move - retention.mean(axis=0) to get "the average curve" - is wrong on real data, and wrong in a way nobody notices. Column 1 averages over every cohort, but column 10 only includes cohorts old enough to have a month 10, which are your oldest vintages. If newer cohorts retain better (they usually do, if the product is improving), the average curve DROPS at late months purely because the good young cohorts have not arrived there yet - a vintage-mix artifact, not a behavior.
- Fix 1: average only over cohorts that have completed the period, and print n per column:
retention.count()alongsideretention.mean(). - Fix 2 (better): do not average at all - overlay the curves, fade older cohorts grey, bold the newest two or three. The vintage differences ARE the story.
- Corollary: never include the still-filling current month in any average. Partial windows drag every mean down - a2's frozen-history rule again.
Small multiples are the grown-up version of the same fix - one panel per group, shared axes, no spaghetti:
Four charts beyond the heatmap 9 min live
Each chart in the family re-slices the same cohort data for a different audience. The layer-cake stacks each cohort's revenue over calendar time - if old layers stay thick, revenue is durable. Growth accounting decomposes month-over-month change into new + resurrected - churned. The quick ratio compresses that into one line. The L28 power-user curve is a histogram of engagement depth that averages like DAU/MAU cannot show.
Here is that growth-accounting decomposition run on the course's own dataset - the same three flows, stacked over twelve real months.
Live★ Build-along: layer-cake and growth accounting in matplotlib6 min▶
Both charts fall straight out of a2's objects. The layer-cake is the COUNTS table (not the percentages) re-indexed to calendar months; growth accounting compares each user's active months to their previous month.
Self-studyThe L28 power-user curve: the engagement histogram3 min read▶
DAU/MAU compresses engagement into one ratio and hides its distribution. The L28 curve plots, for one 28-day window, how many users were active exactly 1 day, 2 days, up to 28 days. (28, not 30 - four exact weeks kills the weekday mix.) The shape is the verdict: a smile - mass at both ends - means a hardcore daily segment exists alongside casual users. A curve slumped entirely left means nobody is hooked, whatever the averages say.
Facebook's growth team invented this reading; a16z popularized it as "the power user curve". Use it whenever a stakeholder says "our DAU/MAU is fine" - the histogram tells you whether that ratio is one loyal core or a blur of drive-bys.
Flatten the curve ▶ 15 min · everyone drives
Below is a real cohort engine: 12 monthly cohorts of simulated users, each with their own churn probability, counted into a live triangle exactly the way your pandas pivot counts orders. Four product levers change how users behave. One dashed lever changes only how many arrive. Your two headline numbers: the January cohort still active in month 6, and December MAU. Watch which levers move which number.
Baseline: month-6 retention 27%, sliding to 20% by month 11 - a curve on its way to zero. December MAU 4,422. This is the leaky bucket.
Turn on the four product levers one by one, top to bottom, and watch the ladder: 27% to 38% (onboarding) to 44% (habit) to 53% (loyalty - now look at the curve flatten: months 4-6 read 57/55/53) to 60% with winback, where month 11 holds at 59% - a genuinely flat tail.
Reset to baseline (all levers off), then hit Double ad spend. MAU jumps to 7,970 - up 80%. Month-6 retention: still 27%. Not one cell of the triangle changed color. You bought a bigger bucket with the same holes.
Now the punchline: all four product levers together also produce December MAU of 7,970 - the exact same headline as doubling the budget. Same MAU, opposite futures: the levers version holds 59% of January at month 11; the ad-spend version holds 21%. One compounds, one rents.
This is Duolingo's actual playbook, compressed. Their growth team modeled users as a state machine (new, current, reactivated, resurrected, at-risk, dormant), ran sensitivity analysis, and found that current-user retention - CURR - had about five times the DAU impact of the next best metric. Four years of streaks, leagues, and notification discipline later: CURR up 21%, DAU up 4.5x, with acquisition spend flat. They pulled the levers you just pulled, and refused the dashed one.
Try it yourself - this week ◐ 30 min total
- Run the a3 notebook: overlaid curves with faded vintages, the layer-cake, growth accounting with the quick-ratio line, and the L28 histogram - all four go in your running retention report.
- Compute your product's quick ratio for the last six months. Is the bucket filling faster than it leaks, and is the trend direction friendly?
- Find the "average retention curve" chart nearest to you and check: does its late tail include only old vintages? If yes, you have found a truncated-cohort artifact in the wild - re-plot it as overlaid curves.
- In the simulator, find the cheapest single lever that gets month-6 retention above 50%. (It cannot be done with one - which is itself the lesson: retention is a portfolio, not a silver bullet.)
What this session draws on
The chart family is standardized across a handful of durable essays and tool docs. This page teaches the working core of:
Three questions before you go 🎯 ◐ 90 seconds
1 · A retention curve that declines for four months and then holds flat at 22% means...
The asymptote, not the early drop, is the verdict. Most products lose the majority early (the median mobile game keeps under 4% at day 7); what separates durable businesses is the curve flattening above zero. Raise the floor, then worry about the slope.
2 · Why is retention.mean(axis=0) a lie on a live cohort table?
Column 1 averages all cohorts; column 10 only the ones old enough to reach it. If newer cohorts retain differently, the average curve's tail reflects WHO is in it, not how users behave. Average only completed cohorts, print n per column, or better: overlay the curves.
3 · In the simulator, doubling ad spend and turning on all four product levers both produce December MAU of 7,970. What tells them apart?
A headline metric can hide opposite realities - which is exactly why growth accounting and the cohort triangle exist. Same MAU today; next quarter the ad-spend version needs the budget doubled again while the levers version compounds for free.