активацияaha-momentretentionпродуктовая аналитикаSQLкогортный анализA/B-тесты

Метрика активации и Aha-moment: как найти

2026-07-06 11 мин

Короткий ответ (BLUF): метрика активации — это одно измеримое действие в первые дни жизни пользователя, которое сильнее всего коррелирует с тем, что он останется с продуктом. Чтобы её найти: разбейте юзеров на две когорты (удержались / отвалились), сравните их раннее поведение и найдите действие, которое почти всегда есть у первых и почти всегда отсутствует у вторых. Классические примеры — «7 друзей за 10 дней» у крупной соцсети и «2 транзакции за 30 дней» у платёжных сервисов. Но найденная корреляция — только гипотеза: перед тем как строить продукт вокруг неё, проверьте причинность A/B-тестом. Ниже — SQL для поиска, формула активации и как встроить её в воронку.

Что такое активация и Aha-moment

Пользователь регистрируется. Дальше два сценария: либо он понял, зачем ему продукт, и возвращается, либо закрыл вкладку и не вспомнил. Aha-moment — это тот самый момент, когда до человека доходит ценность. Не «я зарегистрировался», а «я получил то, ради чего пришёл».

Для аналитика важно, что Aha-moment — это не абстракция про эмоции, а конкретное поведение в логах. У командный мессенджер (беру как обезличенный пример механики) это было «команда обменялась 2000 сообщениями», у облачного хранилища — «загрузил хотя бы один файл на одно устройство и увидел его на другом». Задача аналитика — превратить размытое «понял ценность» в измеримое событие с порогом и окном: *действие X* повторить *N раз* за *T дней*.

Метрика активации — доля новых пользователей, которые дошли до этого события. Это верхнеуровневый KPI, который вы кладёте в дашборд и отслеживаете по когортам. Aha-moment — это гипотеза о том, *какое именно* действие взять за основу активации.

Разница в терминах, которую путают на собеседованиях (её любят спрашивать — см. типовые вопросы в разделе /interviews):

Активация стоит между регистрацией и retention и работает как ранний предиктор: по ней вы понимаете судьбу когорты, не дожидаясь 30 дней.

Почему активация — ключ к retention

Retention измеряется с лагом. Чтобы узнать D30-retention когорты, надо ждать 30 дней. Это неудобно: вы залили новый онбординг, а результат увидите через месяц. Активация же измеряется в первые дни и сильно коррелирует с будущим удержанием — значит, служит опережающим индикатором (leading metric).

Логика простая. Если пользователи, которые активировались, удерживаются на D30 в 45%, а неактивированные — в 6%, то поднимая долю активированных, вы почти механически поднимаете retention всей воронки. Формула вклада:

$$\text{Retention}_{D30} = p_{act} \cdot r_{act} + (1 - p_{act}) \cdot r_{noact}$$

где $p_{act}$ — доля активированных, $r_{act}$ и $r_{noact}$ — их retention. Подставим: $p_{act}=0{,}30$, $r_{act}=0{,}45$, $r_{noact}=0{,}06$:

$$0{,}30 \cdot 0{,}45 + 0{,}70 \cdot 0{,}06 = 0{,}135 + 0{,}042 = 0{,}177$$

Итого D30 = 17,7%. Теперь поднимем активацию до 40% (те же ставки удержания):

$$0{,}40 \cdot 0{,}45 + 0{,}60 \cdot 0{,}06 = 0{,}18 + 0{,}036 = 0{,}216$$

Retention вырос с 17,7% до 21,6% — плюс 4 процентных пункта только за счёт сдвига активации на 10 п.п. Вот почему продуктовые команды дерутся именно за активацию: рычаг короткий, эффект на удержание — большой. Как retention считать по когортам SQL-ом, разбирали в блоге про когортный анализ; здесь фокус на том, что стоит *до* retention.

Как найти Aha-moment по данным

Ключевая идея: сравнить раннее поведение удержавшихся и отвалившихся когорт и найти действие, которое их различает сильнее всего. Пошагово.

Шаг 1. Определите «удержался». Например, был активен на 4-й неделе после регистрации. Это ваш таргет — бинарная метка retained = 1/0.

Шаг 2. Соберите кандидаты в Aha-действия. Мозговым штурмом с продактом выпишите 10–20 событий первой недели: добавил друга, создал проект, загрузил файл, прошёл урок, сделал заказ, настроил интеграцию. Для каждого — счётчик за первые 7 дней.

Шаг 3. Постройте таблицу «действие → retention». Для каждого кандидата и каждого порога N считаете: какой retention у тех, кто сделал действие ≥ N раз, против тех, кто сделал < N раз. Ищете максимальный разрыв (lift).

Шаг 4. Найдите точку перегиба (порог N). Часто retention растёт с числом действий не линейно, а с изломом: после определённого N кривая выходит на плато. Этот излом и есть кандидат в порог активации. У крупная соцсеть так родилось «7 друзей за 10 дней» — на 7 друзьях кривая удержания резко выпрямлялась.

