GPT / GTM

GPTとGTMの実行タイミング問題 — dataLayer連携でタグ制御が壊れるパターンと対処

計測・分析基盤 コラム

「GAM(Google Ad Manager)のkey-valueを使って、GTM側のタグ発火を制御したい」——広告配信とタグ管理を連携させようとするメディアサイトでよくある要件です。しかし、GPT(Google Publisher Tag)とGTMはそれぞれ非同期に動くため、素直に実装するとタイミング次第で制御が壊れるという落とし穴があります。この記事では、典型的な失敗パターンと対処法を解説します。

やりたいこと:GPTのターゲティング値をGTMで使う

例えば「有料会員には特定のタグを発火させない」ために、ページ側でGPTに渡しているkey-value(例: custom_flag)をGTMのトリガー条件でも使いたい、というケースです。よくある実装がこれです。

<script>
googletag.cmd.push(function() {
  // GPTからターゲティング値を取得してdataLayerへ渡す
  var v = googletag.pubads().getTargeting('custom_flag');
  window.dataLayer = window.dataLayer || [];
  dataLayer.push({
    'event': 'custom_flag_ready',
    'custom_flag': v[0] || ''
  });
});
</script>

なお、googletag.cmd のキューは登録順に実行されるため、このスニペットは setTargeting() をpushしている処理よりに配置する必要があります(先に置くと空の値が返ります)。

一見正しく見えますが、これがタイミング依存で壊れます

壊れるパターン1:DOM Readyに間に合わない

googletag.cmd.push() の中身は、gpt.jsの読み込み完了後に実行されます(gpt.jsがすでにロード済みの場合はほぼ即時に実行されます)。gpt.jsはasyncで読み込まれるため、回線やページ構成によっては、GTMの「DOM Ready」や「ページビュー」トリガーが先に評価され、その時点で custom_flag はdataLayerに存在しません。結果、「一部のユーザーだけ制御が効かない」という再現困難な不具合になります。

壊れるパターン2:undefinedの評価挙動を知らずに条件を組む

GTMでは、dataLayer変数が未定義(undefined)のときの評価が演算子によって異なります。

演算子undefinedのときの評価
「等しい」「含む」false(発火しない)
「等しくない」true(発火する)

つまり「custom_flagrestricted と等しくない場合に発火」という条件は、値が間に合わなかった場合に発火してしまう。抑制したいユーザーにこそタグが動く、という最悪の壊れ方をします。逆にこの挙動を理解して条件を設計すれば、フェイルセーフとして使うこともできます。

対処法:GPTを経由せず、同期pushに変える

根本対応は「GPTのgetTargeting()に依存しない」ことです。key-valueの元の値(会員ステータス等)はサーバー側が知っているはずなので、GTMスニペットよりに、同期スクリプトで直接dataLayerへ出力します。

<head>
<script>
  // GTMスニペットより前に置く
  // ※ 'restricted' の部分は、CMSやテンプレートエンジンで
  //    サーバー側の値を埋め込んで出力する(例: '<?= $user_flag ?>')
  window.dataLayer = window.dataLayer || [];
  dataLayer.push({ 'custom_flag': 'restricted' });
</script>
<!-- この後にGTMスニペット -->
</head>

これならGTMコンテナ読み込み時点で値が確定しており、ページビュー系トリガーでも安全に参照できます。GPT側の setTargeting() は従来どおり広告配信用に維持し、「広告配信の制御」と「タグ発火の制御」でデータの受け渡し経路を分けるのが設計の要点です。

同期pushが難しい場合の次善策

ページビュー系トリガーを諦めて custom_flag_ready のようなカスタムイベントトリガーに寄せることです。値のpushとイベント発火が同時なので、タイミング問題は起きません。ただし全タグのトリガーを見直す必要があり、影響範囲は大きくなります。

まとめ

GPTとGTMの連携不具合は「たまに起きる」「特定環境でだけ起きる」形で現れるため、原因特定に時間を溶かしがちです。CMSの制約でheadを触れない、外部ベンダー管理のタグが混在している、といった実サイト特有の事情が絡むと、設計の選択肢はさらに限られます。同様の構成で悩んでいる場合は、タグ構成全体の棚卸しから始めることをおすすめします。

広告配信基盤(GAM/GPT)とタグ管理(GTM)の連携設計は、Publidiaのコンサルティングでもご支援しています。

相談してみる
この記事の執筆者

大西 隆幸 Takayuki Onishi / ayohata

CONSULTANT

広告配信基盤(Google Ad Manager)の実装支援、GA4/GTMの計測設計、BigQueryを用いた分析基盤構築を実務として手がける。国内最大の書籍レビューコミュニティの事業責任者、電子書籍取次の新規事業UX設計、マンガ配信サービスの開発部長などを経て、現在は講談社グループのデジタルメディアを横断的に支援。広告配信(GAM/GPT)とタグ管理(GTM)が絡む複雑な不具合を現場で切り分けてきた経験から、実装上の落とし穴を解説している。2021年より出版・メディア業界ニュースレター「Publidia」を執筆・配信。