GTM Engineering 技報

記事一覧へ戻る

単価固定法——請求書より細かいマーケティングROIを計算するコスト配賦モデル

マーケティングROIを施策単位で改善するには、キャンペーンやコンテンツまで粒度を下げて分析する必要があります。ここで問題になるのが、請求書レベルの粗いコストを、リードや商談などの細かな実績データにどう紐づけるかという点です。この粒度差を埋めるマーケティングコスト配賦モデルが「単価固定法」です。

  • マーケティング
  • データ分析

マーケティングROIを細かく分析しようとすると、かなり早い段階で「成果とコストの粒度が合わない」という問題にぶつかります。

CVや商談は、キャンペーン、コンテンツ、流入元、広告IDなどの細かい単位で記録できます。一方、コストは請求書や支払申請を起点に管理されることが多く、「外部メディアAの7月分」「イベント集客費一式」のような粗い粒度でしか存在しません。

成果だけ細かくても、対応するコストがなければROIは計算できません。だからといって、支払申請をコンテンツ単位や広告単位に細分化すれば、現場の入力負荷が大きくなります。

この粒度差は、請求と成果のシステムが分かれている組織に共通する構造的な問題です。単価固定法は、マーケティングROI基盤を設計・運用するなかで、この問題を解くために生まれた配賦モデルです。本稿では、実務から得られた考え方を特定の社内実装に閉じず、再利用可能な方法として定式化します。

なお、この考え方を取り入れ、施策別のコストと成果を測定できるようにしたデマンドプロセス改革は、「日経クロストレンド BtoBマーケティング大賞2025」で審査員特別賞を受賞しています(日経クロストレンドの記事)。

請求書より細かいROIをどう作るか マーケティングコストの「単価固定法」 支払データ 外部メディアA 2024年7月 100万円 媒体 × 月 単価固定法 分析可能なコスト コンテンツA 50CV × 1万円 50万円 コンテンツB 30CV × 1万円 30万円 コンテンツC 20CV × 1万円 20万円 100万円 ÷ 100CV = 1万円/CV 配賦前後の合計コストは同じ

図1:コストと成果の粒度差

単価固定法が必要になる理由

ROIは成果とコストを同じ粒度で集計しなければならない

施策単位のROIを単純化すると、次のように表せます。

施策効率=施策から得られた成果施策に投下したコスト\text{施策効率} = \frac{\text{施策から得られた成果}}{\text{施策に投下したコスト}}

ここで重要なのは、分子と分母の集計粒度が一致していることです。成果を「コンテンツ別」に集計しているのに、コストが「媒体全体」でしか存在しない場合、各コンテンツの商談単価やLTV/CACは計算できません。

マーケティングの成果データは、MAやCRMのイベントログを名寄せすることで細かい単位まで分解できます。しかし、支払データは分析のために作られているわけではありません。請求や稟議の都合に合わせて「媒体×月」「集客会社×月」「イベント費用一式」といった単位になります。

支払プロセスを細分化する方法には限界がある

理想だけを言えば、支払申請の時点でキャンペーン、コンテンツ、広告IDごとの金額を入力すれば済みます。ただし、請求書の明細が分析粒度に対応しているとは限らず、支払担当者に分析用の配賦まで求めると入力工数と誤入力が増えます。

そこで、取得段階では会計・支払業務に適した粒度を維持し、データ基盤上で分析粒度へ変換します。その変換方法が単価固定法です。

単価固定法とは何か

単価固定法は、同質とみなせるグループの内部では成果1件あたりの単価が等しいと仮定し、粗いコストを観測可能な件数に比例して細分化する方法です。統計的な推定モデルではなく、業務上説明可能な仮定に基づく決定論的な配賦モデルです。

単価固定法を支える3つの原則

  1. 総額保存:配賦後のコスト合計は、配賦前の請求・会計上の総額と一致する
  2. 層内同質性:同じ配賦グループ内では、配賦基準1単位あたりのコストを等しいとみなせる
  3. 再集計可能性:細粒度へ分解したコストを元の粒度へ戻すと、元データを再現できる

