Skip to content
Log in

Theory

Forecasting active users

New users × retention: build a monthly active users forecast from cohorts, with a separate curve for summer cohorts, and price a cut in paid acquisition in users.

~10 min read · 9 exercises · 250 points

Before you start

How will we grow?

You work in the product team at Halves, a bill-splitting app for flatmates, couples and trips, with a paid plan, Halves Plus. Growth questions come with numbers attached: how many users next quarter, what invites add, which channels to fund.

This module asks how Halves will grow: forecasting from cohorts, measuring viral growth honestly, judging channels by what they really add and, finally, investigating a spike nobody can explain. This first lesson builds a forecast of monthly active users from cohorts and their retention curves.

One cohort’s future: new users × the right curve

The building block of a cohort forecast is one multiplication:

expected active users of a cohort in month t = new users in the cohort × share of such a cohort still active at its age

Age is counted from the sign-up month, which is month 0. The share comes from a retention curve, the share of a cohort still active at each age, measured on older cohorts (Retention: day N, rolling or bracket covers the ways to measure it). At Halves, the 2025 cohorts give it month by month.

Dataset · 12 rows

Monthly retention curves from the 2025 cohorts

Share of a cohort that opens the app in each month of its life.

month_since_signupactive_share_regularactive_share_summer
01.00001.0000
10.50030.5002
20.41580.3829
30.36100.3067
40.32530.2573

First 5 of 12 rows

Download CSV

The key word is "such a cohort". Different kinds of cohorts keep users differently, and at Halves the season decides the kind. Summer cohorts are full of trip groups that settle the bill and leave: at month 3 a summer cohort keeps 30.67% of its users, a regular one 36.10%; by month 11 it's 16.99% against 26.27%.

A crowded summer beach thins out as autumn leaves fall, while a small group of flatmates stays at their table with a receipt.
Summer cohorts are big, but they leave faster than the rest.

June 2026 brought 12,904 new users, two-thirds through invites, many into trip groups. In September it's 3 months old, so 12,904 × 0.3067 ≈ 3,958 users are expected active. With the regular curve you'd expect 4,658, which is 700 too many from a single cohort.

  • Do
    June cohort in September (age 3, summer curve): 12,904 × 0.3067 = 3,958.
  • Don't
    June cohort in September: 12,904 × 0.3610 = 4,658, using the regular curve.

    A trip-season cohort doesn’t retain like a winter one.

Building a cohort forecast, step by step

A forecast of monthly active users built from cohorts follows the way users actually arrive and leave:

  1. New users by sign-up month: actual numbers for past months, the plan for future ones.
  2. A curve for each kind of cohort: label each month's cohort (at Halves, summer trip season or regular) and give it that kind's retention curve.
  3. Each cohort's age in the target month: September 2026 is age 8 for January, 3 for June and 0 for September itself.
  4. Each cohort's active users: its new users times its curve at that age. Month 0 is 1.0, because everyone who signs up uses the app that month.
  5. The sum: all the cohorts plus one line for the users who joined before the forecast's first cohort (at Halves, everyone from 2025: 10,894 active in September).

The formula is MAU(t) = older users(t) + Σ new users(c) × r(t − c).

MAUt=active from 2025 cohortst+∑c≤tNc×r t−c\text{MAU}_t = \text{active from 2025 cohorts}_t + \sum_{c \le t} N_c \times r_{\,t-c}
N: new users in cohort month c; r: share of a cohort active at age t − c.

Each input can be argued about separately: the plan for new users, the curves, the season labels. A trend line through past MAU only extends the past.

  • Do
    September = 10,894 (2025 users) + each 2026 cohort × its curve at its September age.
  • Don't
    September = June MAU × (1 + average monthly growth Jan–Jun).

    A trend says nothing about who will leave.

Adding up the cohorts for one month

With the inputs ready, a month's forecast is a sum of products. September 2026 at Halves:

Formula: N: new users in cohort month c; r: share of a cohort active at age t − c. · shown above

  • 2025 users: 10,894;
  • January 4,646 × 0.2711 (age 8) = 1,259.5; February 5,106 × 0.2775 (7) = 1,416.9; March 5,395 × 0.2874 (6) = 1,550.5; April 5,504 × 0.3024 (5) = 1,664.4; May 5,987 × 0.3253 (4) = 1,947.6;
  • June 12,904 × 0.3067 (3, summer) = 3,957.7; July 14,104 × 0.3829 (2, summer) = 5,400.4; August 14,879 × 0.5002 (1, summer) = 7,442.5;
  • September 7,295 × 1.0 = 7,295.
