Game retention: how to measure D1, D7, and D30
By Mike Dalton ·
Game retention is the share of new players who play again a given number of days after their first day. The three standard measures are D1, D7, and D30 retention: the share of new players who play again 1, 7, and 30 days after their first day. This guide covers how the numbers are calculated, the details that change them, a SQL query that computes them, and what counts as a good result.
What are D1, D7, and D30 retention?
Retention is measured per cohort. A cohort is the group of players whose first day of play was the same day, and that first day is day 0.
- D1 retention is the share of a cohort that played on day 1, the day after their first day.
- D7 retention is the share that played on day 7.
- D30 retention is the share that played on day 30.
For example, if 200 players play for the first time on a Monday and 80 of them play again on Tuesday, D1 retention for the Monday cohort is 80 / 200 = 40%. If 24 of the same 200 play on the following Monday, D7 retention is 12%.
Classic and rolling retention
There are two common definitions, and they give different numbers for the same players:
- Classic retention (also called N-day or strict retention) counts a player only if they played on exactly day N. A player who skips day 7 and plays on day 8 does not count toward D7.
- Rolling retention (also called unbounded retention) counts a player if they played on day N or any later day. It is always at least as high as classic retention, and it can increase as time passes.
Tools do not all use the same one. GameAnalytics and Unity Analytics report classic retention. Mixpanel's default is On or After
, which is rolling retention, and Amplitude offers both. Before you compare your numbers with a benchmark or with another tool, check which definition each one uses. Game Stats AI reports classic retention.
Details that change the number
Two teams can calculate D1 retention from the same data and get different results. These are the usual reasons:
- What counts as active. Any session, a finished match, or any event at all. A stricter definition gives lower retention.
- Day boundaries. Calendar days in UTC, calendar days in a local time zone, or 24-hour windows that start at the player's first session. GameAnalytics and Unity use UTC calendar days; Amplitude and Mixpanel use 24-hour windows by default. A player who first plays at 23:00 and plays again at 09:00 the next morning returned on day 1 by calendar days, but on day 0 by 24-hour windows.
- Unfinished days. A cohort's D7 retention is not known until its day 7 has ended. Show it as empty, not as 0%, or recent cohorts will pull the average down.
- Game time or import time. Use the time the player actually played, not the time your server received the data. Otherwise data you send late or backfill lands on the wrong day.
- Small cohorts. In a cohort of 10 players, one player changes D1 retention by 10 points. Average across cohorts weighted by cohort size, which is the same as adding up returning players and new players across all cohorts before you divide. The sample size section of the game balance guide shows how much a percentage can move by chance at a given sample size.
How to calculate retention with SQL
If your sessions are already in a database, this PostgreSQL query calculates classic D1, D7, and D30 retention for each cohort. It expects a sessions table with a player_id column and a started_at column of type timestamptz:
WITH active_days AS (
SELECT DISTINCT player_id, (started_at AT TIME ZONE 'UTC')::date AS active_on
FROM sessions
),
first_days AS (
SELECT player_id, MIN(active_on) AS first_day
FROM active_days
GROUP BY player_id
),
today AS (
SELECT (now() AT TIME ZONE 'UTC')::date AS day
)
SELECT
first_day,
COUNT(*) FILTER (WHERE active_on = first_day) AS new_players,
CASE WHEN first_day + 1 < today.day THEN
ROUND(100.0 * COUNT(*) FILTER (WHERE active_on = first_day + 1) / COUNT(*) FILTER (WHERE active_on = first_day), 1)
END AS d1_percent,
CASE WHEN first_day + 7 < today.day THEN
ROUND(100.0 * COUNT(*) FILTER (WHERE active_on = first_day + 7) / COUNT(*) FILTER (WHERE active_on = first_day), 1)
END AS d7_percent,
CASE WHEN first_day + 30 < today.day THEN
ROUND(100.0 * COUNT(*) FILTER (WHERE active_on = first_day + 30) / COUNT(*) FILTER (WHERE active_on = first_day), 1)
END AS d30_percent
FROM first_days
JOIN active_days USING (player_id)
CROSS JOIN today
GROUP BY first_day, today.day
ORDER BY first_day DESC;
The query reduces sessions to one row per player per day, finds each player's first day, and counts how many players in each cohort were active on day 1, 7, and 30. A retention value stays NULL until that day has ended. Days are calendar days in UTC; to use a local time zone instead, replace both 'UTC' values with a zone name such as 'America/New_York'.
What is a good D1, D7, and D30 retention?
The largest public benchmark is the GameAnalytics 2026 Mobile and PC Gaming Benchmarks, which covers more than 16,000 mobile games and 3,582 PC games during 2025. GameAnalytics uses classic retention.
| Mobile games | D1 | D7 | D30 |
|---|---|---|---|
| Median | about 22% | just under 4% | 0.7% to 0.8% |
| Top 25% | just above 30% | 6% to 7% | 1.6% to 1.8% |
| Top 10% | about 40% | 11% to 12% | not published |
| PC games | D1 | D7 | D30 |
|---|---|---|---|
| Median | about 7% | 1.1% to 1.3% | 0.2% to 0.25% |
| Top 25% | 12% to 13% | 2.7% to 3.2% | 0.7% to 0.9% |
| Top 10% | 21% to 23% | 5.8% to 6.9% | about 2% |
You will also see the 40/20/10 rule: 40% D1, 20% D7, and 10% D30. GameAnalytics describes it as a useful baseline that is not universal. Compared with the tables above, it is a target for strong mobile games, not an average.
Benchmarks mix many genres, so use them to check that your numbers are in a reasonable range. The comparison that tells you more is your game against itself: each new cohort against the cohorts before it, and each version against the previous one.
Measure retention in Game Stats AI
To show what that looks like, we set up an example competitive game. Over eight weeks, between 10 and 16 new players joined each day, and every match was sent to the matches endpoint. The players were generated to follow a typical retention curve, so the numbers show how to read the report, not a benchmark.
You do not need a separate retention event. A retention report counts a player as active on any day they play a match, send an event, unlock an achievement, or record a progression event, using the time from your data. To create one, go to Reports, click New report, and choose Retention report.
The report charts daily, weekly, and monthly active players over the selected date range, with average D1, D7, and D30 retention across all cohorts, weighted by cohort size. It also shows the averages for daily, weekly, and monthly active players and for stickiness, which DAU/MAU for games explains:


