Article

事例で学ぶ広告運用成功談:CPAを半減させたキャンペーンの秘密

高田晃太郎
事例で学ぶ広告運用成功談:CPAを半減させたキャンペーンの秘密

事例で学ぶ広告運用成功談:CPAを半減させたキャンペーンの秘密

統計によると、電通「日本の広告費 2023」ではインターネット広告費が3兆円を超え、配信の最適化はますます自動化に寄っています¹。一方で、研究データではiOS14.5以降のアプリトラッキング同意率は約2〜3割にとどまる報告が多く²、計測の欠損が入札アルゴリズムの学習を阻害しています。つまり、媒体側の機械学習に任せても、投入するシグナルが歪めば成果は頭打ちになるということです³。本稿では、計測の修復、入札の目的関数の再設計、クリエイティブの検証速度の引き上げという三位一体の施策で、CPA(顧客獲得単価)の大幅な改善、ひいては半減も現実的に狙えるアプローチを、CTO・エンジニアリーダーの意思決定に耐える技術的な解像度で解説します。

事例の全体像と前提条件

ここで扱うのは、定期購入型のD2Cブランドを想定した一般的なケースです。主な獲得チャネルはMeta広告と検索広告。開始時点では、iOSのシグナル欠損とウェブのクッキー制約により、計測上のコンバージョンが実態より少なく見積もられ、媒体の自動入札が「学習中」から抜け出しにくい状態でした。そこで、まずコンバージョンシグナルの改善に着手し、次に予測LTV(pLTV: 予測ライフタイムバリュー)を用いたtROAS(目標広告費用対効果)最適化へ移行し⁴、最後にモジュール型クリエイティブで探索を加速させる順序で介入します。こうした手順により、同様の環境ではCPAの大幅改善や獲得量の増加が十分に期待できます。ケースによっては、半減に近い改善が報告されることもあります。以降では、何をどう直し、どのように検証するかを実装レベルで示します。

CPAを半減させた実装の核心

最初のボトルネックは計測でした。アトリビューションの欠落が入札の歪みを生み、学習を停滞させていたからです。ウェブ側はGA4(Google Analytics 4)と広告プラットフォーム双方に対し、サーバーサイドのイベント送信を整備し、イベント重複排除とハッシュ化識別子の照合精度を高めます。これにより、媒体側で学習に使える有効コンバージョンが実感値として増え、アルゴリズムの最適化が機能しやすくなります³。さらに、価値最適化へシフトするため、受注データから90日pLTVを予測し、入札の目的関数をtCPA(目標獲得単価)からtROASへ切り替えました⁴。最後に、モジュール化したクリエイティブで探索空間を整理し、探索効率を高めることで、クリック単価とコンバージョン率の双方にプラスの風を作ります。

計測の修復:サーバーサイド計測と重複排除

ブラウザ計測に依存した状態では、ITP(Intelligent Tracking Prevention)やブラウザ拡張の影響でイベントの欠落が避けられません。サーバー側でイベントを収集・標準化し、媒体APIへ送ることで、可観測性を確保しつつ、媒体学習に必要な最小限のシグナルを失わない構造へ移行します。以下はNode.jsでMeta Conversion APIへ送信するシンプルな例です⁵。

import express from 'express';
import fetch from 'node-fetch';
import crypto from 'crypto';

const app = express();
app.use(express.json());

function sha256(value) {
  return crypto.createHash('sha256').update(value.trim().toLowerCase()).digest('hex');
}

app.post('/events/purchase', async (req, res) => {
  const { email, phone, event_id, value, currency, client_ip, user_agent, fbp, fbc } = req.body;
  const payload = {
    data: [{
      event_name: 'Purchase',
      event_time: Math.floor(Date.now() / 1000),
      event_id,
      action_source: 'website',
      user_data: {
        em: [sha256(email)],
        ph: [sha256(phone)],
        client_ip_address: client_ip,
        client_user_agent: user_agent,
        fbp,
        fbc
      },
      custom_data: { value, currency }
    }]
  };
  const r = await fetch(`https://graph.facebook.com/v18.0/<PIXEL_ID>/events?access_token=<TOKEN>`, {
    method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload)
  });
  const body = await r.json();
  res.status(r.ok ? 200 : 500).json(body);
});