特に重要なのは層内同質性です。単価を固定する範囲は、データの都合だけでなく、契約形態、課金方式、施策運用の実態から決めます。この範囲を誤ると、計算は合っていても意思決定を歪めます。

例えば、外部メディアAに対する7月の支払額が100万円で、同月に100件のCVを獲得したとします。このとき、1CVあたりの単価は1万円です。

CV単価=1,000,000100CV=10,000円/CV\text{CV単価} = \frac{1{,}000{,}000\text{円}}{100\text{CV}} = 10{,}000\text{円/CV}
  • コンテンツA:50×10,000=500,00050 \times 10{,}000 = 500{,}000
  • コンテンツB:30×10,000=300,00030 \times 10{,}000 = 300{,}000
  • コンテンツC:20×10,000=200,00020 \times 10{,}000 = 200{,}000

分割後の合計は、元の100万円と一致します。

単価固定法の計算例 配賦元の合計を保存したまま、CV件数に比例して細分化する 固定単価 100万円 ÷ 100CV = 1万円 / CV コンテンツA 50CV × 1万円 50万円 コンテンツB 30CV × 1万円 30万円 コンテンツC 20CV × 1万円 20万円 50万円 + 30万円 + 20万円 = 100万円 ※数値はダミー

図2:単価固定法によるコンテンツ別コスト配賦

数式で表す

配賦元のグループを gg、配賦先を ii とします。

  • CgC_g:グループ全体のコスト
  • xgix_{gi}:配賦先 ii のCV数または申込数
  • ugu_g:グループ内で固定する単価
  • C^gi\hat{C}_{gi}:配賦後のコスト
ug=Cgixgiu_g = \frac{C_g}{\sum_{i} x_{gi}}
C^gi=xgi×ug=Cg×xgiixgi\hat{C}_{gi} = x_{gi} \times u_g = C_g \times \frac{x_{gi}}{\sum_{i} x_{gi}}

したがって、丸め誤差がない理想的な計算では、配賦後のコスト合計は元コストに一致します。

iC^gi=i(xgi×Cgixgi)=Cg\sum_{i} \hat{C}_{gi} = \sum_{i} \left( x_{gi} \times \frac{C_g}{\sum_{i} x_{gi}} \right) = C_g

数学的には「単価を固定する」というより、成果件数を重みとする比例配賦です。単価を明示的に計算してから各成果件数へ掛け戻すため、実装と説明上「単価固定法」と呼んでいます。

なぜ均等配賦ではいけないのか

100万円を3コンテンツへ均等に分けると、それぞれ約33.3万円です。しかしCV数が50件、30件、20件であれば、見かけ上のCV単価は人工的にばらつきます。外部メディアの請求額がCV件数にほぼ比例する契約なら、この差は施策の性能差ではなく、配賦方法が作り出した差です。

単価固定法ではCV単価がすべて1万円になります。これは情報を潰しているのではありません。もともと請求データに存在しなかった「コンテンツ別CV単価の差」を捏造しないための処理です。

それでもコンテンツ比較ができる理由

CV単価を固定しても、その後のファネル通過率はコンテンツごとに異なります。CV単価は同じでも、商談単価やLTV/CACには差が生まれます。

単価固定法の目的は、配賦に使った指標の効率を比較することではありません。支払データを成果データと結合可能な粒度へ変換し、より下流の成果で施策を比較できるようにすることです。

代表的な3つの適用パターン

固定する単価と配賦ドライバーは、チャネルの課金構造に合わせて選びます。代表的な適用パターンは次の3つです。

単価固定法の代表的な3つの適用パターン チャネルごとの請求構造に合わせて、固定する単価と粒度を変える Web広告 配賦元 広告ID × 月のコスト CV単価 コスト ÷ CV数 配賦先 キャンペーン × コンテンツ × 広告ID 外部媒体 配賦元 キャンペーン × 月 CV単価 コスト ÷ CV数 配賦先 キャンペーン × コンテンツ × 月 イベント集客 配賦元 集客元 × 月のコスト 申込単価 コスト ÷ 申込人数 配賦先 イベント × コンテンツ × 集客元 共通原則:配賦に使う単価は、意思決定を歪めない粒度でのみ固定する