Layers stacked like rock strata, each older layer thinner, with a fresh thick layer on top.
Active users are the sum of every cohort still around, each at its own age.

Dataset · 12 rows

Halves new users and MAU, 2026: actual and plan

January–June are actual; July–December are the growth plan and the "paid halved from September" scenario.

monthstatusnew_invitenew_organicnew_paidnew_usersnew_users_paid_halvedactive_from_2025_cohortsmau_actual
2026-01actual19669981682464646461399818644
2026-02actual221111061789510651061287520304
2026-03actual230011761919539553951214622025
2026-04actual226712411996550455041167623680
2026-05actual255512632169598759871136325704

First 5 of 12 rows

Download CSV

Total ≈ 42,829, below August's 46,166, even though 7,295 people join in September.

Three slips are common: counting ages off by one (age is target month minus sign-up month, so the current month is age 0), using the regular curve for the summer cohorts, and forgetting the older users' line. Keep decimals in the products and round only the total.

  • Do
    August cohort in September: age 1 → 14,879 × 0.5002 = 7,442.5.
  • Don't
    August cohort in September: age 2 → 14,879 × 0.3829 = 5,697.2.

    Off by one: August is 1 month old in September.

What pushes a forecast too high

Most forecasts that disappoint were too high, and the reasons are predictable.

  • One curve for every cohort. If summer cohorts get the regular curve, every trip user is assumed to stay like a flatmate. At Halves that adds 1,166 users in September and 3,179 by December, and the error grows as the summer cohorts age.
  • A straight trend line through recent MAU. January–June went from 18,644 to 34,365, but June's jump is mostly summer cohorts that will shrink. Extending the trend carries the peak into autumn, while the cohort forecast turns down in September.
  • A plan for new users that is optimistic. The forecast is only as good as its sign-up plan; a missed plan means missed MAU.
Halves MAU forecast, 2026: two curves vs oneForecast from cohorts with the summer curve for June–August (plan), and the same plan with the regular curve for every cohort.

Chart data

monthPlan, two curvesOne curve for all
2026-0118,64418,644
2026-0220,30520,305
2026-0322,02722,027
2026-0423,67923,679
2026-0525,70225,702
Show 7 more rows
2026-0634,36534,365
2026-0740,70240,704
2026-0846,16646,592
2026-0942,82943,995
2026-1043,06045,193
2026-1144,23647,001
2026-1246,08149,260

Two things that do not bias it up: counting the current month's new users at 100% (month 0 is 1.0 by definition), and including the older users' line. Leaving that line out makes the forecast far too low, by 10,894 in September.

A quick test for any forecast: does it go down when the curves say users leave?

  • Do
    Summer curve for June–August cohorts: September 42,829.
  • Don't
    One regular curve for every cohort: September 43,995.

    1,166 users too many, and 3,179 by December.

Backtest the method before you trust it

