GA4のga_session_idをJavaScriptで取得
GA4のga_session_idをキーに登録データとGA4のデータを紐づけたいと調査しているときの覚書。
Googleタグマネージャー経由でGA4を設定している。
Nginxのcache設定を使っているのでサーバー(PHP)側のセッションに頼る仕組みにはしたくない。
公式サイトを見るとJavaScriptでできそう。
- Google タグ API リファレンス | Google タグ(gtag.js) | Google for Developers
- データレイヤー | タグ マネージャー | Google for Developers
実装例
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だけでいいかも。