Customer Churn
Churn is the rate at which customers stop using a product or service over a period. It is the opposite of retention, and it is the metric subscription businesses, telecoms and apps watch most closely.
\[ \text{customer churn rate} = \frac{\text{start-cohort customers lost in the period}}{\text{customers at the start of the period}} \times 100 \]
Three distinctions matter. Customer churn counts people; revenue churn counts money, and they differ when large accounts leave. Voluntary churn is a customer choosing to cancel; involuntary churn is a failed payment or an expired card, which is an operations problem rather than a product one.
The arithmetic is simple — 1,000 users at the start and 950 of those same users remaining at the end imply 5% start-cohort churn; or 40% of new app users uninstalling within 30 days, a 30-day churn of 40%. Almost everything that goes wrong with the metric happens around that arithmetic rather than in it.
Four things the rate does not say on its own
Churn rates compound rather than add. A monthly rate c leaves a share (1 − c) of customers after a month and (1 − c)12 after a year, so the annual rate is \(1 - (1-c)^{12}\). The code below sets that next to the tempting shortcut of multiplying the monthly rate by twelve.
for c in (0.02, 0.05, 0.08, 0.10):
annual = 1 - (1 - c) ** 12
print(f"monthly {c:.0%}: annual {annual:.1%}, 12 x monthly {12 * c:.0%}")
monthly 2%: annual 21.5%, 12 x monthly 24%
monthly 5%: annual 46.0%, 12 x monthly 60%
monthly 8%: annual 63.2%, 12 x monthly 96%
monthly 10%: annual 71.8%, 12 x monthly 120%
The first thing the rate does not say is its period. 5% a month is 46% a year, not 60%; at 10% a month the annualized figure is 72% where multiplying by twelve gives 120%, which is not even a possible rate. Monthly and annual churn are different numbers.
The second is that the denominator is a choice. Take a month that starts with 1,000 customers, adds 300 new ones and loses 50 of those it started with, so it ends with 1,250. The loss is the same 50 whichever denominator is used.
start, new, lost = 1_000, 300, 50
end = start - lost + new
print(f"customers at the start: {lost / start:.2%}")
print(f"start plus new: {lost / (start + new):.2%}")
print(f"average of start and end: {lost / ((start + end) / 2):.2%}")
customers at the start: 5.00%
start plus new: 3.85%
average of start and end: 4.44%
The same month reads 5.00% on customers at the start, 3.85% on start plus new, and 4.44% on the average of start and end. The definition above uses the first, which is the conservative one; the second flatters, and it flatters most when growth is fastest. A churn trend across a period of changing growth is partly a chart of the denominator.
The third is the customer-versus-revenue distinction, with numbers on it. Give 200,000 customers a skewed revenue per customer (lognormal, shape 1.4, scale 40), then let 5% of them leave in three different ways: at random, the smallest accounts, or the largest accounts.
import numpy as np
from scipy.stats import lognorm
rng = np.random.default_rng(0)
m = 200_000
rev = lognorm(s=1.4, scale=40.0).ppf(rng.random(m))
print(f"revenue per customer: mean {rev.mean():,.2f}, median {np.median(rev):,.2f}")
k = int(0.05 * m) # 5% of customers leave
order = np.argsort(rev)
leavers = {"5% at random": rng.permutation(m)[:k],
"the 5% smallest accounts": order[:k],
"the 5% largest accounts": order[-k:]}
for name, idx in leavers.items():
revenue_churn = rev[idx].sum() / rev.sum()
print(f"{name:<25} customer churn {k / m:.1%}, revenue churn {revenue_churn:.1%}"
f" ({revenue_churn / (k / m):.2f}x)")
revenue per customer: mean 106.30, median 39.75
5% at random customer churn 5.0%, revenue churn 4.9% (0.97x)
the 5% smallest accounts customer churn 5.0%, revenue churn 0.1% (0.02x)
the 5% largest accounts customer churn 5.0%, revenue churn 40.6% (8.12x)
Because revenue per customer is skewed, the same 5% of customers is 0.1% of revenue if they are the smallest accounts and 40.6% if they are the largest. The two metrics can move in opposite directions on purpose — a business that deliberately sheds its smallest accounts can lose many accounts but relatively little revenue. Adding small-account losses with all other losses fixed raises both churn measures; opposite trends require changes in which accounts leave, not merely more small-account exits. A churn figure without “customer” or “revenue” in front of it is not a number.
The fourth is why churn caps growth rather than slowing it. Suppose a business starts with 1,000 customers and adds a fixed 200 a month, while a share c of its customers leaves each month. Next month’s count is this month’s count times (1 − c), plus 200. Growth stops where the churned customers equal the new ones, at 200 divided by c customers. The loop below iterates that recurrence until the count reaches 2,000 or 600 months have passed.
inflow, start = 200, 1_000
for c in (0.02, 0.05, 0.08, 0.15):
customers, months = float(start), 0
while customers < 2 * start and months < 600:
customers = customers * (1 - c) + inflow
months += 1
doubling = f"doubles after {months} months" if customers >= 2 * start else "never doubles"
print(f"churn {c:.0%}: month-1 net adds {inflow - start * c:,.0f}, "
f"ceiling {inflow / c:,.0f}, {doubling}")
churn 2%: month-1 net adds 180, ceiling 10,000, doubles after 6 months
churn 5%: month-1 net adds 150, ceiling 4,000, doubles after 8 months
churn 8%: month-1 net adds 120, ceiling 2,500, doubles after 14 months
churn 15%: month-1 net adds 50, ceiling 1,333, never doubles
With the inflow fixed, the business settles at 200 divided by its churn rate: 10,000 customers at 2% churn, 1,333 at 15%. From 1,000 customers at 15% it grows by a third and then stops. That ceiling is below 2,000, so it never doubles however long it runs. The conclusion depends on the starting size: at the same churn and inflow a business that starts with 100 customers reaches 285 after one month and more than doubles. Cutting churn from 5% to 2% raises the ceiling from 4,000 to 10,000 with the same 200 new customers a month.
Why it is watched, and what to do about it
The revenue impact is direct, since a lost subscriber is lost recurring revenue. The growth ceiling above is the less obvious half. Compare the cost and incremental benefit of retention work with those of acquisition. The ceiling calculation shows how churn changes the attainable customer base under fixed acquisition assumptions; it does not establish which intervention is more cost-effective.
In analytics practice, churn prediction models flag which users are likely to leave from behavior — logins, purchases, support contacts — and the interventions are the familiar ones: better onboarding, targeted offers, support outreach. Two cautions apply. A model that predicts churn well does not tell you whom to intervene on, since some of the customers most likely to leave would leave regardless; that is an uplift question rather than a prediction one. And involuntary churn usually responds to payment retries and card updating rather than to anything a retention campaign does, so splitting the two before acting is worth more than a better model.
Churn feeds directly into customer lifetime and through it into LTV, where the sensitivity is severe: at low churn rates half a point of measurement error moves the lifetime by more than a year.
References
- SciPy documentation,
scipy.stats.lognorm. docs.scipy.org
Discover more from Insightful Data Lab
Subscribe to get the latest posts sent to your email.
