Churn rate (отток) — доля клиентов или выручки, потерянная за период. Базовая формула: churn = (ушедшие за период) / (были в начале периода). Считать нужно на фиксированном окне (обычно месяц), с корректным знаменателем и без новичков, которые пришли в середине окна.
Дальше — что именно измерять, чем customer churn отличается от revenue churn, как посчитать помесячный отток в SQL и какие ошибки чаще всего ломают цифру на собеседовании.
Что такое отток клиентов простыми словами?
Отток — это клиенты, которые перестали пользоваться продуктом или платить за него в течение выбранного периода. Обратная величина — retention (удержание): если за месяц ушло 5% клиентов, то удержалось 95%. Отток и удержание в сумме дают 100% на одном и том же окне и знаменателе.
Важно сразу договориться о трёх вещах, иначе метрика будет несравнимой между командами:
- Окно — за какой период считаем (день, неделя, месяц, квартал).
- Событие оттока — что считается «ушёл»: отмена подписки, отсутствие покупок N дней, отписка от тарифа.
- Единица — считаем клиентов (штуки) или деньги (выручку).
Для подписочных (SaaS) продуктов отток обычно определяют по факту отмены подписки. Для транзакционных (e-commerce, маркетплейс) — по отсутствию активности за скользящее окно, потому что явного «расторжения договора» нет.
Чем отличается customer churn от revenue churn?
Это две разные метрики, и путать их нельзя.
- Customer churn (логотипный отток) считает клиентов: сколько аккаунтов ушло из общего числа. Все клиенты весят одинаково.
- Revenue churn (денежный отток) считает выручку: сколько денег утекло. Крупный клиент с чеком 100 000 ₽ весит в 100 раз больше клиента за 1 000 ₽.
Revenue churn бывает gross (только потерянная выручка от ушедших и даунгрейдов) и net (потери минус апселлы и расширения оставшихся клиентов). Net revenue churn может быть отрицательным — это хорошо: значит расширения перекрывают потери.
| Метрика | Что считает | Формула (за период) |
|---|---|---|
| Customer churn | клиентов | ушедшие / клиенты на начало |
| Gross revenue churn | потерянные деньги | (MRR отмен + даунгрейды) / MRR на начало |
| Net revenue churn | деньги с учётом роста | (потери − апселлы) / MRR на начало |
Пример разницы: за месяц ушло 8% клиентов, но это были самые мелкие тарифы, поэтому revenue churn — всего 3%. Или наоборот: ушёл один enterprise-клиент, customer churn 1%, а revenue churn 15%. Всегда смотрите обе метрики вместе.
Voluntary vs involuntary churn — в чём разница?
- Voluntary (добровольный) — клиент сам решил уйти: не понравился продукт, дорого, нашёл замену. Лечится продуктом, ценой, онбордингом.
- Involuntary (недобровольный) — клиент хотел остаться, но подписка сорвалась технически: не прошёл платёж, истёк срок карты, недостаточно средств. Лечится ретраями платежей и напоминаниями (dunning).
Involuntary churn часто даёт 20–40% всего оттока в подписках (иллюстративный диапазон) и при этом самый дешёвый в починке — иногда достаточно повторить списание через 3 дня. На собеседовании стоит уточнять, разделяет ли компания эти два типа: тактики восстановления у них разные.
Как считать churn rate: формула
Базовая формула customer churn за период:
churn = (C_lost) / (C_start)
где C_lost — число клиентов, ушедших за период, C_start — число активных клиентов на начало периода.
Ключевое правило знаменателя: в него идут только те, кто уже был клиентом на начало окна. Новые клиенты, пришедшие в течение месяца, не могли уйти из «начальной» когорты, поэтому в знаменатель не включаются (иначе отток искусственно занизится).
Retention как обратная величина:
retention = 1 - churn
Для revenue churn формула та же, но вместо количества клиентов — их MRR (месячная выручка).
Cohort-based или snapshot — какой метод выбрать?
Есть два способа считать, и они дают разные числа.
- Snapshot (моментальный) — берём число клиентов на начало месяца, число ушедших за месяц, делим. Просто, но смешивает старых и новых клиентов и чувствителен к росту базы.
- Cohort-based (когортный) — фиксируем группу клиентов на дату входа и смотрим, сколько из них дожило до месяца N. Точнее показывает, как удержание зависит от «возраста» клиента.
Когортный анализ честнее для растущих продуктов: если база быстро растёт, snapshot размывает отток притоком новичков. Подробный разбор когорт есть в отдельном материале — когортный анализ retention в SQL.
Пример расчёта оттока на цифрах
Возьмём иллюстративные данные подписочного сервиса за март.
- Клиентов на 1 марта: 1 000
- Ушло (отменили подписку) за март: 45
- Пришло новых за март: 120
Customer churn:
churn = (45) / (1000) = 0,045 = 4,5%
Retention: 1 - 0,045 = 95,5%.
Обратите внимание: 120 новых клиентов не входят в знаменатель. Если ошибочно взять базу на конец месяца (1000 − 45 + 120 = 1075), получим 45/1075 = 4,2% — заниженный отток.
Теперь revenue churn. Пусть MRR на 1 марта = 2 000 000 ₽, ушедшие клиенты уносят 60 000 ₽, даунгрейды дают −20 000 ₽, а апселлы оставшихся +50 000 ₽.
- Gross revenue churn:
(60000 + 20000) / 2000000 = 4,0% - Net revenue churn:
(80000 - 50000) / 2000000 = 1,5%
Логотипный отток 4,5%, а денег компания теряет всего 1,5% благодаря апселлам — картинка совсем другая.
Как посчитать помесячный отток в SQL?
Набросок для подписочной таблицы subscriptions с полями user_id, started_at, canceled_at (данные условные). Логика: для каждого месяца считаем, сколько подписок было активно на его начало и сколько из них отменилось в течение месяца.
WITH months AS (
SELECT generate_series(
date_trunc('month', DATE '2026-01-01'),
date_trunc('month', DATE '2026-06-01'),
INTERVAL '1 month'
) AS month_start
),
metrics AS (
SELECT
m.month_start,
-- активны на начало месяца: стартовали раньше и ещё не отменились
COUNT(*) FILTER (
WHERE s.started_at < m.month_start
AND (s.canceled_at IS NULL OR s.canceled_at >= m.month_start)
) AS active_start,
-- ушли в течение этого месяца
COUNT(*) FILTER (
WHERE s.canceled_at >= m.month_start
AND s.canceled_at < m.month_start + INTERVAL '1 month'
AND s.started_at < m.month_start
) AS churned
FROM months m
CROSS JOIN subscriptions s
GROUP BY m.month_start
)
SELECT
month_start,
active_start,
churned,
ROUND(churned::numeric / NULLIF(active_start, 0), 4) AS churn_rate
FROM metrics
ORDER BY month_start;
Три момента, которые делают запрос корректным:
- В знаменатель (
active_start) попадают только подписки соstarted_at < month_start— новички месяца исключены. - Условие
churnedтребует, чтобы клиент был активен на начало (started_at < month_start): нельзя уйти из когорты, в которую не входил. NULLIF(active_start, 0)защищает от деления на ноль в пустых месяцах.
Потренироваться писать такие агрегатные и оконные запросы можно в SQL-тренажёре, а разбор воронок — в статье про воронку конверсии в SQL.
Как отток связан с retention и LTV?
Отток напрямую задаёт срок жизни клиента. Для подписки со стабильным месячным оттоком средняя продолжительность жизни:
lifetime = (1) / (churn_month)
При месячном оттоке 4,5% средний клиент живёт 1/0,045 ≈ 22 месяца. Отсюда упрощённая LTV:
LTV = ARPU × (1) / (churn)
Если ARPU = 900 ₽/мес, то LTV ≈ 900 × 22 = 19 800 ₽ (иллюстративно). Снижение оттока с 4,5% до 3% удлиняет жизнь до ~33 месяцев и поднимает LTV почти в полтора раза — поэтому работа с оттоком часто дешевле, чем привлечение новых. Как связать LTV с окупаемостью привлечения, разобрано в материале про LTV, CAC и unit-экономику.
Частые ошибки при расчёте оттока
- Неправильный знаменатель. Берут базу на конец периода или среднюю за месяц вместо базы на начало. Стандарт — активные на начало окна.
- Включение новых клиентов в когорту. Клиенты, пришедшие в середине месяца, физически не могли уйти из «начальной» группы — они занижают отток. Исключайте их из знаменателя.
- Плавающее окно. Считать «за 30 дней» скользящим окном и сравнивать с календарным месяцем — несопоставимо. Зафиксируйте единый период.
- Смешивание customer и revenue churn. Отчёт говорит «отток 4%», но не уточняет, клиенты это или деньги. Всегда подписывайте единицу.
- Игнор involuntary churn. Слетевшие платежи попадают в общий отток и выглядят как «клиенты ушли», хотя чинятся ретраями. Разделяйте voluntary и involuntary.
- Отток без определения активности. Для транзакционных продуктов нет «отмены» — нужно заранее договориться, сколько дней бездействия считать оттоком (30, 60, 90).
- Аннуализация умножением на 12. Годовой отток нельзя получить как месячный × 12. Правильно:
churn_year = 1 - (1 - churn_month)^12.
Разберите отток на живых данных: соберите помесячный запрос в SQL-тренажёре, а логику расчёта метрик и защиту цифр на интервью прогоните в AI-собеседовании или на реальных кейсах.