Что такое Retention и почему это метрика №1
Retention — это доля пользователей, которые вернулись в продукт через определённое время после первого визита (или другого ключевого действия). Если из 1000 новых пользователей через неделю вернулось 200 — Day-7 Retention равен 20%.
Почему это метрика номер один? Потому что без удержания всё остальное бессмысленно. Можно привлечь миллион пользователей, но если они уходят через день — нет ни выручки, ни роста, ни продукта. Retention показывает, нашёл ли продукт свою ценность для пользователя.
Зачем Retention продуктовому аналитику
Classic, Rolling, Range — какой бывает Retention
Существует несколько способов считать Retention. Они дают разные числа для одних и тех же данных — и это нормально. Важно понимать, какой тип подходит для вашей задачи.
Когда использовать какой тип
| Тип | Когда использовать | Пример продукта |
|---|---|---|
| Classic Day-N | Стандарт в индустрии. Подходит для ежедневных продуктов с высокой частотой использования | Социальные сети, мессенджеры, мобильные игры |
| Rolling Day-N+ | Когда важно знать, остался ли пользователь вообще. Подходит для продуктов с разной частотой | E-commerce, маркетплейсы, SaaS |
| Range (Window) | Когда ежедневная гранулярность — шум. Берут недельные или месячные окна | B2B-продукты, подписки, Авито |
Стандартные точки измерения
В индустрии устоялись несколько ключевых временных точек. Каждая говорит о разном:
SQL-запросы для расчёта Retention
На собеседованиях в BigTech вас попросят написать SQL-запрос для расчёта retention. Ниже — три варианта, от простого к продвинутому.
Запрос 1: Classic Day-N Retention
Самый частый вопрос на собесе: «Посчитайте Day-1 и Day-7 Retention по когортам». Предполагаем таблицу user_activity с полями user_id и activity_date, и таблицу users с полем registration_date.
WITH cohorts AS ( SELECT u.user_id, DATE_TRUNC('month', u.registration_date) AS cohort_month FROM users u ), activity AS ( SELECT DISTINCT a.user_id, a.activity_date FROM user_activity a ) SELECT c.cohort_month, COUNT(DISTINCT c.user_id) AS cohort_size, -- Day-1 Retention ROUND(100.0 * COUNT(DISTINCT CASE WHEN a.activity_date = c.registration_date + 1 THEN c.user_id END) / COUNT(DISTINCT c.user_id), 2) AS day_1_retention, -- Day-7 Retention ROUND(100.0 * COUNT(DISTINCT CASE WHEN a.activity_date = c.registration_date + 7 THEN c.user_id END) / COUNT(DISTINCT c.user_id), 2) AS day_7_retention, -- Day-30 Retention ROUND(100.0 * COUNT(DISTINCT CASE WHEN a.activity_date = c.registration_date + 30 THEN c.user_id END) / COUNT(DISTINCT c.user_id), 2) AS day_30_retention FROM cohorts c LEFT JOIN activity a ON c.user_id = a.user_id GROUP BY c.cohort_month ORDER BY c.cohort_month;
Запрос 2: Rolling Retention (Day-N+)
SELECT DATE_TRUNC('month', u.registration_date) AS cohort_month, COUNT(DISTINCT u.user_id) AS cohort_size, ROUND(100.0 * COUNT(DISTINCT CASE WHEN a.activity_date >= u.registration_date + 7 THEN u.user_id END) / COUNT(DISTINCT u.user_id), 2) AS rolling_day7_retention FROM users u LEFT JOIN (SELECT DISTINCT user_id, activity_date FROM user_activity) a ON u.user_id = a.user_id GROUP BY 1 ORDER BY 1;
Разница с Classic — одно слово: >= вместо =. Мы считаем всех, кто пришёл в день 7 или позже. Число будет выше, чем Classic — и это нормально.
Запрос 3: Полная когортная таблица Retention
Это самый мощный запрос — он строит матрицу «когорта × период», которую потом визуализируют как heatmap. Именно это обычно просят на финальных собесах.
WITH cohorts AS ( SELECT user_id, DATE_TRUNC('month', registration_date) AS cohort FROM users ), monthly_activity AS ( SELECT DISTINCT user_id, DATE_TRUNC('month', activity_date) AS active_month FROM user_activity ), cohort_data AS ( SELECT c.cohort, -- Период: сколько месяцев прошло DATE_PART('month', AGE(m.active_month, c.cohort) )::INT AS period, c.user_id FROM cohorts c JOIN monthly_activity m ON c.user_id = m.user_id WHERE m.active_month >= c.cohort ) SELECT cohort, period, COUNT(DISTINCT user_id) AS active_users, ROUND(100.0 * COUNT(DISTINCT user_id) / FIRST_VALUE(COUNT(DISTINCT user_id)) OVER (PARTITION BY cohort ORDER BY period), 1) AS retention_pct FROM cohort_data GROUP BY cohort, period ORDER BY cohort, period;
Когортная таблица: как читать Retention heatmap
Когортная таблица — это стандартный способ представить retention. По строкам — когорты (месяц регистрации), по столбцам — период (0, 1, 2, 3... месяца после регистрации). В ячейках — процент вернувшихся. Вот пример для e-commerce продукта:
| Когорта | Месяц 0 | Месяц 1 | Месяц 2 | Месяц 3 | Месяц 4 | Месяц 5 |
|---|---|---|---|---|---|---|
| Янв 2025 | 100% | 42% | 28% | 21% | 18% | 16% |
| Фев 2025 | 100% | 45% | 31% | 24% | 20% | |
| Мар 2025 | 100% | 48% | 35% | 27% | ||
| Апр 2025 | 100% | 50% | 37% | |||
| Май 2025 | 100% | 47% |
Как читать эту таблицу
Три направления чтения дают три разных инсайта:
Как интерпретировать Retention: паттерны и ловушки
Паттерн 1: DAU вырос, а Retention упал
Классический кейс на собеседовании. Типичная причина: маркетинг привлёк много нецелевых пользователей. DAU вырос за счёт новых, но они не задерживаются — retention падает. Для диагностики нужно разбить когорту на сегменты по источнику трафика и посмотреть, отличается ли retention между ними.
Паттерн 2: Retention вырос, а Revenue не вырос
Пользователи возвращаются, но не платят. Возможные причины: удержание растёт среди бесплатных пользователей, а платящие ведут себя так же. Или — пользователи возвращаются «лёгким» паттерном (открыл приложение, не совершив целевое действие). Нужно смотреть не просто на «визит», а на качественные действия.
Паттерн 3: Новая когорта хуже предыдущей
Retention падает от когорты к когорте — столбец вниз в таблице. Возможные причины: изменился канал привлечения (пришли менее качественные пользователи), сломался онбординг, сезонность. Первым делом стоит сегментировать по источнику и проверить, не изменился ли микс каналов.
Бенчмарки Retention по типам продуктов
Бенчмарки — это ориентиры, а не цели. Они сильно зависят от типа продукта, рынка и стадии. Но знать их полезно, чтобы понимать контекст и адекватно оценивать свои цифры.
| Тип продукта | Day-1 | Day-7 | Day-30 |
|---|---|---|---|
| Социальные сети | 40–60% | 25–40% | 15–25% |
| E-commerce / Маркетплейсы | 20–30% | 10–20% | 5–15% |
| Мобильные игры | 30–50% | 15–25% | 5–10% |
| SaaS (B2B) | 80–95% | 70–85% | 60–80% |
| Fintech | 25–40% | 15–25% | 10–20% |
Вопросы про Retention на собесе в BigTech
Retention — тема, которая появляется практически на каждом собеседовании продуктового аналитика. Вот реальные типы вопросов:
- Как посчитать Day-7 Retention? Напишите SQL-запрос.
- В чём разница между Classic Retention и Rolling Retention? Когда что использовать?
- DAU упал на 15%. Как вы будете разбираться в причинах? Как retention поможет в диагностике?
- Что такое DAU/MAU ratio и что значит значение 20%? А 60%? Как оно связано с retention?
- Постройте когортную таблицу Retention для e-commerce. Какие выводы можно сделать?
- Retention нового онбординга вырос на 3%, но GMV упал на 2%. Запускать или нет?
- Как отличить реальное улучшение retention от сезонности? Какие данные нужны?
- У нас маркетплейс. Какой retention считать — для покупателей или для продавцов? Почему?
Как отвечать на кейсовый вопрос про retention
Алгоритм, который работает на собесе:
Связанные материалы
Главное про Retention
Retention — не просто одна из метрик, а фундамент всей продуктовой аналитики. Если пользователи не возвращаются — не работают ни привлечение, ни монетизация, ни рост.
На собеседовании в BigTech от вас ждут не только знания формулы, но и умение выбрать правильный тип retention, написать SQL-запрос, построить когортную таблицу и — главное — объяснить, что за цифрами стоит и какие решения они подсказывают.
Следующий шаг: попробуйте написать SQL-запрос для когортного retention на любом открытом датасете (Olist на Kaggle — хороший вариант). Это лучший способ закрепить понимание.
