前回の記事(WordPressでのCookie同意制御 #2)でハードブロック(同意するまでタグを読み込まない)モードを適用した。これにより同意しない場合にはGoogleタグが配信されないという厳密な挙動をするようになったのだが、その結果GA4のアクセス数が激減した😓
まぁ当然の話なのだが、サイト状態を把握できなくなるのも色々な検証するのにちと困る。
ということでGoogleタグは同意状態に応じて情報を匿名処理するAdvanced Consent Modeがあるので、それを利用する構成に変更する。
📗概要
同意前、非同意ユーザーの行動をGA4に匿名情報として記録できるように、Googleタグの同意制御をハードブロックではなく、「アドバンスド(Advanced)同意モード」に変更する。
関連資料は以下あたり
- Consent mode – Site Kit by Google
- Consent mode overview | Tag Platform | Google for Developers
- Troubleshoot consent mode with Tag Assistant | Tag Platform | Google for Developers
- [GA4] Behavioral modeling for consent mode – Analytics Help
- About consent mode – Google Ads Help
ちなみに匿名モードについてGeminiに整理してもらった内容は以下
ユーザーが同意を拒否した(または未選択の)状態でも、Googleタグは即座に発火します。ただし、この時はCookieを一切読み書きせず、以下のような匿名情報のみを送信します。
- 機能的情報: タイムスタンプ、ブラウザの種類、リファラー
- 集計情報: ページ遷移やコンバージョンの発生。
GA4はこの「匿名ピン」を受け取ると、機械学習を用いて以下のようにデータを復元
- 「同意したユーザー」の行動パターンを学習
- 「匿名ピン(非同意ユーザー)」のデータに学習結果を当てはめ、「非同意のユーザーはおそらくこう行動しただろう」と推論・補完
- これにより、レポート上の「総ユーザー数」や「セッション数」が実際の数値に近似させる
📗前提条件
今回の対応の前提としてサイトの同意モードがすべてデフォルトで「拒否(Denied)』状態」になっている必要がある。
これは過去記事で設定した関連Wordpressプラグインの設定が以下の状態であれば<head>に同意に関するDataLayer初期化Scriptがインサートされているはず。(おそらくSiteKitが処理している気がするが今回は深追いしない)
参考)同意系DataLayer初期化のScript
<script id="google_gtagjs-js-consent-mode-data-layer">
window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}
gtag('consent', 'default', {"ad_personalization":"denied","ad_storage":"denied","ad_user_data":"denied","analytics_storage":"denied","functionality_storage":"denied","security_storage":"denied","personalization_storage":"denied","region":["AT","BE","BG","CH","CY","CZ","DE","DK","EE","ES","FI","FR","GB","GR","HR","HU","IE","IS","IT","LI","LT","LU","LV","MT","NL","NO","PL","PT","RO","SE","SI","SK"],"wait_for_update":500});
window._googlesitekitConsentCategoryMap = {"statistics":["analytics_storage"],"marketing":["ad_storage","ad_user_data","ad_personalization"],"functional":["functionality_storage","security_storage"],"preferences":["personalization_storage"]};
window._googlesitekitConsents = {"ad_personalization":"denied","ad_storage":"denied","ad_user_data":"denied","analytics_storage":"denied","functionality_storage":"denied","security_storage":"denied","personalization_storage":"denied","region":["AT","BE","BG","CH","CY","CZ","DE","DK","EE","ES","FI","FR","GB","GR","HR","HU","IE","IS","IT","LI","LT","LU","LV","MT","NL","NO","PL","PT","RO","SE","SI","SK"],"wait_for_update":500};
</script>
regionにJP入ってないので挙動差があるのか若干の不安はあるけど・・・😓
📗GTMの設定
GTMの🔖GA4@Baseのトリガーを変更する。
前回🔖GA4@Baseに設定した以下のトリガーを解除
🎯Consent@OnStatisticsProcessed🎯Consent@OnMarketingProcessed
代わりに以下のトリガーを設定。
- GTM純正の
初期化タグ (Initialization - All Pages)