A forecast method can be checked before anyone sees the future: run it on months you already know. This is a backtest. Take the same inputs the forecast uses (new users by month, the curves, the older users' line) and rebuild past months as if they were unknown, then compare with the actual MAU.

At Halves, rebuilding January–June 2026 from the 2026 cohorts and the curves measured on 2025 cohorts lands within 3 users of actual MAU every month: February 20,305 against 20,304, May 25,702 against 25,704, June 34,365 against 34,365. That says the curves and the cohort sum describe how Halves users behave, at least in the first half-year.

What a backtest can't do: check the plan for new users, or a kind of cohort the past didn't contain. This year's summer cohorts are only a few weeks old, so whether they follow last summer's curve is still an assumption, and the note to the board should say so.

A smooth line or a forecast that "looks reasonable" is not a check. Only a comparison with real numbers is.

  • Do
    “Rebuilt January–June from cohorts: within 3 users of actual MAU each month.”
  • Don't
    “The forecast line is smooth and continues the spring trend, so it looks right.”

    Looking plausible isn’t evidence.

Pricing a scenario in users

A scenario changes some inputs and leaves the rest. To find what it costs in users, you only need the cohorts that differ: everything else cancels out.

gap in month t = Σ over changed cohorts (missing new users × curve at the cohort's age in month t)

Halves "paid halved from September": the September–December cohorts are smaller. The missing users are half the paid sign-ups, and from October also the people those missing users would have invited, 0.31 each. In December:

  • September 1,313 × 0.3610 (age 3) = 474.0;
  • October 1,792 × 0.4158 (age 2) = 745.1;
  • November 1,890 × 0.5003 (age 1) = 945.6;
  • December 1,995 × 1.0 (age 0) = 1,995.

Gap ≈ 4,159 users, 9% of the plan's 46,081. That matches the difference of the two full forecasts (46,081 − 41,922), which is a good check.

Halves MAU forecast, 2026: plan vs paid halvedForecast from cohorts: the plan and the scenario with paid acquisition halved from September.

Chart data

monthPlanPaid halved
2026-0118,64418,644
2026-0220,30520,305
2026-0322,02722,027
2026-0423,67923,679
2026-0525,70225,702
Show 7 more rows
2026-0634,36534,365
2026-0740,70240,702
2026-0846,16646,166
2026-0942,82941,516
2026-1043,06040,611
2026-1144,23640,903
2026-1246,08141,922

Don't simply add up the missing sign-ups (6,990): many of those users would have left by December anyway.

A machine with several levers and dials on its front prints one long receipt out at the end.
A forecast is assumptions with a number at the end, so write them down.
  • Do
    December gap = 474.0 + 745.1 + 945.6 + 1,995 ≈ 4,159 users.
  • Don't
    December gap = 1,313 + 1,792 + 1,890 + 1,995 = 6,990 users.

    Counts every missing sign-up as still active in December.

Why a cut’s cost keeps growing

Cutting acquisition doesn't remove a fixed number of users. It removes a slice from every cohort from the cut onwards, and each of those smaller cohorts stays smaller for the rest of its life. So the gap against the plan accumulates:

  • every month adds a new smaller cohort on top of the earlier ones;
  • the earlier smaller cohorts shrink with their curve but never catch up;
  • with a viral product, the missing users also don't invite anyone, so from the next month the loss compounds.

Halves, paid halved from September: the gap is 1,313 users in September, 2,449 in October, 3,333 in November and 4,159 in December, and it keeps growing into the next year until the cut is reversed. Only then does the gap start to close, slowly, as the smaller cohorts age and retention flattens.

Chart: Halves MAU forecast, 2026: plan vs paid halved · shown above

That's why a scenario is reported at a stated month, with the direction: "−4,159 in December and widening", not just "−1,313". The first month of a cut is its cheapest month.

  • Do
    “Halving paid costs 1,313 users in September and 4,159 in December, and the gap keeps widening.”
  • Don't
    “The cut costs about 1,300 users.”

    The first month’s gap, presented as the whole cost.

Users lost is not the decision

A forecast prices a scenario in users: "halving paid acquisition costs 4,159 active users in December". It can't say whether that's a good trade, because users are not money and the budget saved is.

To decide, put both sides in the same unit:

  • saved: the paid spend that won't happen, September to December;
  • lost: the gross profit the missing users, paid and invited, would have earned by a stated age, read from cohort LTV curves as in The LTV curve.

If the lost users would pay back their cost slowly (the payback period from CAC, payback and ROI), the cut may be right even though MAU falls; if they pay back fast, it destroys value. Winter paid cohorts took four to five months, and paid-social CAC rose to $1.18 in June, so neither answer is obvious.

Don't reject a cut only because "9% fewer users" sounds bad, or approve it because MAU still rises.

How it fits together: new users × the right curve, summed and backtested, turns a plan into MAU and a scenario into users; then money decides. Next, Invites and viral growth.

  • Do
    “Compare the paid spend saved with the gross profit the missing paid and invited users would earn by month 6.”
  • Don't
    “MAU still grows from September to December, so the cut is harmless.”

    Growth against the plan’s smaller base hides a 4,159-user gap.

Ready to practise?

Answer the lesson's exercises and earn 250 points the first time you finish it.

Start the exercises