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

Проверь себя · 1/3разбор после ответа
В таблице метрик есть dt, platform, dau. Нужно вывести значение dau за предыдущий день для той же платформы, чтобы посчитать дневное изменение. Какое выражение верное?

Что такое ARR

ARR (Annual Recurring Revenue) — годовая повторяющаяся выручка. Оценка того, сколько компания заработает за следующие 12 месяцев при условии, что текущий состав подписок не изменится.

ARR — главная метрика SaaS. По нему оценивают компании, считают их стоимость, ставят квартальные цели. На собесе аналитика SaaS ARR спрашивают вместе с MRR.

Формула

ARR = MRR × 12

Или эквивалентно:

ARR = SUM(annual_subscriptions) + SUM(monthly_subscriptions × 12)

Если все подписки месячные — формула простая. Если есть годовые и многолетние — нужно нормализовать к году.

SQL: текущий ARR

Допустим, есть таблица subscriptions с активными подписками и их MRR-вкладом:

-- subscriptions: customer_id, mrr, status, created_at, cancelled_at
SELECT SUM(mrr) * 12 AS arr
FROM subscriptions
WHERE status = 'active';

Если в таблице есть годовые подписки с полем billing_period:

SELECT
  SUM(
    CASE
      WHEN billing_period = 'monthly' THEN amount * 12
      WHEN billing_period = 'annual' THEN amount
      WHEN billing_period = 'biennial' THEN amount / 2
      ELSE 0
    END
  ) AS arr
FROM subscriptions
WHERE status = 'active';
Закрепи формулу ARR в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать ARR в Telegram

SQL: ARR-curve по дням

Если хотите видеть, как ARR менялся со временем — нужна таблица событий подписок.

-- subscription_events: customer_id, event_date, mrr_change
WITH days AS (
  SELECT generate_series('2026-01-01'::DATE, CURRENT_DATE, INTERVAL '1 day')::DATE AS day
),
events AS (
  SELECT
    event_date::DATE AS day,
    SUM(mrr_change) AS daily_change
  FROM subscription_events
  GROUP BY 1
)
SELECT
  d.day,
  SUM(COALESCE(e.daily_change, 0)) OVER (ORDER BY d.day) * 12 AS arr
FROM days d
LEFT JOIN events e USING (day)
ORDER BY d.day;

SUM(...) OVER (ORDER BY day) — это нарастающий итог. Без него получите дельту за день, а не накопленный ARR.

Что включать в ARR

ARR должен включать только повторяющиеся компоненты выручки:

  • Плата за подписку — да
  • Разовая плата за подключение (setup fee) — нет
  • Плата за апгрейд — нет, если она разовая
  • Услуги внедрения — нет
  • Доп. опции (add-ons) по подписке — да

На собесе спросят: «У клиента выручка $1200 — $1000 подписка + $200 разовая плата за подключение. Какой его вклад в ARR?» Ответ: $1000 × 12 = $12 000 (только подписка).

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

Считать ARR от выручки. Выручка — это все деньги, которые пришли. ARR — нормализованная регулярная часть. Включение разовой выручки даёт завышенный ARR.

Не учитывать отток. Если клиент отменил подписку 3 дня назад — он не должен входить в текущий ARR.

Использовать сырые дельты MRR без сглаживания. Один большой клиент → ARR прыгнул. Используйте скользящие окна для трендов.

Путать ARR и Run-rate revenue. ARR считает по подпискам на сегодня. Run-rate = текущий месяц × 12. Run-rate включает разовую выручку, ARR — нет.

Целочисленное деление. SUM(amount) / 2 для двухлетних подписок → если amount целочисленный, получите усечение. Используйте NUMERIC или 1.0 *.

FAQ

ARR vs MRR — какой использовать?

MRR удобнее для оперативного, помесячного управления — это KPI команд роста. ARR берут для квартального и годового планирования, оценки стоимости компании и отчётов для совета директоров. На собесе SaaS-аналитика спрашивают обе метрики, так что знать нужно и ту, и другую.

Что считать «активной» подпиской?

Единого правила нет — зависит от компании. Обычно в ARR берут статусы active и past_due (платёж задерживается, но клиент подписку не отменял). А cancelled, expired и paused в активные не входят и в ARR не попадают.

Это официальная информация?

Нет. Статья основана на индустриальных практиках SaaS-аналитики.