app.listen(3000);

GA4のMeasurement Protocolも併用し、クライアント経由とサーバー経由のイベントを同一のevent_idで紐づけて重複排除します。cURLでの送信例を示します。

curl -X POST \
  'https://www.google-analytics.com/mp/collect?measurement_id=G-XXXXXXX&api_secret=YYYYYYYY' \
  -H 'Content-Type: application/json' \
  -d '{
    "client_id": "1234.5678",
    "events": [{
      "name": "purchase",
      "params": {"transaction_id": "T-1001", "value": 4980, "currency": "JPY", "event_id": "evt_9ab"}
    }]
  }'

媒体とGA4に到達したイベント数の差分をログで監視し、到達率が80%を下回った場合にアラートすることで、学習データの枯渇を未然に防ぎます。さらに、gclidやfbclidに加え、メールと電話のハッシュ照合率を追跡し、プラットフォームのマッチング率を高めることで、学習に使われる一日あたりの有効購入イベントが数十%〜倍程度に増える傾向が確認できます⁵。

入札の再設計:tCPAからpLTV連動tROASへ

短期のCPA最適化だけでは、広告の効率はすぐに限界を迎えます。定期購入型では、初回割引や配送サイクルにより、獲得直後の収益が低く見える期間が存在するからです。そこで受注履歴と行動指標から90日pLTV(予測LTV)を算出し、その値を媒体に送信して価値最適化を行います。以下は特徴量を最小限に絞った簡易的なpLTV推定の例です。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_absolute_error

# features: initial AOV, sku_count, discount_rate, device, ref_source, shipping_days
X = df[["aov", "sku_count", "discount_rate", "device_m", "ref_paid", "ship_days"]]
y = df["ltv_90d"]
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)
model = GradientBoostingRegressor(random_state=42)
model.fit(X_train, y_train)
mae = mean_absolute_error(y_valid, model.predict(X_valid))
print("MAE:", mae)

df["pltv_90d"] = model.predict(X)

推定したpLTVをイベントのvalueとして媒体へ送信し、GoogleではtROAS、MetaではValue Optimizationを用いて配信を移行します⁴⁵。これにより、同じCPC(クリック単価)でもpLTVの高いセグメントへ入札が寄り、実測のiROAS(incremental ROAS: 純増売上に基づくROAS)の上昇が期待できます。さらに、閾値ベースでの入札補正も試験的に導入することで、周辺的な広告費の利得を押し上げやすくなります。

# 単純化した周辺ROASに基づく入札係数の計算
import numpy as np

def bid_multiplier(marginal_roas, floor=1.2, cap=1.5):
    x = marginal_roas / floor
    k = 0.5
    return float(np.clip(1 + k * (x - 1), 1.0, cap))

# 例: 周辺ROASが1.5なら係数は1.125
print(bid_multiplier(1.5))

クリエイティブの探索を加速:モジュール化と学習安定化

探索対象を「シグナル×訴求×フォーマット」の三層で標準化し、見出し、導入テキスト、第一秒の視覚フック、社会的証明、CTAの各要素をカタログ化します。これにより、学習を乱さず追加検証ができるようになり、クリエイティブ単体の良否ではなく、要素の組み合わせとしての因子効果を比較可能になります。運用では、学習フェーズを不必要にリセットしないよう、予算変更は日次20%以内、アセット追加は一枠ずつ、成果の判断は7日移動平均で行い、品質の高いシグナルを安定供給しました³。結果として、CTR(クリック率)の上昇とCPCの低下を同時に実現しやすくなり、CVR(コンバージョン率)を毀損せずにCPAの改善へつながります。

因果の担保とKPIの整流化

アルゴリズムによる最適化は不可観測なバイアスを抱えがちです。そこで、媒体レポートのCPAだけでなく、iROAS(純増ベースのROAS)を主要KPIに据え、地理的分割を用いた疑似テストとカレンダー要因の補正で因果を担保します。具体的には、配信可能な地域を人口・既存売上・媒体支出でマッチングし、交互にテストとコントロールに割り当てます。週次で販促や在庫の変動をCUPED(共分散を使った分散削減)の枠組みで補正し、介入前の基準期間を共分散として用いることで分散を削減します。疑似コードは以下の通りです。

