GA4のga_session_idをJavaScriptで取得

GA4のga_session_idをキーに登録データとGA4のデータを紐づけたいと調査しているときの覚書。

Googleタグマネージャー経由でGA4を設定している。

Nginxのcache設定を使っているのでサーバー(PHP)側のセッションに頼る仕組みにはしたくない。

公式サイトを見るとJavaScriptでできそう。


実装例

dataLayer変数とgtag関数をグローバルの環境に定義して、Googleタグマネージャーを設定する。

<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments)};
</script>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
      new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  })(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->

その後、サイト内のPOSTする処理などでGA4のセッションIDを取得する。

gtag('get', 'G-XXXXXXXX', 'session_id', function(id) {
  console.log(id);
});

gtag関数をgtm.jsの中で置き換えていると思う。

Google Analytics 4のタグIDをセットしないといけないのが少し残念。
(今までサイト側はGoogleタグマネージャーだけでよかったから)
これを省略する手段はなさそう。

でも、サイト側にGA4のセッションIDを保存しようとしているので、サイト側にGA4のタグIDを教えるのは当然だとも考えられる。


あとは実際にPOSTして保存したデータとGA4からBigQueryに保存されたga_session_idが一致するか確認する。


GA4のセッションは30分間操作がないと切れる

実際に動作確認したところ、サイトに保存されたga_session_idとGA4(BigQuery)と一致しないデータがあった。

これは問い合わせ画面を開いたまま30分以上経って送信ボタンを押すと、GA4は新しいセッションを生成してセッションIDが変わる。
(GA4は新しいセッションIDでイベント発行されるが、サイト側は古いセッションIDでPOSTする)
参考: [GA4] アナリティクスのセッションについて - アナリティクス ヘルプ

これを追跡するにはclient_idも記録する。
GA4(BigQuery)ではuser_pseudo_id(GA4が自動で割り当てる仮ID)という項目名。
参考: Google タグ API リファレンス  |  Google タグ(gtag.js)  |  Google for Developers

gtag('get', 'G-XXXXXXXX', 'client_id', function(id) {
  console.log(id);
});

というかclient_idだけでいいかも。



【関連記事】