Как посчитать DAU/MAU в SQL

Проверь себя · 1/3разбор после ответа
Нужно построить отчёт: по каждому продукту и каждому дню месяца — сумма продаж, включая дни с нулевыми продажами. Как сформировать каркас из всех пар дата–продукт?

Что такое DAU/MAU и что показывает stickiness

DAU/MAU, или stickiness, — отношение дневной аудитории к месячной. Метрика показывает, насколько часто пользователи возвращаются: по сути это среднее число дней в месяце, которые активный пользователь проводит в продукте, делённое на 30. Stickiness 20% означает, что в среднем пользователь заходит примерно 6 дней из 30.

Stickiness — это метрика привычки. Высокое значение говорит, что продукт встроен в ежедневную рутину, а не используется от случая к случаю. Низкая, но растущая MAU при низком stickiness — сигнал, что привлечение работает, а вот ежедневная привычка ещё не сформировалась, и удержание держится на волоске.

Важно помнить, что DAU/MAU — усреднённая величина, и она маскирует распределение. Одни и те же 20% могут означать «все заходят примерно 6 дней в месяц» или «20% заходят каждый день, а 80% — раз в месяц». Поэтому на серьёзном разборе stickiness дополняют кривой частоты визитов, а не показывают одной цифрой.

Формула

DAU/MAU = DAU / MAU × 100%

DAU — уникальные пользователи за день, MAU — уникальные за скользящие 30 дней, включая этот день. Ключевая деталь: MAU считается как скользящие 30 дней относительно даты, а не «за календарный месяц» — иначе метрику нельзя посчитать на каждый день.

Бенчмарки по типам продуктов

Ориентир по stickiness сильно зависит от того, есть ли у продукта ежедневный повод для возврата. Сравнивать значение можно только внутри своей категории.

  • Соцсети и мессенджеры — 50%+, у сильных мессенджеров 60%+. Ежедневный повод заходить встроен в сам продукт.
  • Мобильные игры — сильно варьируются, у удачных проектов высокие в первые недели, затем спадают.
  • SaaS B2B — 20–30% считается здоровым: продукт нужен в рабочие дни, а не каждый день.
  • Утилиты и финтех — 10–20% нормально: заходят по потребности, а не по привычке.

Значение ниже 10% почти для любого продукта — сигнал слабой привычки: пользователи заходят слишком редко, чтобы удержание было устойчивым.

Как посчитать DAU/MAU в SQL

Базовый расчёт stickiness по дням со скользящим окном MAU в 30 дней:

WITH dau AS (
    SELECT DATE, COUNT(DISTINCT user_id) AS dau
    FROM activity
    WHERE DATE >= CURRENT_DATE - INTERVAL '60 days'
    GROUP BY DATE
),
mau AS (
    SELECT
        d.DATE,
        COUNT(DISTINCT a.user_id) AS mau
    FROM (SELECT DISTINCT DATE FROM activity WHERE DATE >= CURRENT_DATE - INTERVAL '30 days') d
    JOIN activity a
      ON a.DATE BETWEEN d.DATE - INTERVAL '29 days' AND d.DATE
    GROUP BY d.DATE
)
SELECT
    d.DATE,
    d.dau,
    m.mau,
    d.dau::NUMERIC * 100 / NULLIF(m.mau, 0) AS stickiness_pct
FROM dau d
JOIN mau m ON m.DATE = d.DATE
ORDER BY d.DATE;

Разрез по сегментам показывает, где привычка сильнее — например, по странам или каналам привлечения:

SELECT
    u.country,
    COUNT(DISTINCT a.user_id) FILTER (WHERE a.DATE = CURRENT_DATE - INTERVAL '1 day') AS dau,
    COUNT(DISTINCT a.user_id) AS mau,
    COUNT(DISTINCT a.user_id) FILTER (WHERE a.DATE = CURRENT_DATE - INTERVAL '1 day')::NUMERIC * 100
        / NULLIF(COUNT(DISTINCT a.user_id), 0) AS stickiness_pct
FROM activity a
JOIN users u ON u.user_id = a.user_id
WHERE a.DATE >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY u.country
ORDER BY stickiness_pct DESC;

На дневном ряду stickiness шумит, поэтому его сглаживают скользящим средним за 7 дней — так тренд читается честнее, чем по отдельным дням.

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

Примеры с собеседований

Stickiness на собесе проверяют на понимании, что стоит за цифрой.

«Что означает stickiness 20%? Переведи в дни активности.» Сильный ответ: это примерно 6 дней активности в месяц на среднего пользователя (0.2 × 30). Умение перевести долю в интуитивную величину сразу показывает, что кандидат понимает метрику, а не заучил формулу.

«Продукт с DAU/MAU 50% всегда лучше, чем с 15%?» Слабый ответ — «да, выше значит лучше». Сильный: только внутри одной категории. Для мессенджера 50% нормально, для финтеха 15% может быть отличным результатом, потому что у него нет ежедневного повода заходить.

«Stickiness вырос, а выручка не изменилась — что это значит?» Сильный ответ: рост частоты визитов сам по себе не монетизируется, если продукт не конвертирует вовлечение в деньги; stickiness — вспомогательная метрика, её читают вместе с удержанием и выручкой. Прогнать такие вопросы можно в Карьернике.

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

MAU как «на конец месяца», а не скользящие 30 дней. Для дневного расчёта stickiness MAU считают скользящим окном в 30 дней относительно даты, иначе метрику не получить на каждый день и график будет рваным.

Путать DAU/MAU с WAU/MAU. Это разные пороги привычки: DAU/MAU меряет ежедневную привычку, WAU/MAU — недельную, более мягкую. Их нельзя сравнивать между собой.

Не отделять новых пользователей. Всплеск регистраций в один день раздувает DAU, и stickiness скачет. Когортный взгляд честнее: он отделяет привычку от притока новых.

Не фильтровать ботов и спам. Боты накручивают DAU, но не создают привычку. Перед расчётом базу чистят до реальных пользователей.

Не решать проблему нескольких устройств. Один пользователь с двух устройств может попасть под разные user_id и задвоить аудиторию. Нужна склейка идентификаторов.

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

FAQ

Какой DAU/MAU считается хорошим?

Зависит от категории. У соцсетей и мессенджеров 50%+, у SaaS B2B 20–30%, у утилит и финтеха 10–20% — норма. Значение ниже 10% почти для любого продукта говорит о слабой привычке. Сравнивать stickiness имеет смысл только внутри своей категории.

Чем DAU/MAU отличается от WAU/MAU?

DAU/MAU меряет ежедневную привычку, WAU/MAU — недельную. Второй порог мягче: для продуктов, где заходить каждый день не нужно, WAU/MAU информативнее. Метрики не взаимозаменяемы и не сравниваются друг с другом напрямую.

Почему для MAU берут именно 30 дней?

Это конвенция, удобно совпадающая с календарным месяцем. Иногда берут 28 дней (ровно 4 недели), чтобы убрать эффект разного числа выходных в окне. Главное — зафиксировать определение и не менять его.

Stickiness падает — что это значит?

Либо снизилась DAU (упало вовлечение), либо MAU растёт слишком быстро за счёт новых пользователей, которые не удерживаются. Чтобы понять, что именно, DAU и MAU смотрят по отдельности и в разрезе когорт.