import numpy as np

# y_post: 介入後売上, y_pre: 介入前売上(共分散変数)
# g: グループ(1=テスト、0=コントロール)

theta = np.cov(y_post, y_pre, bias=True)[0,1] / np.var(y_pre)

adj = y_post - theta * y_pre
lift = adj[g==1].mean() - adj[g==0].mean()
se = np.sqrt(adj.var()*(1/(g==1).sum() + 1/(g==0).sum()))
z = lift / se

この設計により、媒体計測では見かけ上のROASが高くても、純増売上が伴っていないケースを早期に検知できます。よくある例として、検索のブランドワードへの過剰配分はiROASで見ると逓減するため、予算を非指名の高意図キーワードとリマーケティングの交点に再配分すると、重複獲得を抑えつつ純増を押し上げやすくなります。

増分を確認しながらのアトリビューション集計には、BigQueryでの遅延到着と重複排除が欠かせません。7日クリック優先、1日ビューの単純則でも整合性を取るだけで判断が安定します。

-- 7日クリック、1日ビュー。event_idで重複排除。
WITH dedup AS (
  SELECT AS VALUE ANY_VALUE(t)
  FROM (
    SELECT TO_JSON(t) t,
           ROW_NUMBER() OVER(PARTITION BY event_id ORDER BY ingest_ts DESC) rn
    FROM conv_events t
  )
  WHERE rn = 1
),
click_win AS (
  SELECT user_id, order_id,
         ARRAY_AGG(struct(c.campaign, c.click_ts) ORDER BY c.click_ts DESC LIMIT 1)[OFFSET(0)] last_click
  FROM clicks c
  JOIN orders o USING(user_id)
  WHERE o.order_ts BETWEEN c.click_ts AND TIMESTAMP_ADD(c.click_ts, INTERVAL 7 DAY)
  GROUP BY user_id, order_id
)
SELECT o.order_id, o.value, cw.last_click.campaign
FROM orders o
LEFT JOIN click_win cw USING(user_id, order_id);

iROASの分母・分子の時間整合性も重要です。広告費は日次、売上は注文日基準、返金やチャーンはコホート基準で別管理とし、90日間のLTVをコホートで集計します。

-- コホート別90日LTVとiROAS
WITH cohort AS (
  SELECT user_id, MIN(order_ts) AS first_ts
  FROM orders GROUP BY 1
),
ltv AS (
  SELECT c.first_ts, SUM(o.value) AS ltv_90d
  FROM cohort c
  JOIN orders o USING(user_id)
  WHERE o.order_ts BETWEEN c.first_ts AND TIMESTAMP_ADD(c.first_ts, INTERVAL 90 DAY)
  GROUP BY 1
),
spend AS (
  SELECT DATE(day) AS d, SUM(cost) AS spend FROM ad_cost GROUP BY 1
)
SELECT DATE_TRUNC(first_ts, MONTH) AS cohort_month,
       SUM(ltv_90d) AS revenue,
       (SELECT SUM(spend) FROM spend WHERE d BETWEEN DATE_TRUNC(first_ts, MONTH) AND DATE_ADD(DATE_TRUNC(first_ts, MONTH), INTERVAL 30 DAY)) AS spend,
       SAFE_DIVIDE(SUM(ltv_90d), (SELECT SUM(spend) FROM spend WHERE d BETWEEN DATE_TRUNC(first_ts, MONTH) AND DATE_ADD(DATE_TRUNC(first_ts, MONTH), INTERVAL 30 DAY))) AS iROAS
FROM ltv GROUP BY 1;

実務に落とし込む運用設計とSLO

