Metric · Revenue

What is LTV, and how do you estimate it in Metabase?

LTV (customer lifetime value) estimates the total gross profit you expect from a customer over their entire relationship. It's the yardstick for how much you can afford to spend acquiring customers, and it ties together ARPU, churn, and margin. Estimate it in Metabase from billing data synced into a database (Stripe, Chargebee, Paddle, or Recurly).

TL;DR — A common estimate is LTV = ARPU × gross margin ÷ churn rate, where 1 ÷ churn is the average lifetime. It's a model, not a fact — use margin (not revenue) and keep the churn assumption honest.

How is LTV calculated?

The simplest durable formula combines three metrics you already track:

  • ARPU — average recurring revenue per customer.
  • Average lifetime = 1 ÷ churn rate (a customer with 3% monthly churn lasts ~33 months).
  • Gross margin — the share of revenue left after cost to serve.

LTV = ARPU × gross margin ÷ churn rate. Compute LTV per segment (plan, acquisition channel) rather than one blended number, since churn and ARPU vary widely across segments.

Use gross margin, not revenue

LTV based on revenue overstates the value of a customer. Multiply by gross margin so LTV reflects profit — that's what makes the LTV:CAC ratio meaningful. A healthy rule of thumb is LTV:CAC ≥ 3, but treat it as directional.

What data does LTV need?

  • ARPU from active subscriptions.
  • A churn rate at the same grain and cadence.
  • A gross-margin assumption for your subscription (often maintained outside billing data).

SQL patterns

LTV from ARPU, churn, and marginPostgreSQL

Swap the churn and margin literals for your own modeled values; segment for accuracy.

-- Simple LTV from ARPU and monthly customer churn
WITH inputs AS (
  SELECT
    (SELECT SUM(mrr) FROM modeled_mrr
      WHERE month = date_trunc('month', CURRENT_DATE))          AS mrr_now,
    (SELECT COUNT(DISTINCT customer_id) FROM modeled_mrr
      WHERE month = date_trunc('month', CURRENT_DATE))          AS customers_now,
    0.03  AS monthly_churn,   -- from /metrics/churn-rate
    0.80  AS gross_margin     -- your subscription gross margin
)
SELECT
  ROUND(mrr_now / NULLIF(customers_now, 0), 2)                  AS arpu,
  ROUND(1.0 / NULLIF(monthly_churn, 0), 1)                      AS avg_lifetime_months,
  ROUND((mrr_now / NULLIF(customers_now, 0))
        * gross_margin
        / NULLIF(monthly_churn, 0), 2)                          AS ltv
FROM inputs;

Pitfalls

Using revenue instead of margin.→ Multiply by gross margin, or LTV overstates profit and inflates LTV:CAC.
One blended LTV.→ Churn and ARPU differ by segment — compute LTV per plan or channel.
Assuming churn is constant forever.→ The 1 ÷ churn lifetime assumes a flat rate; early churn is usually higher, so treat LTV as directional.
Mixing time units.→ Keep ARPU and churn on the same period (both monthly or both annual).

Where this metric applies

LTV is derived from ARPU and churn, so any tool that supports those supports LTV.

Analytics

Metrics

FAQ

Is LTV the same as total revenue per customer?
No. LTV is a forward-looking estimate of gross profit over the expected lifetime, using churn to model how long customers stay. Historical revenue per customer is a lookback, not a projection.
What's a healthy LTV:CAC ratio?
Around 3:1 is a common target — enough margin to fund acquisition and overhead. Below 1:1 you lose money on each customer; far above 3:1 may mean you're underinvesting in growth.
Should I use revenue or margin in LTV?
Gross margin. Revenue-based LTV ignores the cost to serve and overstates how much you can spend to acquire a customer.