Юнит-экономика: CAC, LTV, payback и когорты

Кратко

Юнит-экономика — это способ считать доходы и расходы на одну единицу, которая приносит бизнесу деньги: клиента, заказ, подписку, поездку. Суть в одном соотношении — зарабатывает ли компания на юните больше, чем тратит на его привлечение и обслуживание. Если да — продукт можно масштабировать, если нет — рост ускоряет убытки, а не прибыль.

Две опорные метрики: CAC — стоимость привлечения одного клиента, и LTV — прибыль с него за всё время жизни в продукте. Здоровое соотношение — LTV к CAC как минимум 3:1. Ниже — бизнес зарабатывает меньше, чем вкладывает в маркетинг. Выше 5:1 — недоинвестирует в рост и теряет долю рынка.

Для продуктового аналитика юнит-экономика — это не финмодель для инвесторов, а рабочий инструмент: она показывает, какие каналы окупаются, какие когорты «тянут» продукт, а какие сжигают деньги. В этом гайде — формулы, когда какую метрику применять, когортный разбор и типичные ловушки.

Базовая формула и где она работает

Каноническая формула юнит-экономики сводится к соотношению LTV и CAC:

LTV : CAC ≥ 3 : 1
  • CAC (Customer Acquisition Cost) — маркетинговые затраты, делённые на число привлечённых клиентов за тот же период. Если в месяц потрачено 25 000 ₽ на таргет и пришло 50 покупателей, CAC = 500 ₽.
  • LTV (Lifetime Value) — прибыль с клиента за весь цикл его работы с продуктом. Классическая формула: LTV = (AVp − VC × AVp) × RPR, где AVp — средний чек, VC — переменные затраты на единицу (в долях), RPR — коэффициент повторных покупок за период.

Эта модель хорошо работает, когда у продукта есть стабильная повторная покупка и известный цикл жизни: e-commerce, подписка с фиксированным чеком, доставка. Когда цикл длинный, а поведение клиентов сильно разнится — единого LTV не существует, и нужен когортный подход (о нём ниже).

CM1 и CM2: маржа до и после маркетинга

LTV/CAC — это финальный срез. Внутри продукта полезнее две промежуточные метрики:

  • CM1 (Contribution Margin 1) = Выручка на юнит − Переменные затраты на юнит. Показывает, сколько остаётся после себестоимости продукта (сырьё, доставка, комиссия платёжки, поддержка), но до маркетинга.
  • CM2 (Contribution Margin 2) = CM1 − CAC. Показывает, остаётся ли что-то после привлечения клиента — то есть, окупает ли юнит сам себя.

CM1 отвечает на вопрос «продаём ли мы в плюс по продукту», CM2 — «продаём ли в плюс по бизнесу». Разница между ними — маркетинг. Если CM1 положительная, а CM2 отрицательная, продукт в плюс, а каналы привлечения сжигают маржу: можно снижать CAC, менять каналы или повышать LTV. Если отрицательная CM1 — продукт невыгоден на уровне себестоимости, и никакой маркетинг это не исправит.

Альтернативная форма, удобная для расчёта сверху:

CM = (ARPU − CPA) × UA

где ARPU — средний доход на пользователя (включая тех, кто не купил), CPA — стоимость целевого действия, UA — число привлечённых. ARPU = ARPPU × CR, где ARPPU — доход на платящего, CR — конверсия в покупку. Эта форма удобна, когда данные есть на уровне трафика, а не отдельных клиентов.

Payback period и LTV:CAC — две разные метрики

Частая путаница: LTV:CAC и payback period измеряют одно и то же. Это не так.

  • LTV:CAC — отношение пожизненной прибыли к стоимости привлечения. Сколько рублей прибыли приносит каждый рубль маркетинга за весь цикл жизни клиента.
  • Payback period — сколько месяцев нужно, чтобы прибыль с клиента покрыла CAC. Если CAC = 500 ₽, а CM2 в месяц = 125 ₽, payback = 4 месяца.

LTV:CAC показывает, окупается ли клиент в принципе. Payback показывает, как быстро. При одинаковом LTV:CAC = 3:1 продукт с payback 2 месяца кратно устойчивее, чем с payback 18 месяцев: у него короче цикл возврата денег, меньше риск изменения рынка и ниже потребность в оборотном капитале.

