Как посчитать CAC recovery в SQL

Закрепи формулу cac recovery в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать cac recovery в Telegram

Зачем 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.

Закрепи формулу cac recovery в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать cac recovery в Telegram

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.

Связанные темы

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ика конечного состояния.