Раздел 42 · Аналитика данных с нуля

Юнит-экономика: CAC, LTV и окупаемость каналов

middle~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Бран · продюсер «Хроник Пограничья»

Маркетинг просит удвоить бюджет на блогеров: «в марте был рекордный приток игроков». А мне кажется, мы покупаем игроков дороже, чем они нам платят. Какие каналы окупаются?

В уроке про метрики мы считали CAC и LTV на табличке из десяти игроков. Теперь посчитаем их на всей базе и по каждому каналу привлечения. Для этого в guild есть таблица marketing_spend: сколько денег ушло на каждый платный канал в каждый день.

Ферма и цыплята

Представь фермера, который покупает цыплят у разных поставщиков. Цыплёнок от одного стоит 45 рублей и несёт много яиц, от другого стоит 950 и почти не несёт. Фермеру мало знать, сколько всего яиц на ферме. Ему нужно для каждого поставщика сравнить цену цыплёнка с тем, что цыплёнок принесёт.

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

  • CAC: сколько стоил один игрок. Расходы канала, делённые на число игроков, пришедших по нему;
  • LTV: сколько игрок принёс. Выручка от игроков канала, делённая на их число.

Если LTV меньше CAC, канал покупает игроков в убыток. Ещё одна метрика смотрит на то же сверху: ROAS, выручка канала на рубль рекламы.

Расходы и установки отдельно

Расходы лежат в marketing_spend по дням, установки в players по игрокам. Первое желание соединить их по каналу и сгруппировать. Не надо: каждый день расходов встретится с каждым игроком канала, и сумма вырастет в сотни раз. Это размножение строк из урока 26. Каждую величину считаем в своём CTE и соединяем уже по строке на канал:

WITH spend AS (
  SELECT channel, sum(spend_rub) AS spend
  FROM marketing_spend
  GROUP BY channel
), installs AS (
  SELECT channel, count(*) AS installs
  FROM players
  WHERE email NOT LIKE '%@studio.dev'
  GROUP BY channel
)
SELECT s.channel, i.installs, s.spend, round(s.spend / i.installs, 2) AS cac
FROM spend s
JOIN installs i ON i.channel = s.channel;

Выручку берём чистую, как в боссе блока C: только paid, одна покупка на чек и без тестовых аккаунтов студии. Добавляем третий CTE revenue и получаем таблицу каналов:

channelигроковрасходы, ₽CAC, ₽выручка, ₽LTV, ₽ROAS
crosspromo41918 813,9044,90119 805285,936,37
ads_vk804129 330,33160,86126 938157,880,98
ads_yandex588122 957,22209,1148 99883,330,40
bloggers712681 745,07957,5136 19050,830,05

Канала organic в таблице нет: за него не платили, и внутреннее соединение с расходами его отбросило. Органика привела 1554 игрока и 325 825 ₽, это хорошая планка: LTV органического игрока 209,67 ₽.

Блогеры сжигают бюджет: игрок стоит 957,51 ₽, а приносит 50,83 ₽. На каждый рубль рекламы вернулось 5 копеек. Кросс-промо наоборот: 45 ₽ за игрока, который приносит 286 ₽.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.