Для ранних стадий payback важнее LTV:CAC: пока продукт молод, горизонт прогноза LTV короткий, и единственное, что можно реально измерить — окупает ли клиент себя до того, как данные устареют. Для зрелого продукта с длинной историей LTV:CAC становится более надёжной метрикой.

Юнит-экономика по когортам: почему агрегат врёт

Главная ошибка при работе с LTV — считать единую метрику по всему продукту. Реальный LTV зависит от того, когда клиент пришёл и через какой канал. Когорта, пришедшая в январе через контекстную рекламу, и когорта, пришедшая в июне через реферальную программу, имеют разный CAC, разную конверсию, разный отток — и, следовательно, разный LTV. Агрегат усредняет их и прячет сигнал.

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

Почему агрегат врёт, конкретно:

  • Свежие когорты показывают низкий LTV — у них просто не было времени накапливать покупки. Если сравнивать их с зрелыми когортами на равных, кажется, что продукт деградирует. На деле — это артефакт короткого наблюдения.
  • Каналы смешиваются. Платный трафик с высоким CAC и органика с нулевым CAC, смешанные в одном LTV:CAC, дают среднюю температуру по больнице. Платный канал может быть убыточным, а органика маскирует это.
  • Сезонность размывает сигнал. Когорты, стартовавшие в сезон, ведут себя иначе, чем когорты вне сезона — даже без продуктовых изменений.

Python: расчёт и интерпретация по когортам

Рабочий расчёт на Pandas. На входе — таблица клиентов users с каналом и стоимостью привлечения, и таблица заказов orders с выручкой, маржой и датой:

import pandas as pd

users = pd.DataFrame({
    'user_id': [1, 2, 3, 4, 5],
    'channel': ['organic', 'organic', 'paid', 'paid', 'paid'],
    'cac': [0, 0, 500, 500, 500],
    'registered_at': pd.to_datetime([
        '2024-01-05', '2024-01-10',
        '2024-01-08', '2024-01-12', '2024-01-15',
    ]),
})

orders = pd.DataFrame({
    'user_id': [1, 1, 2, 3, 3, 4, 5],
    'profit': [1500, 900, 1200, 2400, 1800, 600, 300],
    'order_date': pd.to_datetime([
        '2024-01-15', '2024-02-10', '2024-01-20',
        '2024-01-20', '2024-02-15', '2024-01-25', '2024-02-01',
    ]),
})

# Когорта — месяц первой покупки
orders['order_month'] = orders['order_date'].dt.to_period('M')
first = (
    orders.groupby('user_id')['order_date'].min()
    .dt.to_period('M')
    .rename('cohort')
)
orders = orders.join(first, on='user_id')
orders['period'] = (
    orders['order_month'].astype('int64')
    - orders['cohort'].astype('int64')
)

# Накопленная прибыль по когорте и периоду
cohort_profit = (
    orders.groupby(['cohort', 'period'])['profit']
    .sum()
    .groupby(level=0)
    .cumsum()
    .reset_index()
)

# Размер когорты и LTV-матрица
size = orders.groupby('cohort')['user_id'].nunique()
ltv_matrix = cohort_profit.pivot(
    index='cohort', columns='period', values='profit'
).divide(size, axis=0)

# CAC по каналам
cac_by_channel = users.groupby('channel')['cac'].mean()
print('CAC по каналам:')
print(cac_by_channel)
print('\nНакопленный LTV на клиента по когортам:')
print(ltv_matrix.round(1))

На выходе — две вещи. Первая: CAC по каналам, чтобы видеть, сколько стоит клиент в каждом источнике. Вторая: треугольная матрица накопленного LTV, где ltv_matrix.loc['2024-01', 1] — прибыль с январской когорты к первому месяцу жизни.

Возьмём гипотетические цифры из расчёта выше. Канал paid имеет CAC = 500 ₽, organic — 0 ₽. Накопленный LTV к первому месяцу у январской когорты — 600 ₽. Кажется, что paid-канал уже окупился: 600 > 500. Но к M2 накопленный LTV у разных пользователей расходится: кто-то сделал повторную покупку, кто-то ушёл. К M3 в одной когорте накопленный LTV = 1250 ₽, в другой — 400 ₽.

