333 words
2min read
Edit

GTM + iframe + クロスドメインにpostMessageで対応する

公式でも紹介されるリンカー設定だが、計測が不安定になる可能性が拭えず、設定が複雑になるケースが多いため、postMessageを利用したイベント委譲型の計測が有効な場合がある。

#リンカーの混乱

  • _glパラメータの付与は、DOMの書き換えタイミングに依存するため、レースコンディションが発生しやすい。
  • cookie_flagsSameSite=None;Secureを設定しても現代のブラウザ仕様(ITPやPrivacy Sandbox)によりCookieが期待通りに動作することは保証されない。
  • 両サイトに同一のGTM/GA4を設定した場合、理解が不十分であれば重複計測を招く。

#基本的な実装

子側(iframe内)の実装:

// iframe内かどうかの確認
if (window.parent && window.parent !== window) {
const message = {
type: "iframe_navigation",
page_location: window.location.href,
page_title: document.title,
page_referrer: document.referrer,
}
// 親のドメインが限定される場合は、第二引数に親のドメインを指定する。
// 特に秘匿性の高いデータを送信する場合は、`*`では全てのドメインを許可することになるため危険。
window.parent.postMessage(message, '*')
}

親側の実装:

window.addEventListener('message', function(event) {
// セキュアな処理を行う場合などは、送信元をチェックする。
if (event.origin !== 'https://your-iframe-site.com') return;
if (event.data && event.data.event === "iframe_navigations") {
// ここでGTMやGA4へのデータ送信を行う。
}
});