Как посчитать CAC recovery в SQL
Содержание:
Зачем CAC recovery
Payback period отвечает «сколько месяцев до полной окупаемости», но не показывает динамику внутри. CAC recovery — процент возвращённого CAC в каждой точке времени. Это даёт plot: «за 3 месяца окупаем 60%, за 6 — 90%, за 9 — 100%». Визуально понятно где cohort и куда движется.
Формула
recovery(k) = cumulative_revenue_per_user(k) / CAC= 1.0 (100%) — момент payback. < 1.0 — не окупились. > 1.0 — profit.
Recovery в SQL
WITH ltv AS (
SELECT cohort_month, months_since, cumulative_ltv FROM ltv_table
),
cac AS (
SELECT cohort_month, cac FROM cac_per_cohort
)
SELECT
l.cohort_month,
l.months_since,
l.cumulative_ltv,
c.cac,
l.cumulative_ltv / NULLIF(c.cac, 0) AS recovery_ratio,
l.cumulative_ltv / NULLIF(c.cac, 0) * 100 AS recovery_pct
FROM ltv l
JOIN cac c USING (cohort_month)
ORDER BY l.cohort_month, l.months_since;В дашборде строится линия от 0% до 100%+ за месяцы.
По каналам
SELECT
utm_source,
months_since,
AVG(cumulative_ltv / NULLIF(cac, 0)) * 100 AS avg_recovery_pct
FROM cohort_ltv_with_cac
WHERE cohort_month BETWEEN '2025-01-01' AND '2025-06-30' -- закрытые cohort
GROUP BY utm_source, months_since
ORDER BY utm_source, months_since;Сравните channel curves: на месяц 6 organic recovery 200%, paid — 60%. Channel split clear.
Recovery vs payback
WITH dashboard AS (
SELECT
cohort_month,
utm_source,
months_since,
cumulative_ltv / NULLIF(cac, 0) * 100 AS recovery_pct
FROM cohort_ltv_with_cac
)
SELECT
cohort_month,
utm_source,
MIN(months_since) FILTER (WHERE recovery_pct >= 100) AS payback_month,
MAX(recovery_pct) AS final_recovery
FROM dashboard
GROUP BY cohort_month, utm_source
ORDER BY cohort_month, utm_source;Если final_recovery > 200% — cohort даёт 2x возврата. Если 80% за 24 месяца — likely never gonna pay back.
Частые ошибки
Ошибка 1. Recovery без gross margin. Считается на revenue. Margin-recovery строже и реалистичнее для финансов.
Ошибка 2. Сравнивать молодые и старые cohort на абсолютной шкале месяцев. 3-месячная cohort вообще не имела шанс окупиться. Сравнивайте кривые.
Ошибка 3. Включать в knowledge base churned users. Recovery «как будто все остались» — оптимистично. Survivor-only recovery даёт другую картину.
Ошибка 4. CAC за период != CAC cohort. Если cohort из 100 users пришёл через 5 каналов, blended CAC ≠ CAC per channel. Cohort-level — точнее.
Ошибка 5. Игнорировать инфляцию / FX. Recovery за 24 месяца с скачком курса — нужно normalize.
Связанные темы
- Как посчитать payback по когортам в SQL
- Как посчитать LTV по когортам в SQL
- Как посчитать CAC по каналам в SQL
- Как посчитать CAC payback в SQL
FAQ
Recovery 100% = payback?
Да, эквивалентно payback period.
Какой recovery нормальный?
К месяцу 12 для SaaS — 80-150%. К 24 — 200%+.
Recovery плато на 70%?
Cohort фундаментально убыточная. Не масштабировать.
Recovery растёт после плато?
Возможен expansion / renewals. Cohort продолжает жить.
Recovery vs LTV/CAC?
Recovery — over time curve. LTV/CAC — однотонная metrика конечного состояния.