LTV¶
Lifetime Value, ARPU, and cohort revenue analysis from the Tidemill engine.
How LTV is calculated¶
ARPU (Average Revenue Per User):
ARPU = total_active_MRR / distinct_active_customers
Simple LTV divides ARPU by the monthly logo churn rate, giving the expected total revenue from an average customer over their lifetime:
LTV = ARPU / monthly_churn_rate
This assumes constant churn — a simplification, but standard in SaaS.
Cohort LTV tracks actual revenue per customer within each signup cohort, computed from paid invoices rather than a formula.
from tidemill import reports
from tidemill.reports.client import TidemillClient
reports.setup()
START, END = "2025-07-01", "2026-04-30"
tm = TidemillClient()
1. Current ARPU¶
Average Revenue Per User = total active MRR / distinct active customers.
reports.ltv.style_overview(reports.ltv.overview(tm, START, END))
| ARPU | Simple LTV | Implied Monthly Churn |
|---|---|---|
| $39.57 | $341.24 | 11.6% |
2. Monthly ARPU Timeline¶
Track ARPU over time to see how average revenue per customer evolves.
arpu_df = reports.ltv.arpu_timeline(tm, START, END)
reports.ltv.style_arpu_timeline(arpu_df)
| month | active_customers | mrr_dollars | arpu_dollars |
|---|---|---|---|
| Jul 2025 | 20 | $967.33 | $47.97 |
| Aug 2025 | 20 | $1,026.33 | $50.78 |
| Sep 2025 | 17 | $848.33 | $49.35 |
| Oct 2025 | 24 | $988.33 | $41.13 |
| Nov 2025 | 22 | $948.33 | $42.97 |
| Dec 2025 | 28 | $1,068.33 | $38.22 |
| Jan 2026 | 28 | $1,068.33 | $38.22 |
| Feb 2026 | 26 | $1,028.33 | $39.57 |
| Mar 2026 | 26 | $1,028.33 | $39.57 |
| Apr 2026 | 26 | $1,028.33 | $39.57 |
reports.ltv.plot_arpu_timeline(arpu_df)
3. Simple LTV¶
Simple LTV = ARPU / average monthly logo churn rate. The churn rate is computed per month within the selected period and averaged over months that had a starting cohort — months where no customer was active at the month start are skipped.
reports.ltv.plot_ltv_overview(reports.ltv.overview(tm, START, END))
4. Cohort LTV¶
Average total revenue per customer by the month they first subscribed.
cohort_df = reports.ltv.cohort(tm, START, END)
reports.ltv.style_cohort(cohort_df)
| cohort_month | customer_count | avg_dollars | total_dollars |
|---|---|---|---|
| Jul 2025 | 21 | $429.00 | $9,009.00 |
| Aug 2025 | 4 | $125.00 | $500.00 |
| Sep 2025 | 0 | $0.00 | $0.00 |
| Oct 2025 | 8 | $107.50 | $860.00 |
| Nov 2025 | 0 | $0.00 | $0.00 |
| Dec 2025 | 7 | $61.57 | $431.00 |
| Jan 2026 | 5 | $44.00 | $220.00 |
| Feb 2026 | 0 | $0.00 | $0.00 |
| Mar 2026 | 0 | $0.00 | $0.00 |
| Apr 2026 | 0 | $0.00 | $0.00 |
reports.ltv.plot_cohort(cohort_df)