Метрики продукта: DAU, retention и воронка

«Какие метрики вы бы смотрели у нашего продукта?» — вопрос без правильного ответа, но с массой неправильных.

Retention — доля пользователей из когорты, вернувшихся в продукт спустя N дней после первого визита. Это единственная метрика, которую нельзя купить рекламой.

Вопрос 1. Что такое DAU, MAU и sticky factor?

Что проверяет интервьюер. Понимаете ли вы, что метрика — это не число, а определение. Два аналитика посчитают DAU по-разному, если не договорятся, кто такой «активный пользователь»: открыл приложение, совершил целевое действие или просто получил пуш.

  • DAU — уникальные активные пользователи за день.
  • MAU — уникальные активные за 30 дней. Важно: MAU ≠ сумма DAU, потому что один человек считается один раз.
  • Sticky factor = DAU / MAU — доля месячной аудитории, приходящая в средний день. Для мессенджера норма 50%+, для сервиса заказа такси — 10–15%, для банковского приложения — около 20%. Само по себе число ничего не значит без сравнения с продуктом того же класса.

Главный подвох: DAU растёт от рекламы. Можно залить бюджет, увидеть рост DAU и решить, что продукт стал лучше — хотя новые пользователи уйдут через неделю. Поэтому DAU всегда смотрят вместе с retention и разложением на новых, вернувшихся и реактивированных.

Вопрос 2. Что такое retention и как его считать?

Retention считают по когортам: берём всех, кто пришёл в один день (или неделю), и смотрим, какая доля из них активна на день N.

cohort = {
    1: [0, 1, 3, 7, 30], 2: [0, 1, 3],   3: [0, 1, 7], 4: [0],
    5: [0, 1, 3, 7, 30], 6: [0, 3],      7: [0],       8: [0, 1],
    9: [0, 1, 3, 7],    10: [0],
}

size = len(cohort)
for day in (1, 3, 7, 30):
    alive = sum(1 for days in cohort.values() if day in days)
    print(f"Day {day}: {alive}/{size} = {round(100 * alive / size, 1)}%")

Вывод:

Day 1: 6/10 = 60.0%
Day 3: 5/10 = 50.0%
Day 7: 4/10 = 40.0%
Day 30: 2/10 = 20.0%

Три уточнения, которые отличают уверенный ответ:

  • Classic (N-day) retention — активен именно на день N. Строгая метрика, подходит продуктам с ежедневным использованием.
  • Rolling (unbounded) retention — активен на день N или позже. Мягче, подходит сервисам редкого использования вроде бронирования отелей.
  • Range retention — активен в интервале дней (например, 7–14). Компромисс, чаще всего используется в мобильной аналитике.

И главное свойство кривой retention: если она выходит на плато, у продукта есть ядро вернувшихся пользователей и бизнес может расти. Если кривая уходит в ноль, каждый новый пользователь куплен навсегда — рост будет стоить ровно столько, сколько вы платите за трафик.

Вопрос 3. Как считать конверсию воронки?

Воронка — последовательность шагов от первого касания до целевого действия. На собеседовании часто просят написать SQL по событиям:

CREATE TABLE events (user_id INTEGER, step TEXT, dt TEXT);
INSERT INTO events VALUES
 (1,'visit','2026-03-01'),(1,'cart','2026-03-01'),(1,'checkout','2026-03-01'),(1,'purchase','2026-03-01'),
 (2,'visit','2026-03-01'),(2,'cart','2026-03-01'),
 (3,'visit','2026-03-01'),(3,'cart','2026-03-02'),(3,'checkout','2026-03-02'),
 (4,'visit','2026-03-01'),
 (5,'visit','2026-03-02'),(5,'cart','2026-03-02'),(5,'checkout','2026-03-02'),(5,'purchase','2026-03-02');

SELECT
  COUNT(DISTINCT CASE WHEN step='visit'    THEN user_id END) AS visit,
  COUNT(DISTINCT CASE WHEN step='cart'     THEN user_id END) AS cart,
  COUNT(DISTINCT CASE WHEN step='checkout' THEN user_id END) AS checkout,
  COUNT(DISTINCT CASE WHEN step='purchase' THEN user_id END) AS purchase,
  ROUND(100.0 * COUNT(DISTINCT CASE WHEN step='purchase' THEN user_id END)
              / COUNT(DISTINCT CASE WHEN step='visit' THEN user_id END), 1) AS cr_total
FROM events;

Вывод:

visit  cart  checkout  purchase  cr_total
5      4     3         2         40.0

Обратите внимание на COUNT(DISTINCT user_id): считать строки событий нельзя, иначе пользователь, добавивший товар в корзину трижды, утроит шаг воронки. И различайте два вида конверсии: сквозную (от первого шага к текущему) и пошаговую (от предыдущего шага). Пошаговая показывает, где именно рвётся воронка, сквозная — сколько доходит до цели.

Три подвоха, которые стоит назвать самому:

  1. Порядок шагов не проверяется. В запросе выше пользователь мог купить, не заходя в корзину (например, в один клик) — и всё равно попадёт в «purchase». Строгая воронка требует проверки последовательности и временного окна.
  2. Окно конверсии. Пользователь 3 положил товар в корзину на следующий день. Если окно — сутки, он выпадет из воронки.
  3. Знаменатель. Конверсия «от всех visit» и «от тех, кто дошёл до корзины» — разные числа, и путаница между ними даёт вечные споры на планёрках.

Типичные ошибки кандидатов

  • Перечисляют метрики списком, не спросив, что за продукт и какая у него бизнес-модель.
  • Считают MAU как сумму DAU за месяц.
  • Считают retention без когорт — «сколько активных сегодня из активных вчера», что смешивает старых и новых.
  • Строят воронку по числу событий вместо уникальных пользователей.
  • Не задают вопрос об окне конверсии и определении «активного пользователя».

Как ответить кратко

«Сначала уточню, что считается активностью и какая бизнес-модель, — без этого метрики не имеют смысла. DAU и MAU показывают охват, их отношение (sticky factor) — интенсивность использования, но обе растут от рекламы, поэтому одни они бесполезны. Настоящее здоровье продукта показывает когортный retention: берём пришедших в один день и смотрим долю активных на день 1, 7, 30. Если кривая выходит на плато — есть ядро, продукт может расти органически; если падает в ноль — рост придётся покупать вечно. Воронку считаю по уникальным пользователям, а не по событиям, и отдельно смотрю пошаговую конверсию, чтобы понять, где именно теряем».

Проверьте себя
1. Почему MAU нельзя получить сложением DAU за 30 дней?
AПотому что в месяце бывает 31 день
BПотому что MAU считает уникальных пользователей, а один человек за месяц зайдёт много раз и в сумме DAU учтётся многократно
CПотому что DAU считается только по мобильным устройствам
DПотому что MAU включает неактивных пользователей
2. Кривая retention когорты выходит на плато около 25% к 30-му дню. Что это значит для бизнеса?
AПродукт умирает: три четверти пользователей ушли
BУ продукта есть ядро возвращающихся пользователей, поэтому база может расти органически, а не только за счёт закупки трафика
CМетрика посчитана неверно: retention не может выходить на плато
DНужно немедленно увеличить рекламный бюджет
3. Почему шаги воронки считают через COUNT(DISTINCT user_id), а не COUNT(*)?
ACOUNT(*) работает медленнее
BИначе пользователь, повторивший событие несколько раз, увеличит шаг воронки в несколько раз и конверсия будет посчитана неверно
CCOUNT(*) не работает с CASE WHEN
DПотому что события хранятся с дубликатами по техническим причинам