Сколько месяцев нужно чтобы окупить стоимость привлечения клиента (CAC) через его ARPU.
$$\text{Payback} = \frac{CAC}{ARPU \times \text{gross_margin}}$$
Что измеряет: скорость возврата инвестиций в маркетинг. Критично для cash flow стартапа.
Расчёт:
Бенчмарки:
| Бизнес-модель | Healthy payback |
|---|---|
| Consumer subscription | < 6 месяцев |
| B2B SaaS SMB | 6-12 месяцев |
| B2B SaaS enterprise | 12-24 месяцев |
| Banking apps | 3-6 месяцев |
| E-commerce | < 3 месяцев |
Связь с CAC/LTV:
Payback и LTV/CAC — разные метрики, обе важны:
Можно иметь LTV/CAC = 10 но payback 24 месяца — отлично долгосрочно, но проблематично для cash-poor стартапа.
Pitfalls:
Считай через gross margin, не revenue. Если COGS = 50% — payback в 2 раза дольше чем без учёта.
Discount LTV in payback — для долгосрочных подписок применяй NPV. 1000 ₸ через 5 лет ≠ 1000 ₸ сегодня.
Cohort-specific: payback для cohort'ы октября 2025 vs мая 2026 — могут сильно отличаться (изменение CAC, ARPU, конверсий).
-- Cohort payback period
WITH cohort_cac AS (
SELECT date_trunc('month', registered_at)::date AS cohort,
AVG(acquisition_cost_kzt) AS cac
FROM customers
GROUP BY 1
),
cohort_revenue AS (
SELECT date_trunc('month', c.registered_at)::date AS cohort,
EXTRACT(EPOCH FROM (date_trunc('month', t.transaction_date) -
date_trunc('month', c.registered_at))) / (86400 * 30) AS month_n,
SUM(t.amount_kzt) AS revenue_kzt
FROM customers c
JOIN transactions t ON t.customer_id = c.id
GROUP BY 1, 2
)
SELECT r.cohort, r.month_n,
SUM(r.revenue_kzt) OVER (PARTITION BY r.cohort ORDER BY r.month_n) AS cumulative_rev,
AVG(c.cac) * COUNT(DISTINCT cust.id) OVER (PARTITION BY r.cohort) AS total_cac
FROM cohort_revenue r
JOIN cohort_cac c ON c.cohort = r.cohort
JOIN customers cust ON date_trunc('month', cust.registered_at)::date = r.cohort
ORDER BY r.cohort, r.month_n;
# Cumulative revenue per cohort
revenue["cohort_month"] = revenue["cohort_date"].dt.to_period("M")
revenue["month_n"] = (revenue["transaction_date"].dt.to_period("M") -
revenue["cohort_month"]).apply(lambda x: x.n)
pivot = revenue.pivot_table(index="cohort_month", columns="month_n",
values="amount", aggfunc="sum").cumsum(axis=1)
# Payback: первый месяц где cumulative >= CAC × N_users
payback_months = (pivot.div(cac_per_cohort, axis=0) >= 1).idxmax(axis=1)