Subscription customer LTV calculator
A customer paying 50 a month at 70% gross margin with 5% monthly churn is worth 700 over the relationship: 35 of monthly contribution across an average lifetime of 20 months. Test pricing or retention ideas before building a full model. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Monthly revenue
- 50
- Gross margin
- 70
- Monthly churn rate
- 5
- Contribution margin monthly
- 35
- Avg lifetime months
- 20
- Ltv
- 700
Subscription businesses live or die by how much a typical customer is worth over their entire relationship with the product. Founders, finance leads, and growth teams need a fast, shared number—not a spreadsheet debate—when they ask what one retained account contributes after variable cost and expected churn. This subscription customer LTV calculator applies the standard simple model: lifetime value equals average monthly revenue per customer times gross margin over monthly churn rate, with margin and churn entered as percentages. It also returns the implied average lifetime in months and the monthly contribution margin so you can sanity-check the arithmetic against cohort dashboards.
How the standard subscription LTV formula works
In the most common first-pass model used by SaaS and recurring-billing teams, customer lifetime value is the present value of contribution margin you expect from a typical customer before they churn. When you work in monthly units and ignore discounting, that collapses to a clean identity: average monthly revenue per customer (ARPU) times gross margin as a fraction of revenue, divided by the monthly churn rate as a fraction of customers who leave each month.
If ARPU is fifty currency units, gross margin is seventy percent, and monthly churn is five percent, monthly contribution margin is thirty-five, average lifetime is one over zero point zero five which is twenty months, and LTV is thirty-five divided by zero point zero five, or seven hundred. Use the returned average lifetime months as a quick cross-check against your product’s actual median tenure from analytics.
Where a subscription LTV calculator earns its keep
SaaS founders and CFOs use a subscription customer LTV calculator before pricing changes so they can see how a higher ARPU or a lower churn target moves lifetime value without rebuilding a full financial model. Growth and product teams compare LTV across plans when deciding where to invest retention work—reducing monthly churn by one percentage point often moves LTV more than a small list-price bump. Educators teaching unit economics and investor-ready metrics need a deterministic oracle that rejects zero churn instead of silently returning infinity or NaN.
Agencies and consultancies embed the same arithmetic in client onboarding so every account shares one definition of LTV from ARPU, margin, and churn. Failed validation does not consume balance. Keep requests small, pin the rounded fields in tests, and you get reproducible lifetime value for decks, LMS plugins, and edge workers without standing up a full cohort-retention engine of your own.
What you can do with it
Unit economics for SaaS pricing reviews
Enter ARPU, gross margin %, and monthly churn % to get LTV and average lifetime months before you change list prices or discount policies.
Retention investment prioritization
Model how a one-point drop in monthly churn lifts LTV so product and success teams can compare retention work against acquisition spend.
Teaching and investor-ready unit economics
Give students and founders a deterministic LTV oracle that rejects zero churn and returns the standard ARPU × margin / churn identity.
FAQ
Are gross margin and churn entered as percentages or decimals?
As percentages. Use 70 for 70% margin and 5 for 5% monthly churn—not 0.70 and 0.05. The formula divides each by 100 internally.
Does this LTV include CAC or discounting?
No. This is the simple undiscounted contribution LTV from ARPU, margin, and churn.
How do you calculate subscription customer LTV?
Multiply average monthly revenue per customer by gross margin, then divide by monthly churn. With 50 of revenue, 70% margin and 5% churn, the monthly contribution is 35 and lifetime value is 700.
What happens if monthly churn is zero?
The calculation is refused. Zero churn would mean customers never leave and lifetime value would be infinite, which is not a useful planning figure, so churn must be greater than zero. Negative churn is rejected for the same reason.
How is the average customer lifetime in months worked out?
It is one divided by the monthly churn rate. At 5% churn a typical customer stays 20 months; compare that figure with the median tenure in your own analytics to check that the model is realistic.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/biz/subscription-ltv-calc \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"monthly_revenue":50,"gross_margin":70,"monthly_churn_rate":5}'const res = await fetch("https://api.kit.forhosting.com/biz/subscription-ltv-calc", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"monthly_revenue": 50,
"gross_margin": 70,
"monthly_churn_rate": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/biz/subscription-ltv-calc",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"monthly_revenue": 50,
"gross_margin": 70,
"monthly_churn_rate": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/biz/subscription-ltv-calc", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"monthly_revenue":50,"gross_margin":70,"monthly_churn_rate":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"monthly_revenue":50,"gross_margin":70,"monthly_churn_rate":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/biz/subscription-ltv-calc", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"monthly_revenue": 50,
"gross_margin": 70,
"monthly_churn_rate": 5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "biz.subscription_ltv_calc",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Zero or negative churn is rejected with invalid_input, because those inputs would imply an infinite or negative lifetime rather than a useful planning figure. The same pure analytic path powers the free browser tool and the API, so board decks, pricing experiments, and automation pipelines always agree on the formula before anyone opens a full cohort model.
How the standard subscription LTV formula works
Equivalently, LTV equals monthly_revenue times gross_margin percent divided by monthly_churn_rate percent—the same numbers without converting to decimals by hand. This model assumes roughly constant ARPU and churn, treats margin as the share of revenue left after variable delivery cost, and does not layer CAC, expansion revenue, or multi-segment mix. It is the whiteboard formula investors and operators still use before building a full cohort retention curve. Edge cases matter: churn of zero would make lifetime infinite, so this calculator rejects zero and negative churn with a clear invalid_input error; margin must sit between zero and one hundred percent; revenue must be non-negative.
Input contract, response fields, and error behaviour
POST a JSON body with three required finite numbers. monthly_revenue is average monthly revenue per customer in your currency units—fifty means fifty per month of billings or recognized recurring revenue for a typical account. gross_margin is gross margin as a percentage from zero through one hundred inclusive—seventy means seventy percent of revenue remains after variable cost of goods or service delivery. monthly_churn_rate is the monthly customer churn percentage and must be strictly greater than zero; five means five percent of customers leave each month. Missing fields, empty strings, non-finite values, negative revenue, margin outside zero to one hundred, and zero or negative churn all fail with invalid_input naming the problem; those validation failures are not billed. On success the body echoes the three inputs, returns contribution_margin_monthly as monthly_revenue times gross_margin over one hundred, avg_lifetime_months as one hundred divided by monthly_churn_rate, ltv as monthly_revenue times gross_margin divided by monthly_churn_rate, and a short formula string you can display next to the numbers. Numeric strings are accepted the same way as JSON numbers. This endpoint does not discount future cash flows, split logo versus revenue churn, or net out customer acquisition cost; pair LTV with your own CAC figure when you need payback or LTV-to-CAC ratios.
Technical questions
How is subscription customer LTV calculated?
LTV = monthly_revenue × (gross_margin/100) / (monthly_churn_rate/100), which equals monthly_revenue × gross_margin / monthly_churn_rate when margin and churn are percentages. The API also returns monthly contribution margin and average lifetime in months.
What happens if monthly churn rate is zero or negative?
The task fails with invalid_input. Zero or negative churn would imply infinite or nonsensical lifetime, so the calculator rejects those values and does not bill the call.
What does the subscription LTV calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.