Как считать LTV пользователя
Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.
Зачем это знать
LTV — фундамент unit-экономики. Без honest LTV вы не знаете, сколько можно тратить на acquisition. Marketing CAC ≥ LTV → compania растёт в minus. LTV > CAC × 3 — unit-economics healthy.
На собесах продуктового и growth аналитика LTV просят часто. Правильный ответ — 3 метода: simple, cohort, predictive.
Короткое объяснение
LTV (Customer Lifetime Value) = общая revenue, которую пользователь приносит за «время жизни».
Чем больше LTV, тем больше можно тратить на acquisition.
Простая формула
LTV = ARPU × lifetime (месяцы)Или для subscription:
LTV = ARPU / churn_rateПример
ARPU = 100 ₽/мес. Monthly churn = 5%. Lifetime = 1 / 0.05 = 20 месяцев. LTV = 100 × 20 = 2000 ₽.
Недостатки: игнорирует gross margin, предполагает constant ARPU и churn.
LTV с gross margin
LTV = (ARPU × gross_margin) / churn_rateЕсли marginal cost — 20%, то gross margin = 80%.
LTV = 100 × 0.8 / 0.05 = 1600 ₽ (not 2000).
Реалистичнее.
Cohort LTV
Вместо average — per cohort:
WITH monthly_revenue AS (
SELECT
DATE_TRUNC('month', u.signup_at) AS cohort,
DATE_DIFF('month', u.signup_at, p.paid_at) AS tenure,
SUM(p.amount) AS revenue
FROM users u
LEFT JOIN payments p ON p.user_id = u.id
GROUP BY 1, 2
),
cohort_sizes AS (
SELECT cohort, COUNT(*) AS n_users FROM users GROUP BY 1
)
SELECT
mr.cohort,
SUM(mr.revenue) / cs.n_users AS cumulative_arpu
FROM monthly_revenue mr
JOIN cohort_sizes cs ON cs.cohort = mr.cohort
WHERE mr.tenure <= 12
GROUP BY 1, cs.n_users;Показывает revenue per signup за 12 мес. Это empirical LTV.
Predictive LTV
Для новых users нет history. Prediction:
Simple
ML модель: LTV ~ f(early actions, demographics, source).
Features:
- Activation actions (first week)
- Source (organic vs paid)
- Device, geo
Target: revenue за 90/180/365 дней (known history).
Advanced
BG/NBD + Gamma-Gamma (pareto/NBD) — classical Bayesian model для LTV.
Библиотека Python
from lifetimes import BetaGeoFitter, GammaGammaFitter
bgf = BetaGeoFitter()
bgf.fit(frequency, recency, T)
ggf = GammaGammaFitter()
ggf.fit(frequency, monetary_value)
clv = ggf.customer_lifetime_value(bgf, frequency, recency, T, monetary_value, time=12)Когортная динамика
Plot cumulative revenue per cohort по месяцам:
- Steep curve → fast LTV accumulation
- Flat tail → long-term users bring mало
- Kink → churn cliff
LTV / CAC
Основа unit-экономики.
- LTV / CAC < 1: loss на каждом user
- LTV / CAC ~ 1: break-even
- LTV / CAC > 3: healthy (rule of thumb)
- LTV / CAC > 5: underspent marketing (opportunity)
Pitfalls
Survivorship bias
Только «старые» users → biased upward. Include churned.
Constant assumptions
LTV = ARPU / churn неверно если ARPU меняется, churn меняется.
Cohort-based reality-check.
Discounted future
Deep future revenue надо discount (time value of money):
LTV = Σ (monthly_revenue_t × (1 - churn)^t) / (1 + discount_rate)^tGross vs net
Include refunds, fraud, discount.
Per-segment LTV
Важнее overall:
- Paid vs organic
- Geo
- Premium vs freemium
- Device
Decisions на acquisition — per segment.
На собесе
«Как посчитать LTV?» 3 метода: simple (ARPU × lifetime), cohort (empirical), predictive (ML).
«LTV / CAC?» > 3 — healthy. < 1 — loss.
«Подводные камни?» Survivorship, constant assumptions, discount, gross margin.
«Per segment?» Обязательно. Overall маскирует.
Частые ошибки
Average LTV
Mean LTV на heavily skewed distribution — бессмыслен. Используйте median или per-segment.
Игнорировать churn
«LTV = total revenue / users» не учитывает churn trend.
Использовать старые cohorts
Если product изменился, старые cohorts ≠ current.
Связанные темы
FAQ
Когортная или ML?
Если достаточно history (6+ мес) — cohort. Если нужна prediction для новых — ML.
Включать ли referrals?
Да, если user genereates acquisitions — это часть LTV.
Refunds?
Subtract. Net LTV.
Тренируйте unit-экономику — откройте тренажёр с 1500+ вопросами для собесов.