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

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

Что такое ARR

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

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

Формула

ARR = MRR × 12

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

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

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

SQL: текущий ARR

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

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

Если в таблице есть annual-подписки с полем 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) — running total. Без этого получите дельту за день, не накопленный ARR.

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

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

  • Subscription fee — да
  • Setup fee (one-time) — нет
  • Annual upgrade fee — нет, если это разовая
  • Implementation services — нет
  • Add-ons по подписке — да

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

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

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

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

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

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

Integer division. SUM(amount) / 2 для biennial → если amount integer, получите усечение. Используйте NUMERIC или 1.0 *.

FAQ

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

MRR — для месячного управления (KPI команды роста). ARR — для квартального и годового планирования, valuation, board reports. На собесе оба обязательны.

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

Зависит от компании. Стандарт: статус active или past_due (платёж задерживается, но клиент не отменил). cancelled, expired, paused — не входят.

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

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