Lester Leong
How to Calculate Customer Lifetime Value (And Why Most Startups Get It Wrong)
The Most Dangerous Number in Your Pitch Deck
Every startup I have consulted for has an LTV number. Most of them are wrong. Not slightly off. Wrong in ways that distort fundraising narratives, misallocate marketing spend, and mask unit economics problems that will surface 12 months later when the cash is gone.
The core issue is not mathematical. The formula is simple. The issue is that teams calculate LTV once, put it on a slide, and never revisit the assumptions underneath it. I have seen a B2B SaaS company raise a Series A on an LTV of $14,000 that was actually closer to $3,200 when you stripped out the enterprise contract that was skewing the average. I have seen an e-commerce startup report LTV using gross revenue instead of contribution margin, which made their unit economics look profitable when they were losing $8 per customer after fulfillment costs.
These are not edge cases. They are the norm.
The Formula, Without the Hand-Waving
Customer Lifetime Value has a straightforward mathematical definition:
LTV = Average Revenue Per User (ARPU) x Gross Margin x Average Customer Lifespan
For subscription businesses, this is often expressed as:
LTV = (ARPU x Gross Margin) / Churn Rate
The division by churn rate works because the expected lifespan of a customer is the inverse of churn. If your monthly churn is 5%, your average customer lifespan is 1 / 0.05 = 20 months. If your ARPU is $50/month and your gross margin is 80%, that gives you:
LTV = ($50 x 0.80) / 0.05 = $800
This version assumes constant churn, which is rarely true in practice (more on that below). But it is the right starting point because it forces you to be explicit about three inputs: what your customer pays, what you keep after direct costs, and how long they stay.
Mistake 1: Using Revenue Instead of Margin
This is the most common error I encounter when auditing startup analytics. A SaaS company with $100/month ARPU and 75% gross margin reports an LTV of $2,000 (assuming 5% churn). The real LTV is $1,500. That $500 difference per customer is not a rounding error. Multiply it across your customer base and you are looking at a fundamentally different business.
For e-commerce and marketplace businesses, the gap is worse. I worked with a DTC brand that had $120 average order value, 2.3 average purchases per customer, and was reporting an LTV of $276. Their contribution margin after COGS, shipping, and payment processing was 31%. Actual LTV: $85.56. Their CAC was $72. They thought they had a healthy 3.8x LTV/CAC ratio. The real ratio was 1.19x, which meant they were barely breaking even before accounting for any fixed costs.
Always use margin. Revenue is vanity. Margin is the business.
Mistake 2: Blended Averages That Hide Cohort Differences
Averaging across your entire customer base is the fastest way to produce an LTV number that describes nobody. Different acquisition channels, pricing tiers, and signup cohorts churn at wildly different rates.
During my time at a financial social media startup (before its acquisition), we discovered that users acquired through content marketing had a 14-month average lifespan while users from paid social had a 4.5-month average lifespan. The blended average was 8.2 months. That single number was useless for making spend allocation decisions because it overstated the value of paid social customers and understated the value of organic ones.
The fix is to calculate LTV by cohort. At minimum, segment by:
- Acquisition channel: organic, paid, referral, partner - Pricing tier: free-to-paid converts versus direct-to-paid - Signup cohort: monthly or quarterly vintages
When I consult with startups on analytics infrastructure, the cohort breakdown is the first thing I build. It typically takes a week and changes the entire conversation about where to spend the next dollar.
Mistake 3: Assuming Constant Churn
The formula LTV = (ARPU x Margin) / Churn assumes churn is constant over time. In practice, churn is highest in the first 30 to 90 days and declines significantly for customers who survive that initial period.
A typical SaaS pattern looks like this: 8% monthly churn in months 1 through 3, dropping to 3% in months 4 through 12, then settling at 1.5% for customers who make it past year one. Using the blended 5% churn rate in your LTV formula understates the value of retained customers and overstates the value of new ones.
The more accurate approach is to build a survival curve from your actual retention data and sum the expected revenue over each period. (If your retention data itself is unreliable, start with [how to analyze retention curves properly](/insights/retention-curve-analysis-guide) before attempting LTV.) This is where the Python comes in.
A Python Implementation That Actually Works
This snippet calculates LTV using cohort-level retention data instead of a single churn rate. It handles the non-constant churn problem directly.
```python import numpy as np
def calculate_ltv( monthly_arpu: float, gross_margin: float, monthly_retention_rates: list[float], projection_months: int = 60, discount_rate: float = 0.0 ) -> dict: """ Calculate LTV from observed monthly retention rates.
Args: monthly_arpu: Average revenue per user per month. gross_margin: Fraction (e.g., 0.80 for 80%). monthly_retention_rates: Observed retention by month. Example: [0.92, 0.88, 0.85, 0.83, ...] means 92% survive month 1, etc. projection_months: How far to project if retention data is shorter. discount_rate: Monthly discount rate for NPV calculation (0.0 = undiscounted).
Returns: Dict with ltv, cumulative_survival, and monthly_contributions. """ margin_per_user = monthly_arpu * gross_margin observed_months = len(monthly_retention_rates)
# Extend retention if we need to project beyond observed data. # Use the last observed retention rate as steady-state assumption. if observed_months < projection_months: steady_state = monthly_retention_rates[-1] retention = monthly_retention_rates + [steady_state] * (projection_months - observed_months) else: retention = monthly_retention_rates[:projection_months]
# Build the survival curve: probability a customer is still active at month t. survival = np.cumprod(retention)
# Monthly contribution = survival probability * margin, discounted. contributions = [] for t, s in enumerate(survival): discount_factor = (1 + discount_rate) ** (t + 1) if discount_rate > 0 else 1.0 contributions.append((s * margin_per_user) / discount_factor)
return { "ltv": round(sum(contributions), 2), "months_projected": len(contributions), "survival_at_12m": round(survival[11], 4) if len(survival) >= 12 else None, "survival_at_24m": round(survival[23], 4) if len(survival) >= 24 else None, }
# Example: B2B SaaS with $200/mo ARPU, 82% gross margin, # and retention that improves after the first 3 months. retention_data = [ 0.91, 0.93, 0.95, # months 1-3: early churn is highest 0.97, 0.97, 0.97, # months 4-6: stabilizing 0.98, 0.98, 0.98, # months 7-9: loyal base 0.985, 0.985, 0.985 # months 10-12: steady state ]
result = calculate_ltv( monthly_arpu=200, gross_margin=0.82, monthly_retention_rates=retention_data, projection_months=36, discount_rate=0.01 # 1% monthly discount for NPV )
print(f"36-month LTV: ${result['ltv']}") print(f"12-month survival: {result['survival_at_12m']:.1%}") print(f"24-month survival: {result['survival_at_24m']:.1%}") # Output will vary. Run it with your own retention data. ```
The key difference from the textbook formula: this uses actual retention data instead of assuming a single churn rate. The result is an LTV number that reflects how your customers actually behave, not how a mathematical convenience says they should.
Mistake 4: Ignoring the Time Value of Money
An LTV of $2,400 collected over 4 years is not the same as $2,400 collected over 12 months. This matters more than most startups think, especially if you are burning cash and your CAC payback period is long.
The Python snippet above includes a discount rate parameter for this reason. A 10% annual discount rate (roughly 0.83% monthly) is a reasonable default for most venture-backed startups. It will not dramatically change your LTV number, but it will change how you compare strategies that front-load revenue (annual plans, onboarding fees) against strategies that spread revenue over time.
When I work on the GenAI side of a large finance tech company, the NPV-adjusted view is standard practice for any customer profitability analysis. Startups should adopt the same discipline, even if the absolute numbers are smaller.
The LTV/CAC Ratio: What "Good" Actually Looks Like
The conventional wisdom says LTV/CAC should be 3:1 or higher. That benchmark is roughly right for SaaS, but it obscures important nuance.
A 3:1 ratio with a 6-month CAC payback period is a healthy business. A 3:1 ratio with a 24-month payback period might not survive long enough to collect the return. The ratio tells you the eventual economics. The payback period tells you whether you will run out of cash before those economics materialize.
From my consulting work, here are the benchmarks I use across business types:
- B2B SaaS: LTV/CAC of 3:1 with payback under 12 months. Below 2.5:1, the unit economics need investigation. - E-commerce/DTC: LTV/CAC of 2:1 with first-purchase profitability close to breakeven. Repeat purchase rate above 25% within 6 months. - Marketplace: LTV/CAC of 2.5:1 minimum, with separate calculations for supply-side and demand-side. Most marketplace startups I have audited calculate a single blended ratio that hides the fact that one side is subsidizing the other.
If your ratio is below these thresholds, the answer is usually not "spend more on marketing." It is "fix retention" or "fix pricing." Acquiring customers more efficiently does not help if those customers do not stay.
Building LTV Into Your Operating Rhythm
Calculating LTV once is a slide deck exercise. Making it useful requires embedding it into how the company operates.
The minimum viable approach: recalculate cohort-level LTV monthly. Track how the number moves as your product, pricing, and customer mix evolve. When LTV drops for a specific cohort, that is an early warning signal. When LTV rises, that tells you what is working.
Pair LTV with two other metrics: CAC by channel (to calculate per-channel LTV/CAC ratios) and months-to-payback (to monitor cash efficiency). These three numbers together give you a complete picture of customer unit economics. Everything else is commentary.
I have seen this three-metric operating rhythm transform how startup leadership teams make decisions. One company I advised was spending 60% of their marketing budget on a channel with a 1.4:1 LTV/CAC ratio because their blended ratio of 3.2:1 looked healthy. The per-channel view made the reallocation obvious. Within two months, their blended ratio improved to 4.1:1 with no increase in total spend.
The Uncomfortable Truth
Most startups do not have enough data to calculate a reliable LTV. If you have fewer than 200 customers and less than 12 months of retention data, any LTV number you produce is a rough estimate at best. That is fine, as long as you treat it as an estimate and not as a fact.
State your assumptions explicitly. Use ranges instead of point estimates. Update the calculation as you accumulate data. The discipline of recalculating LTV quarterly, with transparent methodology, is worth more than a precise number built on shaky inputs.
LTV is not a number you calculate once. It is a system you maintain.
---
I help startups build analytics systems that turn data into decisions. If your LTV calculation is guesswork, let's fix it. [lester@gradientgrowth.com](mailto:lester@gradientgrowth.com)