Важно: вы ищете не просто «действие, которое делают удержавшиеся», а действие с сильной дискриминирующей способностью — большим разрывом retention между сделавшими и не сделавшими, и при этом достаточно массовое (если действие делают 2% юзеров, оно не годится в активацию, даже если разрыв огромный).

SQL для поиска: когорты и корреляция действия с возвратом

Разберём на модельной схеме. Таблицы:

Сначала считаем для каждого юзера число ключевых действий в первые 7 дней и флаг retained. Возьмём кандидат «добавил друга» (add_friend):

WITH first_week AS (
    SELECT
        u.user_id,
        u.signup_date,
        COUNT(*) FILTER (
            WHERE e.event_name = 'add_friend'
              AND e.event_ts < u.signup_date + INTERVAL '7 days'
        ) AS friends_7d
    FROM users u
    LEFT JOIN events e ON e.user_id = u.user_id
    GROUP BY u.user_id, u.signup_date
),
retained AS (
    SELECT DISTINCT u.user_id
    FROM users u
    JOIN events e ON e.user_id = u.user_id
    WHERE e.event_ts >= u.signup_date + INTERVAL '21 days'
      AND e.event_ts <  u.signup_date + INTERVAL '28 days'
)
SELECT
    fw.friends_7d,
    COUNT(*)                                            AS users,
    COUNT(r.user_id)                                    AS retained_users,
    ROUND(100.0 * COUNT(r.user_id) / COUNT(*), 1)       AS retention_pct
FROM first_week fw
LEFT JOIN retained r ON r.user_id = fw.user_id
GROUP BY fw.friends_7d
ORDER BY fw.friends_7d;

Результат — таблица «сколько друзей за неделю → какой retention»:

friends_7dusersretention_pct
042004,1
118009,8
2110018,2
372027,5
451034,1
538039,7
626043,0
719051,2
8+34053,8

Виден излом: до 4 друзей retention растёт круто, дальше замедляется, и на 7 выходит плато около 51–54%. Порог = 7, окно = 10 дней (в реальности порог и окно подбирают вместе — можно расширить окно до 10 дней и пересчитать).

Теперь оцените силу связи для порога. Сравним retention «сделал ≥ 7» против «< 7» и посчитаем lift:

WITH scored AS (
    SELECT
        fw.user_id,
        (fw.friends_7d >= 7) AS activated,
        (r.user_id IS NOT NULL) AS retained
    FROM first_week fw
    LEFT JOIN retained r ON r.user_id = fw.user_id
)
SELECT
    activated,
    COUNT(*)                                              AS users,
    ROUND(100.0 * AVG(retained::int), 1)                  AS retention_pct
FROM scored
GROUP BY activated;

Если получится 50% против 8% — это разрыв в 6 раз, сильный сигнал. Чтобы перебрать не один кандидат, а все сразу, оберните расчёт в цикл по event_name через GROUP BY event_name в CTE и посчитайте для каждого lift. Сравнивать удобно по корреляции точечно-бисериального типа (числовое действие vs бинарный retained) — по сути это то же, что разрыв средних, нормированный на разброс.

Хотите потренировать такие оконные и когортные запросы на живом PostgreSQL — соберите этот разбор в /sql-sandbox: там запросы гоняются в браузере на настоящем движке, а похожие продуктовые задачи с данными лежат в /tasks и /cases.

Как определить метрику активации и поставить её в воронку

Когда Aha-действие и порог найдены, формализуйте метрику активации как одно предложение по шаблону:

*N штук действия X за T дней после регистрации.*

Примеры формулировок:

Метрика активации = доля новых юзеров, дошедших до этого условия:

$$\text{Activation Rate} = \frac{\text{юзеры, выполнившие условие за }T\text{ дней}}{\text{все зарегистрированные в когорте}}$$

Дальше — воронка. Активация встаёт отдельным шагом между регистрацией и первым retention:

Регистрация → Первое ключевое действие → АКТИВАЦИЯ (порог N за T дней) → Retention D7 → Retention D30

Считаем воронку по когорте регистраций одного месяца:

WITH cohort AS (
    SELECT user_id, signup_date
    FROM users
    WHERE signup_date >= DATE '2026-06-01'
      AND signup_date <  DATE '2026-07-01'
),
acted AS (   -- хотя бы одно ключевое действие
    SELECT DISTINCT c.user_id
    FROM cohort c
    JOIN events e ON e.user_id = c.user_id
    WHERE e.event_name = 'add_friend'
      AND e.event_ts < c.signup_date + INTERVAL '10 days'
),
activated AS ( -- достигли порога 7
    SELECT c.user_id
    FROM cohort c
    JOIN events e ON e.user_id = c.user_id
     AND e.event_name = 'add_friend'
     AND e.event_ts < c.signup_date + INTERVAL '10 days'
    GROUP BY c.user_id
    HAVING COUNT(*) >= 7
)
SELECT
    (SELECT COUNT(*) FROM cohort)                                          AS registered,
    (SELECT COUNT(*) FROM acted)                                           AS did_first_action,
    (SELECT COUNT(*) FROM activated)                                       AS activated,
    ROUND(100.0 * (SELECT COUNT(*) FROM activated)
                / (SELECT COUNT(*) FROM cohort), 1)                        AS activation_rate_pct;

