Как посчитать activation rate в SQL
Содержание:
Что такое 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 тех, кто сделал событие vs не сделал
- Выбираем событие с самым большим разрывом
-- Кандидат: «открыл приложение 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%, разрыв 5x. Это сильная активация.
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: activation по когортам
Чтобы видеть тренд:
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;Activation в окне (D7, D30)
Окно зависит от продукта. Часто — D1 (быстрая активация), D7 (стандарт для b2c), D30 (для b2b с длинным циклом).
Принцип: фильтр e.created_at BETWEEN signup_date AND signup_date + INTERVAL 'N days' меняется с N=1, 7, 30.
Частые ошибки
Считать активацией регистрацию. Регистрация — это не активация. Юзер должен сделать что-то ценное.
Окно слишком длинное. Если окно 30 дней, и юзер активируется на D29 — это уже не «активация», а просто включение в DAU. Окно должно быть достаточно коротким.
Не учитывать timezone. Юзер из UTC+3 регистрируется в 23:00 — у него «первый день» это уже завтра по серверу. Используйте signup_date::DATE в одной TZ.
Включать сегодняшних регистраций. Юзер, зарегистрировавшийся 2 часа назад, не имел шанса активироваться за 7 дней. Считайте только когорты, где окно полностью прошло.
Считать activation на агрегатной таблице без проверки качества данных. Дубликаты регистраций → завышенный знаменатель → заниженная activation. Используйте 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.
Это официальная информация?
Нет. Статья основана на индустриальных практиках.