К списку метрик
MONETIZATION

Payback Period (CAC payback)

Payback Period

Сколько месяцев нужно чтобы окупить стоимость привлечения клиента (CAC) через его ARPU.

ФОРМУЛА

$$\text{Payback} = \frac{CAC}{ARPU \times \text{gross_margin}}$$

ОПИСАНИЕ

Что измеряет: скорость возврата инвестиций в маркетинг. Критично для cash flow стартапа.

Расчёт:

  • ARPU = 1000 ₸/мес
  • Gross margin = 70% (после COGS — серверы, поддержка)
  • CAC = 5000 ₸
  • Payback = 5000 / (1000 × 0.7) = 7.14 месяцев

Бенчмарки:

Бизнес-модельHealthy payback
Consumer subscription< 6 месяцев
B2B SaaS SMB6-12 месяцев
B2B SaaS enterprise12-24 месяцев
Banking apps3-6 месяцев
E-commerce< 3 месяцев

Связь с CAC/LTV:

Payback и LTV/CAC — разные метрики, обе важны:

  • LTV/CAC — про прибыльность за всю жизнь клиента
  • Payback — про скорость возврата (cash flow)

Можно иметь LTV/CAC = 10 но payback 24 месяца — отлично долгосрочно, но проблематично для cash-poor стартапа.

Pitfalls:

  1. Считай через gross margin, не revenue. Если COGS = 50% — payback в 2 раза дольше чем без учёта.

  2. Discount LTV in payback — для долгосрочных подписок применяй NPV. 1000 ₸ через 5 лет ≠ 1000 ₸ сегодня.

  3. Cohort-specific: payback для cohort'ы октября 2025 vs мая 2026 — могут сильно отличаться (изменение CAC, ARPU, конверсий).

SQL ПРИМЕР
-- 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;
PYTHON ПРИМЕР
# 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)
СВЯЗАННЫЕ МЕТРИКИ