DAU/MAU stickiness: как мерить вовлечённость пользователей

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Что такое stickiness

Stickiness — отношение DAU к MAU. По смыслу: какая доля месячных активных пользователей заходит в продукт в среднестатистический день. Чем выше — тем чаще среднестатистический активный юзер возвращается.

Формула простая: stickiness = DAU / MAU. Если DAU = 100k и MAU = 500k, то stickiness = 0.20 или 20%. Это значит, что в день в среднем заходит каждый пятый из месячных активных.

Зачем мерить:

  • DAU и MAU поодиночке не показывают вовлечённость, только размер аудитории.
  • Stickiness — простая и понятная метрика, которая отражает "как часто возвращаются".
  • Хороший сигнал здоровья продукта: размер растёт за счёт новых юзеров или старые тоже остаются?

Метрика популяризовалась Facebook в начале 2010-х. С тех пор стала индустриальным стандартом для продуктов с ежедневным использованием.

Какие значения считать нормальными

Никаких "правильных" значений stickiness не существует — зависит от продукта. Но есть ориентиры по категориям (по открытым источникам и публичным выступлениям, для конкретного продукта могут отличаться).

  • Социальные сети, мессенджеры: 0.5–0.7. Юзеры заходят почти каждый день.
  • Игры и медиа-стриминги: 0.2–0.4.
  • E-commerce, банковские приложения: 0.1–0.2.
  • Профессиональные B2B-сервисы: 0.05–0.15. Заходят несколько раз в месяц.

Это ориентиры, не таргеты. Гораздо важнее тренд: stickiness 0.15 и растёт — лучше, чем 0.25 и падает.

Если stickiness ниже 0.05 — это либо продукт с очень редким использованием (декларация раз в год), либо MAU перенасыщен мусором (зомби-юзеры).

Как считать stickiness в SQL

Если есть таблицы DAU и MAU по дням — считаем тривиально:

SELECT
  d.day,
  d.dau::NUMERIC / NULLIF(m.mau_28d, 0) AS stickiness
FROM dau_daily d
JOIN mau_28d_daily m USING (day)
ORDER BY d.day;

Если считаем с нуля по таблице событий за последние 90 дней:

WITH days AS (
  SELECT generate_series(
    CURRENT_DATE - INTERVAL '90 day',
    CURRENT_DATE - INTERVAL '1 day',
    INTERVAL '1 day'
  )::DATE AS day
),
metrics AS (
  SELECT
    d.day,
    (SELECT COUNT(DISTINCT e.user_id)
       FROM events e
      WHERE e.event_name = 'question_answered'
        AND e.event_time >= d.day
        AND e.event_time <  d.day + INTERVAL '1 day') AS dau,
    (SELECT COUNT(DISTINCT e.user_id)
       FROM events e
      WHERE e.event_name = 'question_answered'
        AND e.event_time >= d.day - INTERVAL '27 day'
        AND e.event_time <  d.day + INTERVAL '1 day') AS mau_28d
  FROM days d
)
SELECT day, dau, mau_28d, dau::NUMERIC / NULLIF(mau_28d, 0) AS stickiness
FROM metrics
ORDER BY day;

Обратите внимание на NULLIF(mau_28d, 0) — без него получите division by zero на пустых днях. И на ::NUMERIC — без явного каста integer-деление округлит результат в 0.

Как читать график stickiness

Несколько практик:

  1. Берите rolling 7- или 28-day среднее. Дневной stickiness шумит из-за дней недели.
  2. Сравнивайте день недели к дню недели. Будний к будню, выходной к выходному.
  3. Смотрите на тренд за квартал. Длительные тренды важнее недельных скачков.
  4. Накладывайте релизы и кампании. Видите ступеньку — вспомните, что выкатили.

Хороший сигнал — stickiness стабильно растёт после релиза фичи, которая должна была усилить ежедневное использование. Если фича вышла, а stickiness не изменился — гипотеза не подтвердилась.

Когда stickiness врёт

Несколько случаев, когда метрика может сбить с толку.

  • Сезонный продукт. Декабрьская stickiness e-commerce будет выше летней — это сезонность, не рост вовлечённости.
  • Разные определения активности. Для DAU считаем "ответил на вопрос", для MAU — "открыл приложение". Stickiness получится низкой и бессмысленной.
  • Перекос когорт. Stickiness растёт, потому что MAU чистится от мёртвых, а не потому что DAU реально вырос.
  • Малые числа. На малых аудиториях stickiness шумит так, что тренда не видно.
  • Изменился канал привлечения. Реклама с высокой кликабельностью, но плохим retention — MAU вырос, DAU нет, stickiness упал.

Поэтому stickiness не существует в вакууме: смотрят рядом с retention, активациями и cohort-анализом.

Частые ошибки

  • Деление integer / integer. Получите 0 вместо 0.2. Кастуйте в NUMERIC.
  • Без NULLIF. Падает на пустых днях с division by zero.
  • Считают stickiness одной цифрой за месяц. Без графика тренд не виден, и решения слабые.
  • Сравнивают между продуктами. Stickiness B2B и соцсети — разные планеты, не сопоставимы.
  • Игнорируют сезонность. Падение stickiness в январе не повод объявлять кризис.
  • Меняют определения активности и не обновляют MAU. Метрика рассинхронится.

Связанные темы

FAQ

Что лучше — stickiness или retention?

Это разные метрики. Stickiness — про среднюю частоту визитов. Retention — про возврат когорт через N дней. Считают вместе.

Какой stickiness "хороший"?

Зависит от продукта. Соцсеть на 0.6 живёт хорошо, B2B-сервис на 0.1 — нормально. Смотрите на тренд.

Можно ли считать недельный stickiness?

Да: WAU/MAU. Полезно для продуктов, которые не предполагают ежедневного использования.

Почему мой stickiness стабильно 0?

Скорее всего, integer division: dau / mau без NUMERIC. Кастуйте.

Как растить stickiness?

Через triggers (push, реминды), привычки (стрики, серии), и core-flow, который имеет смысл повторять каждый день.

Можно ли использовать stickiness как North Star?

Не рекомендую. North Star обычно outcome-метрика (заказы, выручка). Stickiness — engagement-метрика, она поддерживающая.


Хочешь прокачать продуктовые метрики? Открой тренажёр Карьерника — задачи на DAU, MAU, retention и SQL.