Интерпретация:

  • Канал paid окупается на горизонте 1–2 месяца для «сильных» когорт и не окупается для «слабых». Это не проблема канала — это проблема отбора аудитории. Гипотеза: нужно точнее настраивать таргет.
  • Канал organic окупается всегда, потому что CAC = 0. Но его объём ограничен, и полагаться только на него — значит ограничить рост.
  • Payback period для paid-канала на «сильной» когорте — 1 месяц. На «слабой» — не наступает никогда. Это значит, что LTV:CAC = 3:1 в среднем по paid-каналу — ложная безопасность: среднее скрывает убыточные когорты.

Вывод, который не виден из агрегата: paid-канал работает только для части когорт. Без когортного разбора это осталось бы скрытым за «средним» LTV:CAC = 2:1, и решение было бы «увеличить бюджет на paid-канал». Правильное решение — сегментировать аудиторию до запуска масштабирования.

Типичные ловушки

LTV — не «истинное» число, это прогноз. Он зависит от горизонта, от того, как вы считаете отток, и от того, какую маржу закладываете. Несколько ошибок, которые повторяются чаще других:

  • LTV «лжёт» на ранних когортах. У свежей когорты накопленный LTV всегда низкий — просто потому, что мало времени прошло. Экстраполировать его на полный жизненный цикл — ошибка: вы прогнозируете линейно то, что на деле убывает по кривой. Если нужно оценить LTV когорты, прожившей 2 месяца, либо ждите, либо используйте модель распадения (retention curve → интеграл), но не считайте «месячный LTV × 12».
  • Смешение payback и LTV:CAC. «LTV:CAC = 3:1, значит, всё хорошо» — нет. Если payback 18 месяцев, бизнес замораживает деньги на полтора года, и любой сдвиг рынка за это время превращает 3:1 в 1:1. Payback и LTV:CAC измеряют разное: первое — скорость возврата, второе — полную окупаемость. Считайте оба.
  • Не делить юниты по каналам и периодам. Конверсии на разных каналах отличаются. Если сложить Яндекс Директ и реферальную программу в один CAC, получится среднее, которое не описывает ни один из каналов. Считайте CAC и LTV отдельно по каждому источнику трафика.
  • Не учитывать рекламу в расходах. Если считать LTV как выручку без вычета CAC, получится «клиент принёс 1000 ₽». Но если на его привлечение потрачено 1200 ₽, юнит убыточен. LTV — это прибыль, не выручка.
  • Включать в расчёт весь товар, а не проданный. Если закуплено 200 единиц, а продано 120, переменные затраты нужно считать на проданные 120. Иначе себестоимость единицы занижается, и LTV оказывается завышенным.
  • ARPU ≠ ARPPU. ARPU делится на всех пользователей, ARPPU — только на платящих. Смешивание даёт ошибку, кратную конверсии в покупку. Если конверсия 6%, ARPU = ARPPU × 0.06 — разница в 16 раз.

Выводы

Юнит-экономика — это не финальный отчёт для инвестора, а рабочий инструмент аналитика. Её ценность не в одном числе LTV:CAC, а в том, что она заставляет разделять по каналам, когортам и периодам — и видеть, где продукт зарабатывает, а где сжигает.

Минимальный набор для старта: посчитайте CAC по каналам, постройте когортную матрицу накопленной прибыли, оцените payback для каждой когорты отдельно. Если payback наступает на горизонте 2–3 месяцев для большинства когорт — продукт можно масштабировать. Если для трети когорт payback не наступает — масштабирование ускорит убытки, и чинить нужно не маркетинг, а продукт или отбор аудитории.

LTV — это прогноз, а не факт. Любое число LTV имеет доверительный интервал, и чем короче горизонт наблюдения, тем шире этот интервал. Для ранних когорт работайте с payback, для зрелых — с LTV:CAC. И никогда не смешивайте их в одну метрику: они отвечают на разные вопросы.

Смотрите также

← К статьям