Как посчитать New Users в SQL

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

Зачем New Users

Маркетинг отчитывается: «150K новых пользователей в апреле». Аналитик копает: 30% этого — повторные регистрации (юзер забыл пароль), 20% — боты, 10% — реальные новые на конкретном устройстве (юзер уже был). Реальные new users — 60K.

Что такое New User

New User — пользователь, первая активность которого попадает в исследуемый период.

New = MIN(activity) ∈ period

Базовый расчёт

Данные: users(user_id, signup_date) или events(user_id, event_date).

SELECT
    DATE_TRUNC('month', signup_date) AS month,
    COUNT(DISTINCT user_id) AS new_users
FROM users
WHERE signup_date >= '2026-01-01'
GROUP BY 1
ORDER BY 1;

Если только events:

WITH first_event AS (
    SELECT user_id, MIN(event_date) AS first_date
    FROM events
    GROUP BY user_id
)
SELECT
    DATE_TRUNC('month', first_date) AS month,
    COUNT(*) AS new_users
FROM first_event
WHERE first_date >= '2026-01-01'
GROUP BY 1
ORDER BY 1;

New Users по channels

SELECT
    DATE_TRUNC('month', signup_date) AS month,
    acquisition_channel,
    COUNT(DISTINCT user_id) AS new_users
FROM users
WHERE signup_date >= '2026-01-01'
GROUP BY 1, 2
ORDER BY 1, new_users DESC;
Закрепи формулу new users в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать new users в Telegram

Cross-device дедупликация

Юзер заходит с телефона (device_id A), потом с ПК (device_id B). Без unification — два user_id, два «new».

-- Допустим, есть user_links(device_id, user_id) с unified user_id
WITH unified AS (
    SELECT
        ul.user_id AS unified_user_id,
        MIN(e.event_date) AS first_event
    FROM events e
    JOIN user_links ul ON ul.device_id = e.device_id
    GROUP BY ul.user_id
)
SELECT
    DATE_TRUNC('month', first_event) AS month,
    COUNT(*) AS new_users_unified
FROM unified
WHERE first_event >= '2026-01-01'
GROUP BY 1
ORDER BY 1;

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

Ошибка 1. Считать new по device_id. Кросс-девайс юзеры дублируются. Используйте user_id (после login) если есть.

Ошибка 2. Включать ботов. Без is_bot = false new users завышены.

Ошибка 3. Boundary period. Если юзер пришёл в 23:59 31 марта, signup_date в UTC может быть 1 апреля. Зафиксируйте timezone.

Ошибка 4. Повторные регистрации. Юзер забыл пароль и зарегистрировался заново с другой почтой. Объединяйте по device fingerprint.

Ошибка 5. Соотношение new vs returning. Только new users — не вся картина. Сравните new vs returning per period.

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

FAQ

Cross-device или per-device?

Cross-device через unified user_id — точнее. Per-device проще, но завышен.

Как фильтровать ботов?

User-agent, geo-anomaly, behavioral (немедленный bounce, exotic device). Лучше использовать готовые антибот-системы (Recaptcha, Akamai).

New users падают — что делать?

Декомпозиция по acquisition channels. Найдите канал с самым большим падением.

New vs Returning?

New — первая активность. Returning — был активен раньше + сейчас. Total active = new + returning.

Boundary date — куда?

Зарегистрировался 31 марта 23:50 UTC = 1 апреля 02:50 МСК. Зафиксируйте timezone для consistency.