価格テストとチャネル予算を貢献利益で決める
目標
価格実験を貢献利益で判定し、購読記録から、解約率・LTV・チャネル別CAC・回収期間・LTV/CACを計算して、価格とチャネル予算を、あらかじめ決めたルールで決めます。
なぜ重要なのか
コンバージョン率や売上で価格を決め、CACだけを見てチャネルを選ぶと、費用と解約がかかった途端に、成長するほど現金が出ていく構造になります。ユニットエコノミクスは、顧客1人が残すお金と、その顧客を連れてくるのに使ったお金を、同じ基準で並べる計算です。
用意するもの
/opt/fixtures/founder/pricing/price_test.csv:arm,price_krw,visitors,purchases,refunds(付加価値税込みの月額価格)/opt/fixtures/founder/pricing/costs.json:vat_rate, payment_fee_rate, payment_fee_fixed_krw, infra_krw_per_customer_month, support_krw_per_customer_month/opt/fixtures/founder/pricing/subscriptions.csv:customer_id,channel,start_month,end_month,price_krw(end_monthは最後に決済した月で、空なら、観測の最後の2026-06まで決済中)/opt/fixtures/founder/pricing/marketing.csv:month,channel,spend_krw(2026-01–2026-06)
定義
- 供給価額 = 価格 × 100/110。決済手数料 = 価格 × payment_fee_rate + payment_fee_fixed_krw。月の貢献利益 = 供給価額 − 決済手数料 − infra − support。
- 訪問者あたりの初月の貢献利益 = (purchases − refunds) × 月の貢献利益(その価格) ÷ visitors。
- 顧客が月Mに決済した ⇔ start_month ≤ M ≤ end_month(空なら2026-06)。月次の解約率M = M−1に決済して、Mに決済しなかった顧客 ÷ M−1に決済した顧客。平均解約率 = 2026-01–06の6か月の単純平均。
- LTV = 月の貢献利益(14,900ウォン) ÷ 平均解約率。CAC(チャネル) = 2026-01–06の広告費の合計 ÷ start_monthがその期間である、そのチャネルの新規顧客。回収期間 = CAC ÷ 月の貢献利益(14,900ウォン)。
- 丸め: 比率は小数第4位、貢献利益・訪問者あたりの金額は小数第2位、LTV・CACは整数(round)、回収期間・LTV/CACは小数第2位。
ステップ
/root/founder/pricing/arms.jsonに、価格パターン(A・B・C)ごとに、conversion・refund_rate・revenue_per_visitor(購入 × 価格 ÷ 訪問者)と、best_by_conversionを書く。/root/founder/pricing/unit.pyに、contribution(price, costs)を作る: costsはcosts.jsonを読んだ辞書で、返す値は月の貢献利益(実数)。/root/founder/pricing/pervisitor.jsonに、パターンごとにcontribution_per_visitorと、best_by_contribution・best_by_revenueを書く。unit.pyにchurn(fix, month, channel=None)を加え、/root/founder/pricing/churn.jsonに、monthly(2026-01–06の各月)とaverageを書く。/root/founder/pricing/ltv.jsonに、contribution(14,900ウォンの月の貢献利益)、avg_churn、ltv、そして、よくある間違いで出したltv_on_revenue(= 14900 ÷ 平均解約率)を書く。/root/founder/pricing/cac.jsonに、by_channel(5つのチャネル)、blended(全体の広告費 ÷ 全体の新規)、paid_only(広告費 > 0のチャネルの広告費 ÷ それらのチャネルの新規)を書く。/root/founder/pricing/channels.jsonに、チャネルごとに、churn(そのチャネルの顧客だけの平均解約率)・ltv・payback_months・ltv_cac(広告費が0ならnull)を書く。/root/founder/pricing/decision.jsonに、price_arm(訪問者あたりの貢献利益が最も大きいパターン)、scale(広告費 > 0で、LTV/CAC ≥ 3、回収期間 ≤ 12のチャネル、ソート済み)、cheapest_cac_paid(広告費 > 0のチャネルのうち、CACが最も安いチャネル)、cheapest_is_scalable(そのチャネルがscaleに入るか)を書く。
参考
- 月の比較は、
"2026-01" <= mのように、文字列でも行えます(形式が固定長だからです)。前月: 2026-01の前月は2025-12です。 - よくある間違い: 付加価値税を引いていない価格を売上として使うこと、LTVに価格(売上)を入れること、ブレンドCACで有料チャネルを判断すること、解約率の分母を今月の決済者にすること、チャネル別のLTVに全体の解約率を使うことです。
コンバージョン率だけで見ると
/root/founder/pricing/arms.jsonに、A・B・Cのconversion・refund_rate・revenue_per_visitorと、best_by_conversionを書く。
conversion = 購入 ÷ 訪問者、refund_rate = 返金 ÷ 購入、revenue_per_visitor = 購入 × 価格 ÷ 訪問者です。
顧客1人の月の貢献利益
/root/founder/pricing/unit.pyに、contribution(price, costs)を作る。
付加価値税込みの価格から供給価額(× 100/110)を求め、手数料は、税込み価格に比率を掛けて、固定額を足します。その後、サーバー・サポートの費用を引きます。
訪問者あたりの初月の貢献利益で判定し直す
/root/founder/pricing/pervisitor.jsonに、パターンごとにcontribution_per_visitorと、best_by_contribution・best_by_revenueを書く。
(購入 − 返金) × contribution(その価格) ÷ 訪問者です。売上基準の勝者と、貢献利益基準の勝者が同じかどうかも見てください。
月次の解約率: 分母は先月の決済者
unit.pyにchurn(fix, month, channel=None)を加え、/root/founder/pricing/churn.jsonに、monthly(2026-01–06)・averageを書く。
「Mに決済した」は、start ≤ M ≤ end(空なら2026-06)です。分母はM−1に決済した顧客、分子はそのうちMに決済しなかった顧客です。1月の前月は、前年の12月です。
LTV: 分子は売上ではなく貢献利益
/root/founder/pricing/ltv.jsonに、contribution・avg_churn・ltvと、比較用のltv_on_revenueを書く。
LTV = 月の貢献利益(14,900ウォン) ÷ 平均解約率です。比較用の値は、分子に14,900をそのまま入れます。このモデルが、解約率一定・割引なしを仮定していることを覚えておいてください。
チャネルCACとブレンドCAC
/root/founder/pricing/cac.jsonに、by_channel(5つのチャネル)・blended・paid_onlyを書く。
広告費は2026-01–06の合計、新規顧客は、同じ期間にstart_monthがある顧客です。ブレンドCACの分母には、広告費が0のオーガニック流入の顧客も入ります。
チャネル別の解約・LTV・回収期間
/root/founder/pricing/channels.jsonに、チャネルごとに、churn・ltv・payback_months・ltv_cacを書く(広告費が0ならltv_cacはnull)。
チャネルのLTVには、そのチャネルの顧客だけで計算した平均解約率を使います。回収期間 = CAC ÷ 月の貢献利益です。
あらかじめ決めたルールで決める
/root/founder/pricing/decision.jsonに、price_arm・scale・cheapest_cac_paid・cheapest_is_scalableを書く。
ルールは、計算の前に決めたとおりです。広告費 > 0、LTV/CAC ≥ 3、回収期間 ≤ 12か月。CACが最も安い有料チャネルが、ルールを通過するかどうかを、別に確認してください。