---
title: "Building a True LTV Model for Mobile Apps with Blended Revenue"
published: true
description: "Build a cohort-based LTV calculator that separates subscription and IAP revenue — with Kotlin code, real numbers, and the 35% inflation trap most teams miss."
tags: mobile, architecture, performance, kotlin
canonical_url: https://blog.mvpfactory.co/unit-economics-true-ltv-blended-revenue-mobile
---
## What We Will Build
A practical LTV (lifetime value) model that calculates subscription and IAP revenue **separately**, then combines them at the cohort level. By the end, you will have working Kotlin functions you can drop into your analytics pipeline — and you will understand why the single-number LTV on your dashboard is likely inflated by 20-40%.
## Prerequisites
- Basic Kotlin (data classes, collections)
- Familiarity with mobile monetization concepts (subscriptions, consumable IAPs)
- A spreadsheet or REPL to follow along
## Step 1: Define Your Revenue Streams as Separate Models
The core insight is that subscription users and IAP users retain differently. Let me show you a pattern I use in every project — model them as distinct data classes.
kotlin
data class SubRevenue(
val monthlyPrice: Double,
val momRetention: Double, // e.g., 0.72
val refundRate: Double // e.g., 0.07
)
data class IapCohortMonth(
val month: Int,
val arpuIap: Double,
val survivalRate: Double
)
Subscriptions are predictable and decay logarithmically. IAP revenue follows a power-law — a handful of whales drive most of the value. Mixing these curves into one number is where teams get burned.
## Step 2: Calculate Subscription LTV
For recurring revenue with geometric retention, the formula is clean:
kotlin
fun subscriptionLtv(rev: SubRevenue): Double {
val retentionMultiplier = rev.momRetention / (1.0 - rev.momRetention)
return rev.monthlyPrice * retentionMultiplier * (1.0 - rev.refundRate)
}
// Example: $9.99/mo, 72% retention, 7% refund
val subLtv = subscriptionLtv(SubRevenue(9.99, 0.72, 0.07))
// Result: $23.90
This gives you the net present value of a subscription user over their lifetime. The retention rate does the heavy lifting — at 72% MoM, the multiplier is `0.72 / 0.28 = 2.57`.
## Step 3: Calculate IAP LTV from Cohort Data
IAP is harder. You cannot use a single retention rate because revenue per user decays differently than engagement. Use observed ARPU decay across your cohort window:
kotlin
fun iapLtv(months: List, refundRate: Double): Double {
val gross = months.sumOf { it.arpuIap * it.survivalRate }
return gross * (1.0 - refundRate)
}
val iapMonths = listOf(
IapCohortMonth(1, 1.20, 1.00),
IapCohortMonth(2, 0.72, 0.68),
IapCohortMonth(3, 0.43, 0.50),
// Months 4-12 contribute ~$0.41 cumulative
) + (4..12).map { IapCohortMonth(it, 0.25 / it, 0.35) }
val iapResult = iapLtv(iapMonths, 0.03)
// Result: ~$2.25
## Step 4: Combine at the Cohort Level
kotlin
fun totalLtv(sub: SubRevenue, iapMonths: List, iapRefundRate: Double): Double {
return subscriptionLtv(sub) + iapLtv(iapMonths, iapRefundRate)
}
// True LTV: $23.90 + $2.25 = $26.15
**Never average across cohorts.** Each acquisition channel produces a different subscriber-to-IAP ratio. Run this per channel.
## The 35% Inflation Trap
Here is the gotcha that will save you hours — and possibly your acquisition budget.
If you calculate a single blended ARPU (total revenue / total users) and apply one retention curve, you get ~$35-36 LTV. The docs do not mention this, but IAP whale spending gets smoothed across the longer subscription retention curve, inflating the result by roughly 35%.
| Approach | LTV | LTV:CAC at $12 CAC |
|---|---|---|
| Blended (wrong) | ~$36 | 3.0:1 |
| Separated (correct) | $26.15 | 2.2:1 |
Same data. Completely different acquisition strategy. At 3:1 you scale aggressively. At 2.2:1 you scale carefully. Teams that use the blended number to justify jumping from $50K to $200K/month in spend are the ones posting mortems six months later.
## Gotchas
- **Channel mix matters.** TikTok campaigns may drive IAP-heavy users (short spikes). Organic search may drive subscribers (long, predictable revenue). Same blended LTV, wildly different business quality.
- **Do not extrapolate IAP tails.** Subscription tails are predictable with geometric decay. IAP tails are not — cap your projection at observed data plus a conservative estimate.
- **Refund rates differ.** Subscriptions see 5-10% refunds (trial abuse). IAP sits at 2-4%. Applying one refund rate to blended revenue distorts both streams.
- **Platform fees are identical** (~30%, or 15% for small business programs), so margin is not the differentiator — retention shape is.
## Wrapping Up
Here is the minimal setup to get this working: separate your revenue streams, calculate LTV independently for each, and sum them at the cohort level per acquisition channel. Use the conservative number for spend decisions. Treat any gap between the separated model and the blended model as margin of safety, not budget to deploy.
Drop these functions into your analytics service, feed them real cohort data, and compare the output to whatever your dashboard currently reports. The delta will tell you exactly how much risk you have been underpricing.
Top comments (0)