Как посчитать activation rate в SQL

Закрепи формулу activation rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать activation rate в Telegram

Что такое activation rate

Activation rate — доля новых юзеров, дошедших до core value продукта в нужном окне. У Slack — отправил 2000 сообщений в команде. У Карьерника — закончил первую тренировку. У Spotify — послушал 30+ минут за первую неделю.

Не путать с регистрацией. Регистрация — формальный момент. Активация — момент, когда юзер «прочувствовал» ценность продукта и склонен вернуться.

На собесе аналитика и продакта спросят: «Какое событие выбрать как активацию?» Ответ — то, которое сильнее всего коррелирует с D7+ retention.

Выбор события активации

Стандартный подход — найти magic number через корреляцию с retention:

  1. Берём 5-10 событий-кандидатов («open app 3 times», «complete profile», «invite friend», «view 5 posts»)
  2. Считаем D7-retention тех, кто сделал событие vs не сделал
  3. Выбираем событие с самым большим разрывом
-- Кандидат: «открыл приложение 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.

Закрепи формулу activation rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать activation rate в Telegram

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.

Это официальная информация?

Нет. Статья основана на индустриальных практиках.