Как посчитать payback period в SQL
daily_revenue содержит date и revenue. Как это сделать?Содержание:
Что такое 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 по каждому клиенту. Среднее или медиана — финальный показатель.
Частые ошибки
Использовать выручку вместо валовой маржи. Если у вас высокая себестоимость (например, у маркетплейса с комиссией 10% маржа в разы меньше выручки), payback по выручке завышен. Корректно считать по валовой марже за месяц.
Не различать blended CAC и CAC только по платным каналам. Если 50% клиентов пришли органически, blended CAC получается ниже реального CAC платного канала — и ROI платного привлечения выглядит завышенным.
Делить на ноль. Бесплатные тарифы → 0 ARPU. NULLIF спасает.
Считать payback на маленькой когорте. Один большой клиент → искажённое среднее. Используйте медиану или взвешенное среднее.
Не учитывать churn. Если payback 18 месяцев, а 70% клиентов уходит за 6 месяцев — фактический payback не достигается. Считайте payback с поправкой на удержание.
FAQ
Какой payback считается хорошим?
Зависит от типа бизнеса. Для SMB-SaaS хорошим считается payback меньше 12 месяцев, для enterprise-SaaS — меньше 24, а для маркетплейсов — обычно меньше 6.
Что важнее — payback или LTV/CAC?
Это связанные, но разные метрики. Payback отвечает на вопрос, как быстро вернутся вложенные деньги (скорость окупаемости и денежный поток), а LTV/CAC — на вопрос о долгосрочной прибыльности привлечения. На собесе, скорее всего, спросят про обе.
Это официальная информация?
Нет. Статья основана на индустриальных практиках.