図3:単価固定法の代表的な適用パターン

1. 運用型広告:広告単位のCV単価を固定する

広告プラットフォームのコストを「媒体・広告・期間」の粒度で集計し、同じ粒度のCV数で割って単価を求めます。その単価を、キャンペーンやコンテンツまで分解されたCV数へ掛け戻します。

この場合の仮定は「同じ媒体・広告・期間に属するCVは、配信先のキャンペーンやコンテンツが異なっても1件あたりのコストが等しい」です。広告IDが取得できない場合は広告グループなど上位キーを使えますが、そのぶん同質性の仮定は強くなります。

2. 成果報酬型メディア:獲得単価を固定する

媒体からの請求が獲得件数に比例する場合は、「媒体・契約・期間」の総コストを獲得件数で割り、コンテンツ別の件数へ配賦できます。仮定は「同じ課金条件に属する獲得であれば、コンテンツが違っても1件あたりの請求コストは等しい」です。

3. イベント集客:申込単価を固定する

イベント集客費を複数イベントへ分ける場合は、重複を除いた申込人数を配賦ドライバーにできます。クリック数ではなく申込人数を使うのは、請求や集客成果により近い測定単位だからです。

-- 重複を除いた申込人数を配賦ドライバーにする
SELECT
    COUNT(DISTINCT person_id) AS apply_count -- 申込人数(重複除外)
FROM
    event_application -- イベント申込ログ

個別イベントのコストが直接取得できるなら、配賦せずその値を使います。単価固定法は一次情報を置き換える方法ではなく、必要な粒度の一次情報が存在しないときにだけ使う補完手段です。

単価固定法を適用しない方がよいコスト

細粒度の実コストを取得できる場合、適切な配賦ドライバーが存在しない場合、固定費と従量費を分離できない場合には適用しません。とりわけ制作費や基盤費のように成果件数へ比例しない費用を、CV数だけで機械的に分けると誤った因果関係を持ち込みます。

SQLによる基本実装

以下は、BigQuery Standard SQLによる実装例です。

  1. 配賦元粒度でコストを集計する
  2. 同じ粒度でCV数または申込数を集計する
  3. コストを件数で割り、固定単価を算出する
  4. 配賦先粒度で件数を集計する
  5. 配賦先件数に固定単価を掛ける
WITH
-- 配賦元粒度でコストを集計する
cost_base AS (
    SELECT
        allocation_key, -- 配賦キー(媒体・広告・期間など)
        year_month, -- 年月
        SUM(cost) AS cost -- 配賦元コスト合計
    FROM
        raw_cost -- 請求・会計由来の生コスト
    GROUP BY
        1, 2
),
-- 配賦元粒度で成果件数を集計する
outcome_base AS (
    SELECT
        allocation_key, -- 配賦キー
        year_month, -- 年月
        COUNT(1) AS outcome_count -- 成果件数
    FROM
        outcome_log -- CVや申込などの成果ログ
    GROUP BY
        1, 2
),
-- 固定単価を算出する
unit_cost AS (
    SELECT
        c.allocation_key, -- 配賦キー
        c.year_month, -- 年月
        c.cost, -- 配賦元コスト合計
        SAFE_DIVIDE(c.cost, o.outcome_count) AS unit_cost -- 成果1件あたり単価(0件はNULL)
    FROM
        cost_base AS c -- 配賦元コスト
    LEFT JOIN
        outcome_base AS o -- 配賦元成果件数
        USING (allocation_key, year_month)
),
-- 配賦先粒度で成果件数を集計する
outcome_detail AS (
    SELECT
        allocation_key, -- 配賦キー
        detail_id, -- 配賦先ID(キャンペーン・コンテンツなど)
        year_month, -- 年月
        COUNT(1) AS outcome_count -- 配賦先の成果件数
    FROM
        outcome_log -- CVや申込などの成果ログ
    GROUP BY
        1, 2, 3
)
-- 固定単価を配賦先件数へ掛け戻す
SELECT
    u.allocation_key, -- 配賦キー
    COALESCE(d.detail_id, '__UNALLOCATED__') AS detail_id, -- 配賦先ID(成果なしは未配賦)
    u.year_month, -- 年月
    CASE
        WHEN d.outcome_count IS NULL THEN u.cost -- 成果なし:コストを未配賦として残す
        ELSE d.outcome_count * u.unit_cost -- 成果あり:件数 × 固定単価
    END AS allocated_cost -- 配賦後コスト
