learn-customer-retention-with-phoebe / Analyst session 3 of 8
Learn Customer Retention with Phoebe · Analyst track · Session 3 of 8

The retention viz gallery

The heatmap from a2 is one chart in a family. Each member answers a different question: the curve answers "do we have product-market fit", the layer-cake answers "is revenue durable", growth accounting answers "are we filling the bucket faster than it leaks", the power-user curve answers "who is actually hooked". Today you build the family in Python - and then drive a live simulator where four product levers fight one very expensive trap.

🟠 Analyst track Data analysts · Python ▶ Live flatten-the-curve simulator 45 min
0-3 · Welcome 3-16 · Curves & shapes 16-40 · Gallery + simulator 40-45 · Q&A
Part 0

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.

Live - presented in session Self-study - read after class ▶ Simulator - drive it yourself Sources covered
★ What you walk out with today The three curve shapes and what each means for the business, the truncated-cohort averaging trap and its fix, four charts beyond the heatmap (curves, layer-cake, growth accounting, L28) with the matplotlib recipes, and a felt sense - from driving the simulator - of why retention compounds and acquisition rents.
Part 1 · covers curve shapes as PMF diagnosis (Sequoia, Reforge)

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.

Three shapes, three verdicts Sloping to zero Leaky bucket. No PMF. Growth is rented, one ad campaign at a time. Flattens to an asymptote A durable core found lasting value. The higher the floor, the better. PMF. The smile Churned users come back. Rarest and best - winback or seasonality done right.
🔍 Click to zoom - slide to zero, flatten, or smile: every cohort row is one of these three
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.

Real world

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() alongside retention.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.
Overlaid curves, older cohorts fadedax = retention.T.plot(figsize=(10, 5), color="#D3C4B8", legend=False) retention.tail(3).T.plot(ax=ax, linewidth=2.5, color="#C2410C", legend=True) ax.set_ylim(0, 1) ax.set_xlabel("Months since joining") ax.set_title("Every cohort's curve - newest three in ember")

Small multiples are the grown-up version of the same fix - one panel per group, shared axes, no spaghetti:

Same curve, different floors: retention by acquisition channel Organic 100% 50% 0 ~35% Paid social ~12% Search ~28% Referral ~40% months since first purchase ILLUSTRATIVE - the repo data has no channel column. Shared axes keep the comparison honest; spaghetti does not.
🔍 Click to zoom - four channels on shared axes: the floor, not the shape, is the difference
Demo · the signature simulator

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.

Real world

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.

Homework

Try it yourself - this week ◐ 30 min total

Sources covered

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:

✓Sequoia "Retention" + Casey Winters on PMF - curve shapes as diagnosisPart 1 · slide, flatten, smile
✓Jonathan Hsu (Social Capital) - growth accounting and the quick ratioPart 2 · fill vs leak, rules at 1 and 4
✓The layer-cake convention (Daasity / investor decks)Part 2 · cohort revenue durability
◐a16z "The Power User Curve" (Li Jin)Self-study card · L28 histogram; segmentation depth in a4
◐Jorge Mazal - "How Duolingo reignited user growth" (Lenny's Newsletter)Simulator debrief · the CURR case gets full treatment in s3
Check yourself

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.

Analyst session 3 cheat sheet · pin this

Three curve shapesSlide to zero = leaky bucket, no PMF. Flatten above zero = durable core. Smile = resurrection. The tail is the verdict.
Flatten the curveTwo moves only: raise the asymptote (onboarding, habit, loyalty) or bend the tail up (winback). Everything else is noise.
Truncated-cohort trapLate columns hold only old vintages, so naive column means lie. Average completed cohorts only, or overlay curves instead.
Layer-cakeStacked cohort revenue over calendar time. Old layers staying thick = durable revenue. The investor chart.
Growth accountingDelta MAU = new + resurrected - churned. Quick ratio = (new + resurrected) / churned; above 1 grows, 1.5-2 is strong.
L28 curveHistogram of active days per 28-day window. Smile = a hardcore segment exists. The anti-average.
One chart per audienceAnalyst: triangle. PM: curves. Executive: layer-cake or D30 trend with annotations. Never lead with the full triangle upstairs.
Compound vs rentSimulator canon: levers 27 to 60% M6 and MAU 7,970; double ad spend, same 7,970 MAU, retention still 27%. Same headline, opposite futures.