MRR и ARR: что это, как считать и что они скрывают
MRR — регулярная выручка активных подписок, приведённая к одному месяцу, ARR — та же величина в годовом масштабе. Как посчитать MRR в SQL, что делать с просроченными оплатами, чем MRR отличается от денег за месяц и из чего складывается его изменение.
Содержание статьи
Основатель готовит письмо инвесторам и спрашивает одно число: какой у нас MRR на конец августа. Первый аналитик складывает все оплаты за август и получает 15 788 долларов. Второй берёт активные подписки из таблицы подписок — 12 595. Третий добавляет к ним подписки с просроченной оплатой — 18 227. Все трое считали по одной базе, а крайние оценки разошлись на 5632 доллара. Чтобы выбрать правильное число, нужно сначала договориться, что такое MRR.
Коротко
- MRR (monthly recurring revenue) — регулярная выручка от действующих подписок, приведённая к одному месяцу.
- ARR (annual recurring revenue) — та же регулярная выручка в годовом масштабе: MRR × 12. Это не выручка за прошлый год.
- Разовые платежи, пробные периоды и возвраты в MRR не входят. Годовой тариф делят на 12.
- MRR — это состояние на дату, а деньги за месяц — поток. На учебной базе они расходятся: 12 595 против 15 788 долларов.
- Изменение MRR раскладывают на новый, расширение, сокращение, отток и возврат. Без такой раскладки рост MRR может скрывать сильный отток.
Что такое MRR простыми словами
MRR — это сумма, которую подписочный бизнес получает каждый месяц от действующих клиентов, если ничего не изменится. Её считают на конкретную дату: взяли все подписки, активные на 30 августа, и сложили их помесячную стоимость.
Главное слово в определении — «регулярная». Клиент на месячном тарифе за 29 долларов добавляет в MRR 29. Клиент, который оплатил год вперёд за 290 долларов, добавляет 290 / 12 ≈ 24,17, а не 290 в месяц оплаты и ноль в остальные. Квартальный тариф делят на три. Такое приведение и делает MRR сравнимым между месяцами.
Считают то, что клиент реально платит, с учётом скидки. Если тариф стоит 39, а клиенту дали скидку 20%, в MRR идёт 31,2. Разовые платежи — настройка, обучение, покупка дополнительного пакета без продления — в MRR не попадают: они не повторятся в следующем месяце сами собой.
MRR = Σ помесячная стоимость каждой действующей подпискиГодовой тариф — цена / 12, квартальный — цена / 3. Скидки учитываются, разовые платежи и пробные периоды — нет.
Что такое ARR и чем он отличается от годовой выручки
ARR — годовая регулярная выручка. Для подписочного бизнеса её обычно считают как MRR × 12. Это прогноз при неизменной базе: сколько компания получит за год, если никто не уйдёт, никто не придёт и никто не сменит тариф.
Годовая выручка — другое число. Она считает деньги, которые реально пришли за прошедшие двенадцать месяцев, включая разовые платежи и клиентов, которые уже ушли. У растущей компании ARR на конец года выше выручки за год: в начале года клиентов было меньше. У компании, которая теряет клиентов, бывает наоборот.
ARR удобен, когда контракты годовые и компания говорит о себе в годовых единицах, например в B2B. Для продукта с месячными подписками рабочей метрикой обычно остаётся MRR, а ARR — способ перевести его в масштаб, понятный инвестору.
Как посчитать MRR в SQL: сначала посмотрите на статусы
В учебной базе SQL-курса есть таблица subscriptions: у каждой подписки тариф, статус и помесячная цена monthly_price в долларах. Тарифы помесячные: basic за 19, pro за 29, team за 39. Статус — это снимок на момент выгрузки, 30 августа, дат изменения статуса в таблице нет.
Прежде чем складывать, посмотрите, какие статусы вообще встречаются. Фильтр where status = 'active' написать легко, но если в данных есть третий статус, его судьба должна быть решением, а не случайностью.
| Статус | Подписок | Сумма monthly_price, $ |
|---|---|---|
| active | 515 | 12 595 |
| past_due | 228 | 5 632 |
| churned | 169 | 4 101 |
select status, count(*) as subscriptions, sum(monthly_price) as monthly_sum
from subscriptions
group by status
order by status;Что делать с подписками past_due
Со статусами active и churned всё понятно: первые в MRR, вторые нет. past_due — промежуточный случай: подписка не отменена, но очередная оплата не прошла. Карта могла истечь, банк мог отклонить списание. Часть таких клиентов заплатит после повторной попытки, часть уйдёт.
На учебной базе это решение стоит 5632 доллара, почти половину активного MRR. Запрос ниже считает оба варианта и ARR от строгого.
select
sum(monthly_price) filter (where status = 'active') as mrr,
sum(monthly_price) filter (where status in ('active', 'past_due')) as mrr_with_past_due,
12 * sum(monthly_price) filter (where status = 'active') as arr
from subscriptions;- Строгий MRR по активным подпискам — 12 595 долларов, ARR — 151 140.
- С подписками past_due — 18 227 долларов, на 45% больше.
- Рабочее правило: past_due держат в MRR только в пределах льготного периода, который записан в определении метрики (например, «до 14 дней после неудачного списания»), а после него считают оттоком. Если дат неудачных списаний нет, как здесь, честнее показывать MRR без past_due и отдельной строкой — сумму под риском.
MRR по тарифам
Одно число MRR мало говорит о том, на чём держится выручка. Разрез по тарифам — первый, который стоит построить.
| Тариф | Активных подписок | MRR, $ | Доля MRR |
|---|---|---|---|
| basic | 290 | 5 510 | 43,7% |
| pro | 169 | 4 901 | 38,9% |
| team | 56 | 2 184 | 17,3% |
select plan, count(*) as subscriptions, sum(monthly_price) as mrr
from subscriptions
where status = 'active'
group by plan
order by mrr desc;Тариф team — 11% активных подписок (56 из 515), но 17,3% MRR. Потеря одного клиента team (39 долларов) стоит почти столько же, сколько потеря двух клиентов basic (38). Отток поэтому считают и в людях, и в деньгах.
Почему деньги за месяц не равны MRR
Вернёмся к первому аналитику. Все оплаты за август в таблице payments дают 15 788 долларов: 410 первых оплат на 10 090 и 232 продления на 5698. Это больше MRR по активным подпискам на 3193 доллара. Чтобы понять, откуда разница, разложим августовские деньги по текущему статусу подписки.
| Статус на 30 августа | Оплат в августе | Деньги, $ |
|---|---|---|
| active | 308 | 7 562 |
| past_due | 178 | 4 432 |
| churned | 156 | 3 794 |
| Всего | 642 | 15 788 |
select s.status, count(*) as payments, sum(p.amount) as cash
from payments as p
join subscriptions as s on s.user_id = p.user_id
where p.paid_at between date '2026-08-01' and date '2026-08-31'
group by s.status
order by s.status;Что показывает сверка оплат и статусов
Расхождение идёт в обе стороны. 3794 доллара августовских денег пришли от подписок, которые к 30 августа отмечены как ушедшие. Это не обязательно ошибка: человек мог оплатить месяц и сразу отключить продление. Деньги получены, но повторяться они не будут, и в MRR им не место.
С другой стороны, из 515 активных подписок в августе платили только 308. У остальных 207 последняя оплата была в июле (153) или в июне (54). При помесячном списании активная подписка без оплаты больше месяца — повод спросить владельца биллинга, что означает статус и когда он обновляется. Выбирать из двух источников ту цифру, которая больше нравится, нельзя.
Даже при идеально чистых данных деньги за месяц и MRR совпадают редко. Годовая оплата попадает в деньги целиком в один месяц, а в MRR — по 1/12 каждый месяц. Разовые платежи есть в деньгах и нет в MRR. Возвраты уменьшают деньги задним числом. Поэтому MRR сверяют с оплатами, но не подменяют ими.
Из чего складывается изменение MRR
MRR на конец месяца — это MRR на начало плюс пришедшее минус ушедшее. Пришедшее и ушедшее принято раскладывать на пять потоков. Такая таблица отвечает на вопрос, который одно число скрывает: вырос MRR благодаря новым клиентам или несмотря на уход старых.
| Поток | Что в него входит | Знак |
|---|---|---|
| New MRR | первые подписки новых клиентов | + |
| Expansion MRR | переход на дорогой тариф, дополнительные места | + |
| Reactivation MRR | возврат клиента, который раньше ушёл | + |
| Contraction MRR | переход на дешёвый тариф, меньше мест, новая скидка | − |
| Churned MRR | подписки, которые перестали платить | − |
Пример движения MRR на учебной базе
Статусы в таблице подписок — один снимок, по нему динамику не построить. Поэтому возьмём оплаты и примем правило: одна оплата покрывает 30 дней, и подписка входит в MRR на дату, если последняя оплата была не раньше чем 30 дней назад. Продления в учебной базе идут ровно раз в 30 дней, так что правило совпадает с устройством данных.
Запрос для каждого месяца отмечает у подписки три признака: была ли она в MRR накануне месяца, в MRR на его последний день и была ли её первая оплата в этом месяце. Дальше суммы по признакам дают потоки. Данные обрываются 30 августа, поэтому август считаем по эту дату.
| Июль | Август | |
|---|---|---|
| MRR на начало | 3 983 | 10 656 |
| + New | 8 255 | 10 090 |
| + Expansion | 0 | 0 |
| + Reactivation | 0 | 0 |
| − Contraction | 0 | 0 |
| − Churned | 1 582 | 4 958 |
| MRR на конец | 10 656 | 15 788 |
Учебная база SQL-курса, DuckDB. Подписка в MRR, если последняя оплата была не раньше чем 30 дней назад. Август — по 30-е число, на котором обрываются данные.
with months(month_start, month_end) as (
values (date '2026-07-01', date '2026-07-31'),
(date '2026-08-01', date '2026-08-30')
),
per_user as (
select
m.month_start,
p.user_id,
max(p.amount) as price, -- тариф у подписки не меняется
bool_or(p.paid_at > m.month_start - 31 and p.paid_at <= m.month_start - 1) as in_start,
bool_or(p.paid_at > m.month_end - 30 and p.paid_at <= m.month_end) as in_end,
bool_or(p.payment_type = 'first'
and p.paid_at between m.month_start and m.month_end) as is_new
from months as m
join payments as p on p.paid_at <= m.month_end
group by m.month_start, p.user_id
)
select
month_start,
sum(price) filter (where in_start) as start_mrr,
sum(price) filter (where is_new) as new_mrr,
sum(price) filter (where (in_start or is_new) and not in_end) as churned_mrr,
sum(price) filter (where in_end) as end_mrr
from per_user
group by month_start
order by month_start;Как читать движение MRR
Расширения, сокращения и возвратов в учебной базе нет: тариф у подписки не меняется, а после пропущенного продления оплаты не возобновляются. В реальном продукте эти строки редко бывают нулевыми, и строить таблицу нужно со всеми пятью.
Главное видно и так. MRR по оплатам вырос с 10 656 до 15 788 долларов, на 48%. Но ушедший MRR за месяц вырос втрое: с 1582 до 4958. Рост держится на новых клиентах, и если приток замедлится, отток съест его быстро. Обратите внимание и на то, что MRR по оплатам на 30 августа совпадает с деньгами за август: при 30-дневном правиле в него попадают ровно все августовские оплаты. С MRR по статусам он не сходится по причинам, разобранным выше.
Churned MRR и NRR: удержание в деньгах
Churned MRR — сумма MRR, потерянная за период из-за ушедших клиентов. Её полезно показывать рядом с числом ушедших: уход одного клиента team и двух клиентов basic по деньгам почти одинаков.
NRR (net revenue retention) — доля MRR, которую сохранила группа клиентов, существовавших на начало периода, с учётом расширений, сокращений и оттока. Новых клиентов в NRR не включают, иначе приток маскирует потери. NRR выше 100% означает, что расширения у оставшихся клиентов перекрыли всё ушедшее. GRR (gross revenue retention) считают так же, но без расширений, поэтому он не может быть выше 100%.
На учебной базе в июле из 1582 долларов оттока 48 пришлось на две подписки, начатые 1 июля и не продлённые, — на начало месяца их не было, и в NRR они не входят. Из 3983 долларов на начало июля к концу месяца осталось 2449: NRR за июль — 61,5%. За август из 10 656 осталось 5698, NRR — 53,5%. Расширений нет, поэтому здесь NRR равен GRR.
NRR = (MRR на начало + expansion − contraction − churned) / MRR на началоТолько клиенты, которые были на начало периода. Период указывают явно: месячный и годовой NRR несравнимы.
Типичные ошибки при расчёте MRR и ARR
Большинство споров о MRR — это споры об определениях, которые никто не записал.
- Разовые платежи в MRR. Оплата внедрения или разовый пакет раздувают месяц, в котором пришли, и создают «отток» в следующем.
- Годовая оплата целиком в месяце оплаты. Вместо ровной линии получается пик и одиннадцать провалов.
- Пробные периоды в MRR. Триал ничего не платит; в MRR подписка попадает с первым реальным списанием.
- Цена из прайса вместо фактической. Скидки и промокоды уменьшают MRR, даже если тариф называется так же.
- Разные валюты в одной сумме. Доллары и рубли пересчитывают по зафиксированному в определении курсу, иначе MRR меняется вместе с курсом, а не с бизнесом.
- ARR как пиковый месяц × 12. Месяц с крупной акцией или сезонным всплеском, умноженный на 12, даёт число, которого компания не увидит.
- Молчаливое правило для past_due. Если одна команда включает просрочки, а другая нет, MRR «растёт» при смене отчёта.
Что читать дальше
MRR показывает масштаб подписочного бизнеса, а связанные метрики — за счёт чего он меняется и окупается ли.
Материалы по теме

Churn rate и retention rate: что это и как посчитать отток
Churn rate — доля клиентов, которые ушли за период, из тех, кто был в его начале. Как посчитать отток клиентов и retention rate в подписке и в бесплатном продукте, чем customer churn отличается от revenue churn, как перевести месячный отток в годовой и где ошибаются со знаменателем.

Конверсия: что это, формула и как считать без ошибок
Конверсия — доля тех, кто сделал целевое действие, среди тех, кто мог его сделать. Формула CR, выбор знаменателя, окно конверсии, шаги воронки, сегменты и почему нельзя усреднять конверсии — на примерах с учебной базы.

Когорта: что это простыми словами и зачем нужен когортный анализ
Когорта — группа пользователей с общим стартовым событием в одном периоде. Что такое когортный анализ, как построить и читать когортную таблицу, какие бывают когорты и почему последние когорты нельзя сравнивать с остальными.