Как посчитать payback period в SQL
Содержание:
Что такое payback period
Payback period — за сколько месяцев привлечённый клиент окупит свой CAC. Если CAC = $1200, а клиент приносит $200 валовой прибыли в месяц — payback ≈ 6 месяцев.
Зачем это знать:
- Подсказывает финансовому здоровью бизнеса (короткий payback = быстрее реинвестируем)
- Влияет на стратегию роста (длинный payback требует много капитала)
- Стандарт для SaaS: <12 месяцев — хорошо, >24 — тревога
На собесе аналитика часто спрашивают вместе с CAC и LTV.
Формула
Payback period = CAC / Gross Margin per MonthГде Gross Margin per Month = ARPU × Margin (1 - cost_of_revenue_share).
Для простоты в учебниках часто используют:
Payback period (months) = CAC / Monthly ARPUЭто даёт период до того, как клиент окупит привлечение по выручке (без учёта стоимости обслуживания).
SQL: payback period простой
Допустим, есть таблицы customers (с CAC) и revenue_monthly (с выручкой по месяцам):
WITH customer_cac AS (
SELECT customer_id, cac
FROM customers
WHERE acquired_at >= '2026-01-01'
),
customer_arpu AS (
-- ARPU = средняя месячная выручка за наблюдаемый период
SELECT
customer_id,
AVG(monthly_revenue) AS avg_monthly_revenue
FROM revenue_monthly
GROUP BY customer_id
)
SELECT
ROUND(AVG(c.cac::NUMERIC / NULLIF(a.avg_monthly_revenue, 0)), 1) AS payback_months
FROM customer_cac c
JOIN customer_arpu a USING (customer_id);Без NULLIF запрос упадёт на клиентах с нулевой выручкой.
SQL: payback по когортам
Чтобы видеть payback по месяцу регистрации:
WITH cohort AS (
SELECT
customer_id,
DATE_TRUNC('month', acquired_at) AS cohort_month,
cac
FROM customers
),
revenue AS (
SELECT
customer_id,
AVG(monthly_revenue) AS avg_arpu
FROM revenue_monthly
GROUP BY customer_id
)
SELECT
c.cohort_month,
COUNT(*) AS customers,
ROUND(AVG(c.cac), 0) AS avg_cac,
ROUND(AVG(r.avg_arpu), 0) AS avg_arpu,
ROUND(AVG(c.cac::NUMERIC / NULLIF(r.avg_arpu, 0)), 1) AS payback_months
FROM cohort c
LEFT JOIN revenue r USING (customer_id)
GROUP BY 1
ORDER BY 1;Это даст когортный график payback. Если payback растёт — CAC опережает ARPU, проблема.
Месячный payback
Точнее — кумулятивная выручка с клиента к месяцу N. Когда она перевалила за CAC — окупился.
WITH cumulative AS (
SELECT
customer_id,
months_since_signup,
SUM(monthly_revenue) OVER (
PARTITION BY customer_id
ORDER BY months_since_signup
) AS cumulative_revenue
FROM revenue_monthly
)
SELECT
cum.customer_id,
MIN(cum.months_since_signup) AS payback_month
FROM cumulative cum
JOIN customers c ON c.customer_id = cum.customer_id
WHERE cum.cumulative_revenue >= c.cac
GROUP BY cum.customer_id;Этот запрос даёт реальный payback по каждому клиенту. Среднее или медиана — финальный показатель.
Частые ошибки
Использовать выручку вместо gross margin. Если у вас high cost of revenue (например, маркетплейс с комиссией 10% — дешевле в разы) — payback по выручке завышен. Корректно — gross margin per month.
Не учитывать blended CAC vs paid-only CAC. Если 50% клиентов пришли organic — blended CAC ниже реального ROI на платный канал.
Делить на ноль. Бесплатные тарифы → 0 ARPU. NULLIF спасает.
Считать payback на маленькой когорте. Один большой клиент → искажённое среднее. Используйте медиану или взвешенное среднее.
Не учитывать churn. Если payback 18 месяцев, а 70% клиентов уходит за 6 месяцев — фактический payback не достигается. Считайте payback с поправкой на retention.
FAQ
Какой payback считается хорошим?
SMB SaaS — <12 месяцев. Enterprise SaaS — <24 месяцев. Маркетплейс — обычно <6 месяцев.
Что важнее — payback или LTV/CAC?
Связанные, но разные метрики. Payback — про скорость окупаемости (cash flow). LTV/CAC — про долгосрочную прибыльность. На собесе спросят оба.
Это официальная информация?
Нет. Статья основана на индустриальных практиках.