Практические советы по воронке:

Готовые формулы retention, activation, DAU/WAU и других продуктовых метрик со связями лежат в /metrics — удобно свериться, когда собираете дашборд.

Отличие корреляции от причинности: проверяем A/B

Здесь начинается главная ловушка, на которой валятся и джуны, и синьоры. Вы нашли, что «юзеры с 7 друзьями удерживаются в 6 раз лучше». Соблазн: «Давайте заставим всех добавить 7 друзей — и retention взлетит». Это ошибка вывода причинности из корреляции.

Проблема в том, что «7 друзей» может быть не *причиной* удержания, а его *симптомом*. Возможные альтернативные объяснения:

Как отличить симптом от рычага? Рандомизированный эксперимент. Берёте новых юзеров, случайно делите на две группы. Тестовой группе продукт активно подталкивает к Aha-действию (онбординг с предложением добавить друзей, импорт контактов, подсказки), контрольной — обычный онбординг. Через 30 дней сравниваете retention.

Мини-схема проверки статзначимости различия конверсий (в retention) на псевдо-SQL для агрегатов:

SELECT
    variant,
    COUNT(*)                               AS n,
    SUM(retained::int)                     AS conv,
    ROUND(AVG(retained::int)::numeric, 4)  AS retention_rate
FROM ab_users
GROUP BY variant;
-- дальше двухвыборочный z-тест пропорций: сравниваем retention_rate групп,
-- считаем p-value; при p < 0.05 разница между вариантами значима

Формула z-статистики для разности долей:

$$z = \frac{\hat{p}_A - \hat{p}_B}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_A}+\frac{1}{n_B}\right)}}, \quad \hat{p} = \frac{x_A + x_B}{n_A + n_B}$$

Правило на практике: любое продуктовое решение, обоснованное найденной активационной корреляцией, должно пройти хотя бы один A/B перед раскаткой на всех. Корреляция даёт гипотезу и метрику для мониторинга — эксперимент даёт право строить на ней продукт. На собеседованиях в продуктовые команды именно этот переход «нашёл корреляцию → предложил A/B → проверил» — то, что отделяет сильного кандидата; типовые кейсы такого разбора собраны в /cases и в подготовке на /sobesedovanie-analitika-dannyh.

Частые вопросы

Чем метрика активации отличается от onboarding-completion?

Onboarding-completion — это «прошёл туториал / заполнил профиль», действие внутри интерфейса, которое вы сами придумали. Метрика активации — действие, которое доказанно предсказывает retention по вашим данным. Иногда они совпадают, но чаще нет: юзер может пройти весь онбординг и отвалиться, а другой — проигнорировать туториал, но сразу сделать Aha-действие и остаться. Всегда проверяйте кандидата на корреляцию с удержанием, а не берите «завершение онбординга» по умолчанию.

Какой порог N и окно T выбрать, если нет явного излома на кривой?

Если кривая retention растёт гладко без плато, берите порог по бизнес-достижимости: точку, где retention уже заметно выше базового, но действие пока делает достаточная доля когорты (ориентир — 20–40% новых юзеров дотягиваются до порога). Слишком высокий порог даёт красивый retention, но применим к горстке людей и бесполезен как рычаг. Окно T подбирайте по распределению time-to-activate — берите p75–p90, чтобы не отрезать медленных активирующихся. Потренировать сам расчёт распределений и оконных функций можно в /python-sandbox.

Может ли быть несколько Aha-моментов у одного продукта?

Да, у разных сегментов — разные. У маркетплейса покупатель активируется первым заказом, а продавец — первой выставленной позицией. У B2B-инструмента admin активируется приглашением команды, а рядовой участник — первым выполненным в продукте действием. Считайте активацию отдельно по ролям и сегментам, иначе смешаете разные механики удержания в одну усреднённую цифру, которая не двигает ничего.

Как понять, что метрику активации пора пересчитать?

Три сигнала: активация растёт, а retention стоит на месте (метрика оторвалась от реальности); вы сильно изменили продукт или онбординг; активационное действие делают уже почти все (порог слишком низкий, метрика перестала различать). Пересчитывайте порог раз в 6 месяцев или после крупных релизов: заново стройте таблицу «действие → retention» на свежих когортах и сверяйте, где теперь излом.


Что делать дальше: возьмите свою последнюю месячную когорту, выберите 5–10 кандидатов в Aha-действия, прогоните запрос «действие → retention» по каждому и найдите тот, что даёт наибольший разрыв при массовости хотя бы 20%. Это ваш кандидат в активацию. Оформите его как «N за T дней», встройте в воронку — и обязательно проверьте A/B, прежде чем строить вокруг него онбординг. Отработать SQL под это можно в /sql-sandbox, а системно подготовиться к продуктовым интервью — на /course.

Практикуйся на реальных задачах
545 SQL + 538 Python задач с автопроверкой, 618 кейсов. Первые — без регистрации.
Решать SQL-задачи в тренажёре →