Метрики продукта: 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): считать строки событий нельзя, иначе пользователь, добавивший товар в корзину трижды, утроит шаг воронки. И различайте два вида конверсии: сквозную (от первого шага к текущему) и пошаговую (от предыдущего шага). Пошаговая показывает, где именно рвётся воронка, сквозная — сколько доходит до цели.
Три подвоха, которые стоит назвать самому:
- Порядок шагов не проверяется. В запросе выше пользователь мог купить, не заходя в корзину (например, в один клик) — и всё равно попадёт в «purchase». Строгая воронка требует проверки последовательности и временного окна.
- Окно конверсии. Пользователь 3 положил товар в корзину на следующий день. Если окно — сутки, он выпадет из воронки.
- Знаменатель. Конверсия «от всех visit» и «от тех, кто дошёл до корзины» — разные числа, и путаница между ними даёт вечные споры на планёрках.
Типичные ошибки кандидатов
- Перечисляют метрики списком, не спросив, что за продукт и какая у него бизнес-модель.
- Считают MAU как сумму DAU за месяц.
- Считают retention без когорт — «сколько активных сегодня из активных вчера», что смешивает старых и новых.
- Строят воронку по числу событий вместо уникальных пользователей.
- Не задают вопрос об окне конверсии и определении «активного пользователя».
Как ответить кратко
«Сначала уточню, что считается активностью и какая бизнес-модель, — без этого метрики не имеют смысла. DAU и MAU показывают охват, их отношение (sticky factor) — интенсивность использования, но обе растут от рекламы, поэтому одни они бесполезны. Настоящее здоровье продукта показывает когортный retention: берём пришедших в один день и смотрим долю активных на день 1, 7, 30. Если кривая выходит на плато — есть ядро, продукт может расти органически; если падает в ноль — рост придётся покупать вечно. Воронку считаю по уникальным пользователям, а не по событиям, и отдельно смотрю пошаговую конверсию, чтобы понять, где именно теряем».