Below that is the cohort table, with one row per first day, newest first. Darker cells mean higher retention, and a cell stays empty until its day has ended, so the newest cohorts only show D1:


Days are calendar days in UTC, and the report covers the last 90 days of cohorts unless you choose another date range. The same numbers are available from the retention report endpoint, and you can ask Claude about them through MCP, for example What was our D7 retention for players who started last week?
Find where new players stop
A low D1 retention usually points to the first session: the tutorial, the first levels, or the first match. To find the exact step where new players stop, measure completion rates for your early levels, as shown in how to find which levels players get stuck on.
Frequently asked questions
What is D1 retention?
D1 retention is the share of new players who play again on the day after their first day. If 100 players start on Monday and 35 play on Tuesday, D1 retention is 35%.
Does day 0 count as day 1?
No. Day 0 is the player's first day, when every player in the cohort is active by definition. Day 1 is the next day.
What is the difference between retention and churn?
Retention measures the share of players who come back. Churn measures the share who stop playing. With classic retention, 100% minus D30 retention is not the same as churn, because a player who did not play on day 30 may still play on day 31.
What is a good D1 retention for a mobile game?
In GameAnalytics' benchmarks for 2025, the median mobile game had about 22% D1 retention, the top 25% had just above 30%, and the top 10% had about 40%.