Через сколько месяцев окупается CAC: считаем по накопленной марже когорты

Рекламная кампания привела сто новых клиентов за сто двадцать тысяч рублей. CAC равен 1200 рублям. На этом многие отчёты заканчиваются, хотя следующий вопрос важнее для бюджета: когда расходы на привлечение вернутся? Средняя выручка клиента за месяц не даёт ответа, если обслуживание и повторные покупки меняются со временем. Построим накопленную маржу конкретной когорты и найдём первый месяц пересечения с расходами.

Сохранить одну когорту на всём горизонте

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

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

Считать пересечение по накопленному вкладу

Пусть вклад когорты по месяцам составляет 40000, 30000, 25000, 20000 и 15000 рублей. После трёх месяцев накоплено 95000, после четырёх — 115000, после пяти — 130000. Расходы 120000 перекрыты в пятом наблюдаемом месяце. В пересчёте на исходного клиента это те же 1200 CAC и 1300 накопленного вклада к пятому месяцу. Оба способа согласуются, если знаменатель не меняется.

spend = 120_000
acquired = 100
contribution = [40_000, 30_000, 25_000, 20_000, 15_000]
assert acquired > 0 and spend >= 0
cumulative = 0
rows = []
for month, value in enumerate(contribution, 1):
    cumulative += value
    rows.append((month, cumulative, cumulative-spend))
first_crossing = next((m for m, total, balance in rows if balance >= 0), None)
print({'cac': spend/acquired, 'months': rows, 'first_crossing': first_crossing})
assert rows[3] == (4, 115_000, -5_000)
assert rows[4] == (5, 130_000, 10_000)
assert first_crossing == 5
assert next((m for m,t,b in rows[:4] if b >= 0), None) is None

Что делать, если пересечения пока нет

У новой когорты могут быть только четыре месяца наблюдений. Тогда результат: за четыре месяца ещё не окупилась, осталось пять тысяч рублей. Писать «окупаемость 4,3 месяца» на основании среднего вклада последних месяцев нельзя без явной модели будущего. Такая дробная оценка предполагает равномерное поступление денег внутри месяца и сохранение интенсивности, чего агрегаты не показывают.

Покажите таблицу когорт с одинаковым возрастом по столбцам: первый месяц, второй и дальше. Недоступные будущие месяцы оставьте пустыми. Для сравнения каналов используйте одинаковый горизонт и сопоставимый состав расходов. Канал, в котором успели накопиться старые клиенты, будет выглядеть лучше, если вместо когорт взять общую выручку календарного месяца. Для планирования кассы полезно дополнить маржинальную окупаемость отдельным графиком фактических платежей и выплат.

Первая окупаемость может оказаться временной

Возвраты, компенсации или сезонные расходы способны сделать вклад следующего месяца отрицательным. Тогда баланс после первого пересечения снова уйдёт ниже нуля. В отчёте храните всю траекторию, первое пересечение и текущий остаток. Если бизнесу нужна устойчивая окупаемость на наблюдаемом горизонте, определите её как месяц, после которого баланс больше не становился отрицательным до даты отчёта. Это другое правило, и оно должно быть подписано.

Для решения о расширении бюджета добавьте объём когорты, качество атрибуции и причины необычных расходов. Если одна крупная повторная покупка обеспечила всё пересечение, средняя когорта ещё не доказывает повторяемость результата при масштабировании. Полезный вывод звучит конкретно: эта когорта вернула затраты к пятому месяцу, запас составил десять тысяч; для следующей кампании нужно проверить, сохраняются ли стоимость привлечения и профиль вклада.

Продолжить работу с данными

Для регулярного сравнения каналов «Практическая аналитика данных» объединяет кейсы рекламных каналов и когортного удержания с проверкой исходных таблиц. Вы отработаете выбор знаменателя, повторение расчётов на новом периоде и объяснение результата в аналитической записке — следующий шаг после одного расчёта окупаемости. Откройте программу платного курса «Практическая аналитика данных».

Продолжить на практике

  • Практическая аналитика данных ↗

    Превратите знания SQL или Python в аналитическую работу: проверяйте данные, считайте бизнес-метрики, стройте дашборды и объясняйте выводы на трёх прикладных кейсах.