(Lifetime Value、顧客生涯価値)は「1 人あたり、生涯でいくら稼げるか」を表す指標。マーケ予算(CAC)の決定基準として最重要ですが、業種によって計算式が全く違うため、他社事例をそのまま真似ると数字が破綻します。本記事では 5 業種の式と、それぞれの落とし穴を整理。
業種別 LTV 計算式
| 業種 | 計算式 | 前提 |
|---|---|---|
| (サブスク) | ÷ Churn rate | 月次 churn 率が安定 |
| EC | 平均注文単価 × 年間注文回数 × 継続年数 | リピート率が見えている |
| ゲーム | ARPPU × 課金者比率 × 継続月数 | 課金者と無料者を分けて計算 |
| B2B 受託 | 契約金額 × 平均継続年数 | 更新率がカギ |
| 広告サポート | ARPU × 寄与日数 | 広告単価 × 滞在時間 |
1. SaaS: ARPU ÷ Churn rate
月額 5,000 円、月次 churn 5% → LTV = 5000 / 0.05 = 100,000 円。シンプルだが前提崩れに注意:churn 率が変動したら LTV も激変。3 ヶ月平均 churnで計算するのが定石。
2. EC: 単価 × 頻度 × 継続
平均注文単価 5,000 円、年間 6 回購入、3 年継続 → LTV = 5000 × 6 × 3 = 90,000 円。「継続年数」をどう測るかが論点。新規 cohort のデータが 3 年揃ってないなら、Kaplan-Meier 法で生存期間を推定する。
3. ゲーム: ARPPU × 課金者比率 × 継続月数
ARPPU(課金ユーザー1人あたり月額)3,000 円、課金者比率 5%、平均継続 4 ヶ月 → LTV = 3000 × 0.05 × 4 = 600 円/。「課金者と無料者を分けて計算」が必須。一括 ARPU で計算すると、ヘビーユーザーに引っ張られる。
4. B2B 受託: 契約金額 × 継続年数
月額 50 万円、平均 3 年継続 → LTV = 500,000 × 12 × 3 = 18,000,000 円。更新率(renewal rate)が肝。年契約の renewal rate 90%なら継続年数は 1/(1-0.9) = 10 年で計算するが、現実は中途解約もあるので 3〜5 年で見るのが安全。
5. 広告サポート: ARPU × DAU 寄与日数
1 DAU あたり広告収益 10 円/日、平均 200 日アクティブ → LTV = 10 × 200 = 2,000 円。広告 CPM の変動に弱い指標。CPM が半減すれば LTV も半減。3 ヶ月移動平均で平準化。
LTV / CAC 比率
LTV / CAC > 3 が黄金律。3 倍以上なら成長フェーズで投資 OK、1〜3 倍は赤字スレスレ、1 未満は撤退検討。SaaS では 3 ヶ月以内に CAC 回収もよく使われる目安。
「使ってはいけない式」
- 全期間累計 ÷ 全ユーザー数:休眠ユーザーが含まれて数字が低く出る
- チャーンを四半期/年単位で計算:細かい変動を見逃す → 月次 or 週次
- 「払った人だけ」の LTV:マーケが「全ユーザー LTV」と勘違いする → ARPU と ARPPU を混同しない
Python で 5 業種の LTV を計算する
import pandas as pdimport numpy as np
# ===== 1. SaaS LTV =====def saas_ltv(arpu_monthly: float, monthly_churn_rate: float) -> float: """LTV = ARPU / Churn rate""" if monthly_churn_rate <= 0: raise ValueError("Churn rate は正の値") return arpu_monthly / monthly_churn_rate
print(f"SaaS LTV: {saas_ltv(5000, 0.05):,.0f} 円")# → 100,000 円
# ===== 2. EC LTV =====def ec_ltv(avg_order_value: float, orders_per_year: float, retention_years: float) -> float: return avg_order_value * orders_per_year * retention_years
print(f"EC LTV: {ec_ltv(5000, 6, 3):,.0f} 円")# → 90,000 円
# ===== 3. ゲーム LTV =====def game_ltv(arppu: float, paying_user_ratio: float, retention_months: float) -> float: """1 MAU あたり LTV""" return arppu * paying_user_ratio * retention_months
print(f"ゲーム LTV/MAU: {game_ltv(3000, 0.05, 4):,.0f} 円")# → 600 円
# ===== 4. B2B 受託 LTV =====def b2b_ltv(monthly_contract: float, retention_years: float) -> float: return monthly_contract * 12 * retention_years
print(f"B2B LTV: {b2b_ltv(500_000, 3):,.0f} 円")# → 18,000,000 円
# ===== 5. 広告サポート LTV =====def ad_ltv(arpu_per_active_day: float, avg_active_days: float) -> float: return arpu_per_active_day * avg_active_days
print(f"広告 LTV: {ad_ltv(10, 200):,.0f} 円")# → 2,000 円import pandas as pd
# 月次の ARPU と Churn 率を計算subs = pd.read_csv("subscriptions.csv", parse_dates=["start_date", "end_date"])
# Churn 率(月次) = 解約数 / 期初契約数month_starts = pd.date_range("2025-01-01", "2026-01-01", freq="MS")churn_rates = []for m_start in month_starts: m_end = m_start + pd.DateOffset(months=1) active_at_start = subs[(subs["start_date"] < m_start) & (subs["end_date"].isna() | (subs["end_date"] >= m_start))] churned_in_month = active_at_start[(active_at_start["end_date"] >= m_start) & (active_at_start["end_date"] < m_end)] if len(active_at_start) > 0: churn_rates.append(len(churned_in_month) / len(active_at_start))
avg_churn = np.mean(churn_rates)arpu = subs["monthly_amount"].mean()print(f"平均月次 Churn: {avg_churn:.2%}")print(f"平均 ARPU: {arpu:,.0f} 円")print(f"LTV: {saas_ltv(arpu, avg_churn):,.0f} 円")ふくふくの進め方
「LTV を計算したいが業種に合った式が分からない」というご相談には、事業モデル分析(1 週間)→ 適切な計算式選定 → 実装 → 月次自動更新を 2〜3 週間で。LTV/CAC 比率の月次モニタリングまで含めたパッケージ。
次回予告
EP.07 は ・ARPU・ARPPU・課金者比率。購買行動を分解し、誰が VIP で誰が離脱予備軍かを見える化する話。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。