GA4と広告のCVズレをPythonで自動検知する実装
広告の管理画面では今日のCVが12件。だがGA4を開くと8件しかない。この食いちがいに手を止めた運用者は多いはずだ。数字が合わないまま予算判断を続けると、良い広告を止め、悪い広告に足す事故が起きる。原因はバグとは限らない。GA4と広告プラットフォームは、そもそも別の物差しでCVを数えている。ここでは、ズレが生まれる4つの理由を整理し、GA4 Data APIと広告APIをPythonで毎日つき合わせ、乖離が閾値を超えたら気づける監視の作り方までを示す。手作業の突合をやめ、判断できる数字を自動でそろえるのが狙いだ。
なぜGA4と広告のCVはズレるのか
まず前提として、両者の数字は一致しない方が普通だ。ズレの正体は、大きく4つに分けられる。
- アトリビューションの物差しが違う:広告側は自媒体のなかの接点だけを成果とみなす。GA4は自然検索や他媒体も横断し、最後の流入元へ貢献を割りふる。同じCVでも帰属先が変わる。
- Cookie規制とITP:SafariのITPでCookieの寿命が短くなった。クリックからCVまで日数が空くと、GA4は広告流入と結びつけられなくなる。
- タグの二重計測・未発火:イベント名の重複やトリガーの誤設定で、1件のCVが2件にふくらむ。逆に未発火で減ることもある。
- クロスドメインの断絶:外部カートや決済へ移る瞬間に参照元が切れ、流入経路が失われる。
実運用での体感では、GA4のCVが広告管理画面より2〜3割ほど少なく出るのは珍しくない。媒体側の乖離要因は https://squadbeyond.com/blog/ga4_suuchikairi/ や https://markecats.co.jp/column/discrepancy-reasons/ が詳しい。大事なのは、この差をゼロにしようとしないことだ。閾値を決めて「いつもの差か、事故か」を見分ける発想に切りかえる。
手作業の突合が破綻する理由
毎朝、広告管理画面とGA4を並べて数える運用は長くは続かない。媒体が3つ、口座が10あれば、確認だけで30分が飛ぶ。人が見るかぎり、見落としと転記ミスが必ず混ざる。しかもズレは、数字が動いた瞬間に気づきたい。翌週に気づいても、その間の予算配分はもう狂っている。だから突合はコードに任せ、人は「閾値を超えた時だけ」見ればよい。異常を検知して通知に流す発想は、広告の消化異常をSlackに自動通知する実装と同じ骨格で組める。
GA4 Data APIと広告APIをPythonで毎日突合する
実装の骨格はシンプルだ。手順に落とすと5ステップになる。
- (1)GA4 Data APIのrunReportで、日付×流入元別のCV(key event)を取る。
- (2)広告APIから、同じ期間・同じCV定義の実績を取る。
- (3)日付をキーに突合し、差分と乖離率を出す。
- (4)乖離率が閾値を超えた行だけ抽出する。
- (5)結果をSlackやスプレッドシートへ流す。
つまずきやすいのがGA4 Data APIの認証だ。BloggerなどGoogleの他APIと同じtoken.jsonを使い回すと、スコープが足りず認証が落ちる。runReportにはanalytics.readonlyスコープが要る。既存トークンにこのスコープを足して再発行しないと、権限エラーで止まる。ここで半日つぶした経験があるので、最初にスコープをそろえておくと安全だ。複数媒体の実績を1つの表に寄せる部分は、広告3媒体レポート統合をPythonで実装した手順の集計ロジックがそのまま流用できる。
この突合ロジックの骨格をブックマークし、自分の口座IDと閾値に書きかえて使ってほしい。擬似コードで表すと、client.run_report(property='properties/GA4のID', dimensions=['date','sessionSource'], metrics=['keyEvents']) でGA4側を取り、広告側の日次CVをdictにまとめる。次に日付ごとに diff = ad_cv - ga4_cv、rate = diff / ad_cv を計算し、abs(rate) > 0.3 の行だけ通知に回す、という流れだ。閾値0.3は媒体ごとの平常値に合わせて調整する。この手順の完全版(動くコード・エラー対処つき)はnoteの実践ガイドにまとめている。
乖離が出たときの切り分けチェックリスト
閾値を超えたら、原因を上から順に潰すのが速い。ブックマークして、現場のチェック表として使ってほしい。
- 期間とタイムゾーンをそろえたか(GA4はJST、広告APIはUTCで返ることがある)
- CVの定義は同じか(広告のCV設定とGA4のkey eventが別物になっていないか)
- アトリビューション期間はそろえたか(クリック後の計測窓の長さ)
- タグの二重発火・未発火をデバッグビューで確認したか
- クロスドメイン設定と参照元除外リストを見たか
こうして出した乖離レポートをクライアントへ共有するなら、数字の羅列より1枚のスライドの方が伝わる。資料化には以下のツールが使える。
まとめ
GA4と広告のCVがズレるのは、多くの場合バグではなく物差しの違いだ。だから「ゼロにする」のではなく「いつもの差を知り、外れた時に気づく」のが正しい。まずは1媒体・1口座で日次突合を組み、閾値0.3で試す。慣れたら媒体を足し、Slackへ流す。手で数える30分が、毎朝の通知1本に変わる。判断できる数字を、自動でそろえておこう。
実務でそのまま使いたい人へ
本記事の手法の完全版(実際のコード・テンプレート・つまずき対処つき)は、運営者のnote(note.com/ryo_ai_hack)で公開している。実データに基づく実践ガイドをまとめて読める。

コメント
コメントを投稿