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

Практика по теме статьи · без регистрации

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Что такое 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 в браузере

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-аналитики.