📗動作確認
トリガー変更により同意状態に関係なく、初期化イベントでGoogleタグを設定した🔖GA4@Baseが発火してGA4にページビューイベント送信する状態になる。
同意状態に応じて送信パラメータが以下の状態になっているかGTMのプレビューモードで確認する。
⚠️GTMプレビューでの確認に関する留意事項
概要で参考資料として提示したTag Assistant を使用した同意モードのトラブルシューティング | Tags | Google for DevelopersではGTMのプレビュー画面で同意状態を確認する方法が紹介されているが、これは対象が「タグ マネージャーの同意モード テンプレートから作成されたタグ」となるので、今回の野良対応では使えない。GTMでみると以下のような「管理できていない状態」の表示になるので注意。

今回はこの方法ではなく以下にまとめた実際の通信状態を元に動作を確認する。
Googleタグの送信値の確認
確認する変数は以下のgcs,gcd,cidの3個。
gcs = G1--
- Google Consent Status。同意ステータスを示すフラグ。
- 接頭辞の”G1″が同意モードv2 を使用していることを示す。
- 3桁目がad_storage、4桁目がanalytics_storageのフラグ (2桁目はsecrityだったような・・・)
- “-“フラグは明示的に同意操作されていない初期状態
G100 | AD:拒否、Analytics:拒否 |
G110 | AD:同意、Analytics:拒否 |
G101 | AD:拒否、Analytics:同意 |
G111 | AD:同意、Analytics:同意 |
G1-- | AD:未設定、Analytics:未設定 |
gcd = 13l3l3l3l5l1
- Google Consent Data。
- 同意モード v2 における項目の同意状態詳細情報。
- “
l“はデフォルトで拒否(Denied by default)を示す。 13l3l3l3l5l1の値は以下の権限がすべて拒否されている状態- ad_storage(広告)
- analytics_storage(統計)
- ad_user_data(ユーザーデータ送信)
- ad_personalization(パーソナライズ広告)
- ちなみに「すべて同意」すると
13n3n3n3n5l1になる。 - この値の情報詳細を知りたい場合はConsent Mode V2 For Google Tags | Simo Ahava’s blogあたりを読むべし (Google公式のドキュメントは見つけられなかった😓)
cid = *****
- Client ID。クライアントID。
- リクエストを「1セッション」としてカウントしつつも、特定の個人(過去の訪問履歴)とは紐付けない状態で統計処理を行うため、ブラウザに保存されている _ga クッキーを参照せず、このリクエスト限りの一時的な識別子。もしくはサーバー側で破棄
- ちなみに同意状態切替による”
cid“の挙動は以下。(匿名モードからの同意許可は"cid"を継承、拒否された場合だけidリセットする仕様っぽい)- 未設定>同意:”
cid“値は変化せず - 未設定>拒否:”
cid“値が別値に変化 - 同意>拒否:”
cid“値が別値に変化 - 拒否>同意:”
cid“値は変化せず
- 未設定>同意:”
gcs、gcdの値が上記に値になっていればAdvanced同意モード(匿名モード)で動作して以下の状態になる。
- ユーザー側:Cookie は発行/利用されない(プライバシー保護される)。
- 管理者側:アクセス数は「匿名 Ping」として Google に送信され、GA4 の「行動モデリング」によって欠損値がある程度補完される。
📗まとめ
本対応でGoogleタグに対してAdvanced Consent Modeの適用が完了。
これで同意未設定ユーザーを匿名ユーザとしてGA4ログに記録されるので、アクセスログ激減を回避できる。ただし匿名モードに対する集計がどれくらいブレるのか不明😿(このブロクはCVとか無いのでそこまで気にすることはない)
余談
ちなみにGTMには同意の初期化 (Consent Initialization)なる純正トリガーがあるのだけど、この使い方はよくわかっていない。今回利用しているプラグインの無料版で頑張る野良対応だと特に使わなくても問題ないのだが、おそらくGoogleのConsentMode対応サードパーティのテンプレート (Tag Manager Template Gallery) を使うと設定されるのではないかと思う(確証なし🐙)