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

Проверь себя · 1/3разбор после ответа
Есть две таблицы с одинаковой схемой: events_web(user_id, event_name, created_at) и events_app(user_id, event_name, created_at). Нужно получить общий поток событий для дальнейшей агрегации. Что использовать?

Зачем ARPPU

ARPPU = Average Revenue Per Paying User — средняя выручка на одного платящего пользователя. ARPU размазывает выручку по всем пользователям, включая бесплатных. ARPPU считает только платящих. Он показывает качество платящей аудитории и не зависит от размера бесплатной базы.

Формула

ARPPU = total_revenue / paying_users

«Платящий пользователь» — тот, кто совершил хотя бы одну оплату за период.

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

SELECT
    DATE_TRUNC('month', created_at) AS month,
    SUM(amount) AS revenue,
    COUNT(DISTINCT user_id) AS paying_users,
    SUM(amount)::NUMERIC / NULLIF(COUNT(DISTINCT user_id), 0) AS arppu
FROM transactions
WHERE status = 'paid'
  AND amount > 0
  AND created_at >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY 1
ORDER BY 1;

ARPU vs ARPPU

WITH revenue AS (
    SELECT SUM(amount) AS total_revenue
    FROM transactions
    WHERE status = 'paid'
      AND created_at >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')
      AND created_at < DATE_TRUNC('month', CURRENT_DATE)
),
all_users AS (
    SELECT COUNT(DISTINCT user_id) AS cnt
    FROM activity
    WHERE DATE >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')
      AND DATE < DATE_TRUNC('month', CURRENT_DATE)
),
paying AS (
    SELECT COUNT(DISTINCT user_id) AS cnt
    FROM transactions
    WHERE status = 'paid'
      AND created_at >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')
      AND created_at < DATE_TRUNC('month', CURRENT_DATE)
)
SELECT
    r.total_revenue,
    a.cnt AS all_users,
    p.cnt AS paying_users,
    r.total_revenue::NUMERIC / NULLIF(a.cnt, 0) AS arpu,
    r.total_revenue::NUMERIC / NULLIF(p.cnt, 0) AS arppu,
    p.cnt::NUMERIC * 100 / NULLIF(a.cnt, 0) AS paying_pct
FROM revenue r, all_users a, paying p;
Закрепи формулу ARPPU в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать ARPPU в Telegram

По сегментам

SELECT
    u.country,
    COUNT(DISTINCT t.user_id) AS paying_users,
    SUM(t.amount) AS revenue,
    SUM(t.amount)::NUMERIC / NULLIF(COUNT(DISTINCT t.user_id), 0) AS arppu
FROM transactions t
JOIN users u ON u.user_id = t.user_id
WHERE t.status = 'paid'
  AND t.created_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY u.country
ORDER BY arppu DESC;

По когортам (месяц привлечения)

SELECT
    DATE_TRUNC('month', u.registered_at) AS cohort,
    SUM(t.amount) AS cohort_revenue,
    COUNT(DISTINCT t.user_id) AS cohort_paying,
    SUM(t.amount)::NUMERIC / NULLIF(COUNT(DISTINCT t.user_id), 0) AS arppu
FROM transactions t
JOIN users u ON u.user_id = t.user_id
WHERE t.status = 'paid'
  AND u.registered_at >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY 1
ORDER BY 1;

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

Ошибка 1. Путать ARPU и ARPPU. ARPU включает бесплатных пользователей, ARPPU — только платящих.

Ошибка 2. Возвраты. Возвраты нужно исключить или вычесть, иначе ARPPU завышен.

Ошибка 3. Выбор периода. Месячный ARPPU и ARPPU за весь срок жизни клиента — очень разные цифры.

Ошибка 4. Несколько продуктов. Один пользователь платит за продукт A и продукт B. Считать его одним платящим пользователем или двумя?

Ошибка 5. Выбросы. Киты (1% пользователей приносит 50% выручки) сильно тянут среднее — поэтому важны медианный ARPPU и перцентили.

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

FAQ

Чем ARPPU отличается от ARPU?

ARPU — это выручка, делённая на всех пользователей, а ARPPU — выручка, делённая только на платящих. Поэтому ARPPU всегда больше ARPU: в знаменателе меньше людей. ARPU показывает монетизацию всей базы, ARPPU — сколько приносит именно платящий клиент.

Зачем смотреть медианный ARPPU?

Среднее сильно тянут киты — несколько пользователей с огромными платежами. Медиана и перцентили показывают, сколько платит типичный клиент, а не искажённое китами среднее. Поэтому судить о платящей базе по одному среднему ARPPU рискованно.

ARPPU растёт — это хорошо?

Обычно да: платящие пользователи стали приносить больше. Но сначала проверьте долю платящих — ARPPU мог вырасти просто потому, что база сократилась и ушли самые «дешёвые» клиенты. Тогда рост ARPPU маскирует проблему, а не показывает успех.

ARPPU стабилен, а ARPU растёт — что это значит?

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

Виден ли в ARPPU эффект апселла?

Да. Когда платящие переходят на более дорогие тарифы или докупают продукты, средний чек растёт и ARPPU увеличивается. По сути ARPPU — это приближённая оценка LTV для платящего сегмента.