Glossary/Metrics and growth
Rolling retention
Definition
Rolling retention is the percentage of a cohort that is active on day N or on any day after it, treating a user as retained if they ever returned at or beyond that point.
Where classic retention asks whether a user showed up on a particular day, rolling asks whether they had left for good by then. That inversion makes it the natural definition for churn, because its complement is a clean statement: the users who never returned on or after day N have, by this measure, churned before it.
Why it is always higher than classic
Every user counted by classic retention at day N is also counted by rolling retention at day N, because being active on day N satisfies "day N or later". The reverse is not true. Rolling therefore sits above classic at every point on the curve, and the gap between them is itself informative — it is the population that returns irregularly.
| Day | Classic | Rolling | Gap | What the gap contains |
|---|---|---|---|---|
| D1 | 26.0% | 48.2% | 22.2pt | Users who skip day 1 but come back later |
| D7 | 10.4% | 27.5% | 17.1pt | Irregular weekly and fortnightly users |
| D14 | 8.1% | 21.3% | 13.2pt | Narrowing as the population settles |
| D30 | 4.6% | 14.9% | 10.3pt | The long-lived irregular core |
A wide and persistent gap means your product is used irregularly but genuinely. A gap that collapses toward zero means the users who remain are daily users and everyone else has gone — which is healthy for a habit product and alarming for one that expects occasional use.
Rolling retention is also monotonically non-increasing in N by construction, so it never produces the sawtooth pattern classic does. That is convenient for a chart and is precisely why it is the wrong tool for detecting weekly habits.
The maturity problem, which is worse here
"Or any day after" has no upper bound, so rolling retention at day N can only increase as more time passes. A cohort measured today at D7 may gain retained users tomorrow when a dormant user returns on day 40. This is not a data error; it is the definition. It does mean recent cohorts are systematically understated.
| Measured on | Cohort age | Rolling D7 reported | Trustworthy? |
|---|---|---|---|
| Day 8 | 8 days | 18.9% | No — one day of "or later" observed |
| Day 30 | 30 days | 25.1% | Partially |
| Day 90 | 90 days | 27.5% | Reasonably |
| Day 365 | 1 year | 28.0% | Effectively final |
Rolling retention comparisons need equal observation windows
Comparing a cohort observed for 90 days against one observed for 20 days will always favour the older cohort, and the difference is an artefact of measurement time rather than of behaviour. Either cap the lookahead — count activity between day N and day N+K for a fixed K — or compare only cohorts of identical age.
The capped variant is worth adopting as the default. Rolling D7 with a 30-day cap is comparable across cohorts as soon as each is 37 days old, and it loses almost nothing, because the users who return after a month were rarely going to change a decision.
The query
-- Rolling: active on day N or later. The uncapped version keeps
-- rising as cohorts age, so the capped column is the comparable one.
WITH cohort AS (
SELECT user_id, DATE(installed_at) AS cohort_date
FROM installs
),
last_seen AS (
SELECT
c.user_id,
c.cohort_date,
DATE_DIFF(MAX(DATE(s.started_at)), c.cohort_date, DAY) AS last_active_day
FROM cohort c
JOIN sessions s USING (user_id)
WHERE s.is_foreground
GROUP BY c.user_id, c.cohort_date
),
params AS (SELECT 7 AS n, 30 AS lookahead_cap)
SELECT
p.n AS day_n,
COUNT(*) AS cohort_size,
-- Uncapped: ever active on day N or after.
ROUND(100.0 * COUNTIF(l.last_active_day >= p.n) / COUNT(*), 2) AS rolling_pct,
-- Capped: active between day N and day N + cap. Comparable across cohorts.
ROUND(100.0 * COUNTIF(l.last_active_day BETWEEN p.n AND p.n + p.lookahead_cap)
/ COUNT(*), 2) AS rolling_capped_pct
FROM last_seen l
CROSS JOIN params p
-- Only cohorts old enough to have been observed for the full cap.
WHERE l.cohort_date <= CURRENT_DATE() - p.n - p.lookahead_cap
GROUP BY p.n;Because rolling retention depends only on the last active day, it is far cheaper to compute than classic — one aggregate per user rather than a day-by-day expansion. On large event tables that difference is substantial, and it is a reasonable argument for materialising last_active_day per user per cohort as a daily job.
What it is genuinely good for
- Churn. One minus rolling retention at day N is a defensible churn definition, because it means "never came back at or after day N".
- Lifetime estimates. The rolling curve is closer to a survival function than the classic curve is.
- Irregular-cadence products. Booking, delivery and finance apps score fairly under rolling and unfairly under classic.
- Executive reporting. It is monotonic, which makes trend claims harder to accidentally overstate.
Its weaknesses follow from the same properties. It cannot detect weekly rhythm, it responds slowly to a release regression because a single bad day is absorbed by "or later", and it flatters recent product changes only after a long wait. Most teams end up reporting rolling for churn and lifetime while keeping classic as the operational chart — the retention rate overview sets out how the three fit together.
Free developer tools
Rolling retention by acquisition source is one of the clearest quality signals available, and it is only trustworthy when campaign labels are consistent and every cohort reaches the same post-install destination. Our free tools cover that link layer — tagging, routing and verification.
Open the free developer tools →Frequently asked questions
- What is rolling retention?
- It is the percentage of a cohort active on day N or on any day after it. A user who is silent for three weeks and then returns still counts as retained at every day index up to their return. This makes it the natural definition for churn, since its complement means a user never came back at or after that day.
- Why is rolling retention higher than classic retention?
- Because every user counted by classic is also counted by rolling, while rolling additionally counts users who returned on any later day. The gap between the two curves represents users who use the product irregularly, and watching that gap narrow or widen over time says something useful about which population is surviving.
- Why does rolling retention keep changing for old cohorts?
- Because the definition has no upper bound, so a dormant user returning after 200 days retroactively increases the cohort's rolling retention at every earlier day index. Recent cohorts are therefore systematically understated. Capping the lookahead to a fixed number of days makes the metric stable and comparable across cohorts.
- How do I calculate churn from rolling retention?
- Churn at day N is one minus rolling retention at day N, which reads as the share of the cohort that never returned on or after that day. This is cleaner than deriving churn from classic retention, where a single absent day would misclassify an otherwise active user as churned.
- Should I use rolling or classic retention?
- Use classic for cohort comparisons, release regressions and detecting weekly habits, since it measures each day independently and keeps the rhythm visible. Use rolling for churn, lifetime estimates and products with irregular usage cadence. Many teams report both, which costs one extra column and prevents most definitional arguments.
Related terms
- Retention rate — Retention rate is the percentage of a cohort of users who are still active after a defined period, measured from a fixed starting event such as install.
- Classic retention — Classic retention is the percentage of a cohort that is active on day N exactly, counting only activity on that specific day and ignoring activity on any other day.
- N-day retention — N-day retention is the percentage of a cohort that is active on the Nth day after their starting event, where day zero is the day of the starting event itself.
- Cohort analysis — Cohort analysis groups users by a shared starting event, usually their install date, and measures each group separately over time so that changes in behaviour can be separated from changes in acquisition mix.