Retention Curves
The shape of a healthy business.
A bucket with a hole in it never fills up, however fast you pour. Many companies spend a fortune on new customers, while old ones quietly leak away. A retention curve shows you the size of the hole.

- A bucket with a hole
- Pouring in new customers
- Old ones leak away
A retention table
We group customers by the month that they joined, and we count how many are left, in each month after that. Then we divide by the starting size, to make cohorts comparable. Run it. Read across a row to follow one group. Read down a column to compare groups at the same age. The March cohort kept thirty three percent after five months, and January kept sixteen. Something improved. Perhaps it was the new loyalty scheme. That's where you start asking questions.
import numpy as np
import pandas as pd
rng = np.random.default_rng(0)
rows = []
for cohort, keep in [("Jan", .70), ("Feb", .74), ("Mar", .80)]:
users = 1000
for month in range(6):
rows.append((cohort, month, users))
users = int(users * keep * rng.uniform(.97, 1.03))
t = pd.DataFrame(rows, columns=["cohort", "month", "users"]).pivot(index="cohort", columns="month", values="users")
print((t.div(t[0], axis=0) * 100).round(0).astype(int).to_string())month 0 1 2 3 4 5 cohort Feb 100 74 56 41 31 24 Jan 100 70 49 33 22 16 Mar 100 82 64 51 40 33
Reading the shape
What matters most is the shape. A curve that falls to zero means that you've got a leaky product, and growth can't last. A curve that flattens out means that you've found people who truly want what you sell. So look for the level at which it flattens. And if newer cohorts sit above older ones, your product is improving.
Summary
Follow groups over time, and look for the flat part of the curve. Next, what do customers buy, and at what price?
Key takeaways- Cohorts compare fairly
- Look for the flat part
- Newer cohorts should be higher