Customer Lifetime Value Modeling
Why a single average LTV number is almost always the wrong input
Customer Lifetime Value (LTV or CLV) is the total net revenue (or margin) a customer is expected to generate over their relationship with the business. The simplest formula — average order value × purchase frequency × customer lifespan — produces one blended number that's frequently used to set acquisition budgets ('we can spend up to $X per customer because LTV is $Y'). The problem is that real customer bases are heavily skewed: a small cohort of high-value, long-tenure customers drags the average up while most customers churn early at low value, meaning the single average overstates what a 'typical' newly acquired customer is actually worth and routinely leads to overspending on acquisition channels that bring in low-LTV customers.
Historical vs. predictive LTV
Historical LTV simply sums what customers have already spent to date — it's accurate but backward-looking, and for a newly acquired customer it tells you almost nothing about their expected future value. Predictive LTV models expected future value based on early behavioral signals (first-purchase size, category, engagement in the first 30/60/90 days) and historical patterns of similar past customers, which is what actually makes LTV useful for real-time decisions like setting bid caps in paid acquisition or deciding how much onboarding investment a given new customer segment deserves.
-- Build a cumulative revenue curve by signup cohort and days-since-signup,
-- the foundation for both historical reporting and the predictive models
-- that extrapolate incomplete cohorts' future value.
SELECT
DATE_TRUNC(u.signup_date, MONTH) AS cohort_month,
DATE_DIFF(o.order_date, u.signup_date, DAY) AS days_since_signup,
COUNT(DISTINCT u.user_id) AS cohort_size,
SUM(o.net_revenue) AS cumulative_revenue,
SUM(o.net_revenue) / COUNT(DISTINCT u.user_id) AS cumulative_revenue_per_user
FROM analytics.users u
JOIN analytics.orders o ON o.user_id = u.user_id
WHERE DATE_DIFF(o.order_date, u.signup_date, DAY) BETWEEN 0 AND 365
GROUP BY cohort_month, days_since_signup
ORDER BY cohort_month, days_since_signupLTV modeling approaches
| Approach | How it works | Best fit | Key limitation |
|---|---|---|---|
| Simple average formula | AOV x frequency x lifespan, blended across all customers | Quick directional estimate, low data maturity | Masks segment variance; misleading for acquisition decisions |
| Cohort-based historical | Cumulative revenue curves by signup cohort over time | Understanding actual realized value by acquisition period/channel | Still backward-looking; young cohorts are incomplete |
| Probabilistic (BG/NBD, Gamma-Gamma) | Statistical models of purchase frequency and monetary value distributions | Subscription/repeat-purchase businesses with transaction history | Requires sufficient transaction history per customer; complex to implement |
| ML-based predictive LTV | Gradient boosting/regression on early behavioral + firmographic features | Large customer bases wanting per-customer predictions early | Needs substantial labeled historical data and feature engineering |
Segment LTV by acquisition channel before trusting a blended CAC:LTV ratio
Early behavioral signals often predict LTV better than demographic data
What's Next?
LTV modeling answers 'how much is this customer worth' — the complementary question of 'which existing customers deserve which treatment right now' is answered by segmentation frameworks that combine recency, frequency, and monetary behavior into actionable customer groups.
I build these systems professionally.
Whether it's a RAG pipeline, analytics migration, or AI workflow — let's talk.