技術的な仕組みを作っても、運用のリズムがバラバラだと学習は安定しません。一例として、データ到達のSLO(Service Level Objective)を「日次閉めから12時間以内の95パーセンタイルで完全到達」と定義し、ダッシュボード上で媒体・GA4・受注のスループットを一画面に可視化します。予算配分の見直しは週一回に固定し、クリエイティブの差し替えは学習を壊さない粒度で段階的に行い、入札戦略の切り替えはpLTVのMAE(平均絶対誤差)が一定閾値を下回ったことを条件に実施します。MetaはAdvantage+ Shoppingを活用し、プロスペクティングとリマーケティングを意図的に混在させたうえで、上流のシグナルをpLTVで上書きする方針に統一。Google広告では検索のtCPAからtROASへ、PMaxはオフラインコンバージョンのインポートに切り替え、除外キーワードとブランド意図の整理で重複を回避します。運用の意思決定は媒体の「推奨」ではなく、iROASと在庫・物流のキャパシティ制約を合わせて判断し、過剰なスケールで欠品を招かないよう需要と供給の整合性を保ちます⁴。

最後に、計測の健全性を監視するためのログ設計も有効です。イベント到達率、ハッシュマッチ率、重複排除率、媒体側の処理エラー率を時系列で保存し、スパイクが発生した場合にはロールバック手順を自動実行します。

# 単純化したイベント到達SLOの監視
from statistics import mean

window = events.last_24h()
reach = [e.to_platform for e in window]
if mean(reach) < 0.8:
    trigger_alert("platform_reach_under_80pct")
    rollback_pipeline(version="prev_stable")

成果のブレークダウン:何がどれだけ効いたか

成果の内訳はアカウント特性に依存しますが、概ね「計測の修復」で媒体学習の前提を整え、「価値最適化(pLTV連動のtROAS/Value Optimization)」で入札を上流価値に合わせ、「クリエイティブの標準化と探索」で供給するトラフィックの質を高める、という順で寄与が積み上がる傾向があります。とりわけ、pLTVモデルのMAEがビジネス的に許容可能(例えば相対誤差で10〜20%程度を目安)になった段階で価値最適化へ移行すると、過剰なディスカウント獲得の抑制と、将来価値の高いセグメントへの配分が両立しやすくなります。クリエイティブでは、第一秒で使用シーンを明確化した映像や、社会的証明を早期に提示する構成が、CPMを据え置きつつCTRを押し上げ、CVRを毀損せずにCPAを押し下げる定石として機能します。これらの複合要因を揃えることで、媒体の表面指標だけを追う運用では到達しづらい水準の効率改善を狙えます。

まとめ:技術でマーケティングを再定義する

広告運用の成否は、もはや媒体のスイッチ操作では決まりません。計測の健全性、目的関数の定義、探索の速度という三つの設計変数を、事業のキャッシュフローと一体で最適化できるかが鍵です。本稿で示したように、サーバーサイド計測でシグナルの質を高め、pLTVで価値に基づく入札へ移行し、モジュール型のクリエイティブで探索を加速すれば、CPAの半減も現実的な射程に入ります。あなたのプロダクトでは、まずどのシグナルが不足しているでしょうか。明日からできる最初の一歩として、イベント到達率の可視化とpLTVの試算から着手し、二週間でベースラインを再測定してみてください。技術の選択が、次の四半期の利益計画を現実の数字へと近づけてくれるはずです。

参考文献

  1. 電通「2023年 日本の広告費 インターネット広告媒体費 詳細分析」ニュースリリース(2024年3月12日)
    https://www.dentsu.co.jp/news/release/2024/0312-010700.html

  2. AppsFlyer Japan プレスリリース(PR TIMES)「iOS14.5リリースと同時に…ユーザープライバシー配慮の重要性」(2021年)
    https://prtimes.jp/main/html/rd/p/000000043.000016963.html

  3. Google 広告ヘルプ「入札戦略の導入と学習期間について(Smart Bidding の学習)」
    https://support.google.com/google-ads/answer/10970825?hl=en

  4. Google 広告ヘルプ「ターゲット ROAS(tROAS)について」
    https://support.google.com/google-ads/answer/6268637

  5. Meta Business「Continued Improvements to Ad Performance and Measurement(Conversions API の紹介)」
    https://www.facebook.com/business/news/continued-improvements-to-ad-performance-and-measurement/