FROM
    unit_cost AS u -- 固定単価
LEFT JOIN
    outcome_detail AS d -- 配賦先成果件数
    USING (allocation_key, year_month)

ゼロ件だったときにどうするか

コストがあるのに配賦ドライバーが0件の場合、単価は定義できません。このケースをゼロ除算の回避だけで処理すると、存在しない成果へコストを割り当てることになります。

一般的な選択肢は次の3つです。

  1. 未配賦バケットへ残す:総額を保存しつつ、配賦不能であることを可視化する
  2. 代替ドライバーを使う:インプレッション、クリック、配信数など、契約構造に合う別の測定単位を使う
  3. 配賦を保留する:遅れて到着する成果データを待ち、後日再計算する

原則として推奨するのは未配賦バケットです。成果が出た他の施策へ費用を押し付けず、データ欠損や成果ゼロという事実を残せるためです。

-- 成果件数が0のときは単価を定義せずNULLにする
SELECT
    CASE
        WHEN outcome_count > 0 THEN cost / outcome_count -- 成果あり:固定単価を算出
        ELSE NULL -- 成果なし:未配賦として扱う
    END AS unit_cost -- 成果1件あたり単価
FROM
    cost_with_outcome -- 配賦元コストと成果件数の結合結果

配賦に使った指標で効率を評価してはいけない

CV数を使ってコストを分けた場合、同じ配賦グループ内のCV単価は計算上必ず同じになります。そこから「コンテンツごとのCV獲得効率に差がない」と結論づけることは、循環論法です。

評価には、配賦基準より下流の指標を使います。

  • CVで配賦した場合:有効リード単価、商談単価、受注単価、LTV/CAC
  • 申込数で配賦した場合:参加単価、商談単価、受注効率

どの粒度で単価を固定するべきか

  • 請求額は何に比例して決まるのか
  • 媒体、契約、月によって単価条件が変わらないか
  • 固定費と従量費が混在していないか
  • 配賦後にどの意思決定を行うのか
  • 未配賦コストがどの程度発生するか

特に重要なのが「意思決定に影響を与えない仮定か」です。

実装後に置くべきデータ品質テスト

  1. コスト保存:配賦前後の合計差が許容誤差内か
  2. 配賦ウェイト保存:細粒度件数の合計が親件数と一致するか
  3. 一意性:最終粒度で重複がないか
  4. 未配賦率:配賦先IDが決まらなかったコストの割合
  5. 単価確認:同一配賦グループ内で単価が意図どおり一定か

単価固定法が解決しない問題

  • 成果とコストの計上月が異なる問題
  • 施策実施から商談・受注までの時間差
  • 複数タッチポイントへの成果配分
  • キャンペーンやコンテンツの名寄せ漏れ
  • 固定費と変動費が混在する契約

例えば展示会では、開催月にコストを一括計上し、商談は数週間から数か月後に発生します。月次のコストと同月の商談を単純に割ると数値が極端に振れます。これは単価固定法の不具合ではなく、時間軸の問題です。

まとめ

  • 粗いコストをCV数や申込数に比例して配賦する
  • 配賦グループ内では、意思決定に影響しない単価の同質性を仮定する
  • 理論上、配賦前後のコスト総額は保存される
  • 計測可能なキーに合わせて、固定粒度自体を例外的に変えることもある
  • 成果ゼロの場合は、コストを未配賦バケットに残す
  • 配賦に使った指標ではなく、その下流の成果で施策を評価する

単価固定法の本体は割り算ではなく、業務構造に基づいて「固定してよい単価」を定義することにあります。

※記事中の金額・件数は説明用のダミーデータです。