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

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

Зачем ARR Growth

В SaaS ARR Growth — главная top-level метрика. Investor смотрит: ARR YoY +60% — здоровый. +20% — средне. +10% — слабо. ARR Growth декомпозируется на 4 компонента: new + expansion - churn - contraction.

Формула

ARR_end = ARR_start + New ARR + Expansion ARR - Churn ARR - Contraction ARR
ARR Growth (%) = (ARR_end - ARR_start) / ARR_start × 100%

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

WITH arr_snapshots AS (
    SELECT
        DATE_TRUNC('quarter', DATE) AS quarter,
        SUM(mrr) * 12 AS arr
    FROM subscriptions
    WHERE status = 'active'
    GROUP BY 1
)
SELECT
    quarter,
    arr,
    LAG(arr) OVER (ORDER BY quarter) AS prev_arr,
    (arr::NUMERIC / NULLIF(LAG(arr) OVER (ORDER BY quarter), 0) - 1) * 100 AS qoq_growth_pct,
    (arr::NUMERIC / NULLIF(LAG(arr, 4) OVER (ORDER BY quarter), 0) - 1) * 100 AS yoy_growth_pct
FROM arr_snapshots
ORDER BY quarter;

Components: new, expansion, churn, contraction

SELECT
    DATE_TRUNC('quarter', event_date) AS quarter,
    SUM(CASE WHEN type = 'new' THEN amount END) * 12 AS new_arr,
    SUM(CASE WHEN type = 'expansion' THEN amount END) * 12 AS expansion_arr,
    SUM(CASE WHEN type = 'churn' THEN amount END) * 12 AS churn_arr,
    SUM(CASE WHEN type = 'contraction' THEN amount END) * 12 AS contraction_arr,
    (SUM(CASE WHEN type = 'new' THEN amount END)
     + SUM(CASE WHEN type = 'expansion' THEN amount END)
     - SUM(CASE WHEN type = 'churn' THEN amount END)
     - SUM(CASE WHEN type = 'contraction' THEN amount END)) * 12 AS net_new_arr
FROM mrr_movements
GROUP BY 1
ORDER BY 1;
Закрепи формулу arr growth в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать arr growth в Telegram

Net New ARR

Net New ARR — главный sales-метрика SaaS. Сколько ARR команда заработала net (с учётом churn).

SELECT
    DATE_TRUNC('quarter', event_date) AS quarter,
    SUM(CASE WHEN type IN ('new', 'expansion') THEN amount END) * 12 AS added,
    SUM(CASE WHEN type IN ('churn', 'contraction') THEN amount END) * 12 AS lost,
    (SUM(CASE WHEN type IN ('new', 'expansion') THEN amount END)
     - SUM(CASE WHEN type IN ('churn', 'contraction') THEN amount END)) * 12 AS net_new_arr
FROM mrr_movements
GROUP BY 1
ORDER BY 1;

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

Ошибка 1. ARR vs Booking. Booking — total value подписки (3-year contract = 3 × annual). ARR — annualized current MRR. Не путайте.

Ошибка 2. Multi-currency. ARR в долларах vs рублях — нужна conversion на single FX rate.

Ошибка 3. Discount handling. Подписка на $100/мес со скидкой $20 → ARR $960, не $1200.

Ошибка 4. Включать non-recurring. One-time fees, setup fees — не часть ARR. Только recurring.

Ошибка 5. ARR snapshot timing. ARR на конец квартала vs середину vs ARR average — разные числа.

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

FAQ

ARR Growth 30% — норма?

Pre-PMF — 100%+ YoY. Series A — 100-300%. Series B+ — 50-100%. Public SaaS — 20-50%.

ARR Growth slowing — плохо?

Закон больших чисел: чем больше base, тем труднее % growth. Watch absolute Net New ARR.

Net New ARR vs Gross New ARR?

Gross New — только new + expansion. Net New — minus churn / contraction.

Negative Net New ARR?

Churn > new. Очень плохой сигнал.

ARR Growth quarterly vs annual?

Annual — фокус инвесторов. Quarterly — operational.