Как посчитать activation rate в SQL
payments(user_id) и refunds(user_id). Нужно получить пользователей, у которых был платёж, но не было ни одного возврата. Какой запрос корректнее всего описывает задачу?Содержание:
Что такое activation rate
Activation rate — доля новых пользователей, дошедших до ключевой ценности продукта (core value) в нужном окне. У Slack — отправил 2000 сообщений в команде. У Карьерника — закончил первую тренировку. У Spotify — послушал 30+ минут за первую неделю.
Не путать с регистрацией. Регистрация — формальный момент. Активация — момент, когда пользователь «прочувствовал» ценность продукта и склонен вернуться.
На собесе аналитика и продакта спросят: «Какое событие выбрать как активацию?» Ответ — то, которое сильнее всего коррелирует с D7+ retention.
Выбор события активации
Стандартный подход — найти magic number через корреляцию с retention:
- Берём 5-10 событий-кандидатов («open app 3 times», «complete profile», «invite friend», «view 5 posts»)
- Считаем D7-retention тех, кто сделал событие, и тех, кто не сделал
- Выбираем событие с самым большим разрывом
-- Кандидат: «открыл приложение 3+ раза в первую неделю»
WITH new_users AS (
SELECT user_id, signup_date
FROM users
WHERE signup_date BETWEEN '2026-01-01' AND '2026-01-31'
),
candidate_event AS (
SELECT
nu.user_id,
COUNT(DISTINCT DATE(e.created_at)) >= 3 AS did_event
FROM new_users nu
LEFT JOIN events e
ON e.user_id = nu.user_id
AND e.event_type = 'app_open'
AND e.created_at BETWEEN nu.signup_date AND nu.signup_date + INTERVAL '7 days'
GROUP BY nu.user_id
),
d7_retention AS (
SELECT
nu.user_id,
EXISTS (
SELECT 1 FROM events e
WHERE e.user_id = nu.user_id
AND e.created_at::DATE = nu.signup_date::DATE + 7
) AS retained_d7
FROM new_users nu
)
SELECT
ce.did_event,
ROUND(AVG(CASE WHEN dr.retained_d7 THEN 1.0 ELSE 0 END), 3) AS d7_retention,
COUNT(*) AS users
FROM candidate_event ce
JOIN d7_retention dr USING (user_id)
GROUP BY ce.did_event;Если у did_event = TRUE retention 40%, у did_event = FALSE — 8%, разрыв в 5 раз. Это сильная активация.
SQL: общий activation rate
После того как событие выбрано:
WITH new_users AS (
SELECT user_id, signup_date
FROM users
WHERE signup_date BETWEEN '2026-04-01' AND '2026-04-30'
),
activated AS (
SELECT DISTINCT nu.user_id
FROM new_users nu
JOIN events e
ON e.user_id = nu.user_id
AND e.event_type = 'first_session_completed'
AND e.created_at BETWEEN nu.signup_date AND nu.signup_date + INTERVAL '7 days'
)
SELECT
COUNT(DISTINCT nu.user_id) AS new_users,
COUNT(DISTINCT a.user_id) AS activated_users,
ROUND(COUNT(DISTINCT a.user_id)::NUMERIC / NULLIF(COUNT(DISTINCT nu.user_id), 0), 3) AS activation_rate
FROM new_users nu
LEFT JOIN activated a USING (user_id);Получите долю активированных — это activation rate.
SQL: активация по когортам
Чтобы видеть тренд:
WITH cohorts AS (
SELECT
user_id,
DATE_TRUNC('week', signup_date)::DATE AS cohort_week,
signup_date
FROM users
),
activated AS (
SELECT
c.cohort_week,
c.user_id,
EXISTS (
SELECT 1 FROM events e
WHERE e.user_id = c.user_id
AND e.event_type = 'first_session_completed'
AND e.created_at BETWEEN c.signup_date AND c.signup_date + INTERVAL '7 days'
) AS activated
FROM cohorts c
)
SELECT
cohort_week,
COUNT(*) AS new_users,
SUM(CASE WHEN activated THEN 1 ELSE 0 END) AS activated_users,
ROUND(SUM(CASE WHEN activated THEN 1.0 ELSE 0 END) / NULLIF(COUNT(*), 0), 3) AS activation_rate
FROM activated
GROUP BY 1
ORDER BY 1;Активация в окне (D7, D30)
Окно зависит от продукта. Часто — D1 (быстрая активация), D7 (стандарт для b2c), D30 (для b2b с длинным циклом).
Принцип: фильтр e.created_at BETWEEN signup_date AND signup_date + INTERVAL 'N days' меняется с N=1, 7, 30.
Сами запросы из статьи — оконные функции, JOIN и фильтрацию когорт — стоит отработать на практике: на онлайн-тренажёре SQL-задач собрано 1500+ заданий с разбором.
Примеры с собеседований
Активацию на собесе проверяют на умении выбрать событие.
«Какое событие выбрать как активацию?» Слабый ответ — «регистрацию» или произвольное действие. Сильный: то, которое сильнее всего коррелирует с дальнейшим удержанием. Метод — сравнить D7-retention тех, кто сделал событие-кандидат, и тех, кто не сделал, и взять с максимальным разрывом.
«Activation rate вырос, а retention нет — что не так?» Сильный ответ: скорее всего, выбрано слабое событие активации, которое не предсказывает возврат, либо слишком длинное окно, где «активация» на D29 — это просто попадание в DAU. Событие пересматривают по связи с retention.
«Какое окно брать для активации?» Сильный ответ: то, в котором пользователь получает ключевую ценность продукта: для B2C это часто D1–D7, для B2B с длинным циклом — D14–D30. Слишком длинное окно превращает метрику в бессмысленную. Прогнать такие вопросы можно в Карьернике.
Частые ошибки
Считать активацией регистрацию. Регистрация — это не активация. Пользователь должен сделать что-то ценное.
Окно слишком длинное. Если окно 30 дней и пользователь активируется на D29 — это уже не «активация», а просто включение в DAU. Окно должно быть достаточно коротким.
Не учитывать часовой пояс. Пользователь из UTC+3 регистрируется в 23:00 — у него «первый день» наступает уже завтра по серверу. Приводите signup_date::DATE к одному часовому поясу.
Включать сегодняшние регистрации. Пользователь, зарегистрировавшийся 2 часа назад, не имел шанса активироваться за 7 дней. Считайте только когорты, где окно полностью прошло.
Считать активацию на агрегатной таблице без проверки качества данных. Дубликаты регистраций → завышенный знаменатель → заниженная активация. Используйте DISTINCT user_id.
FAQ
Какая activation rate считается хорошей?
Универсального ориентира нет, всё зависит от типа продукта. Для B2C-приложения хорошим считается 30–50% на D7, для B2B SaaS — 15–30% на D14–D30, для маркетплейса — 10–20% на D7 (первая покупка).
Какое окно использовать?
Берите окно, за которое пользователь успевает почувствовать ценность продукта. Для соцсети это обычно D1–D3, для SaaS — D7–D14, для покупочного приложения — около D7.
Это официальная информация?
Нет, это не официальная информация. Статья опирается на общепринятые индустриальные практики, а не на документацию конкретного продукта.