2026年08月24日 15:00 / - PV

自社サイトのアクセス状況を見ようとして、GA4の**「ページとスクリーン」レポートを開いたら数字が全部ゼロ**でした。
Google Tag Managerは入っています。GA4のリアルタイムにもユーザーは出ています。地域も参照元も取れています。それなのに、どのページが何回見られたのかだけが分からない。
調べた結果、原因はGTMのコンテナに「Googleタグ(GA4設定タグ)」が1本も無かったことでした。しかもこの状態、3年近く気づかずに運用していました。
同じハマり方をしている方がいそうなので、症状の見分け方から修正までを残しておきます。
まず、この不具合が厄介なのは完全に壊れているわけではない点です。実際に取れていたものと、取れていなかったものを並べるとこうなります。
| 指標 | 状態 |
|---|---|
| ユーザー数 / 新規ユーザー数 | 取れている |
| セッション数 | 取れている |
| 参照元 / メディア、地域、デバイス | 取れている |
| リアルタイムのアクティブユーザー | 取れている |
page_view イベント | 1件も無い |
| 表示回数(ページ別) | ゼロ |
| エンゲージメント時間 | 0秒 |
GA4は何かしらイベントが飛んでくればセッションとユーザーをカウントします。だから「アクセス解析が動いているかどうか」だけを見ていると、正常に見えてしまいます。
ダッシュボードを開いて「今日は何人来たな」と眺めるだけの運用だと、まず気づけません。私は気づけませんでした。
GA4の管理画面をいくら見ても設定は正常でした。切り分けに使えたのはイベント名の一覧です。
レポート → エンゲージメント → イベント を開いて、送られてきているイベント名を確認します。
ここに page_view が無ければ、GA4側ではなくタグ側の問題です。
私の場合、ここに並んでいたのは page_view ではなく、見慣れない名前でした。
gtm.dom
これが決定的な手がかりでした。gtm.dom はGTMが内部的に使うdataLayerのイベント名で、本来GA4に送るものではありません。
{{Event}} を送り続けるGA4イベントタグGTMのコンテナを開いてタグ一覧を見ると、こうなっていました。
{{Event}}、トリガーが DOM Ready{{Event}} はGTMの組み込み変数で、「いま発火の原因になったdataLayerイベントの名前」が入ります。
つまりDOM Readyトリガーで発火させると、{{Event}} は gtm.dom に解決されます。結果として、
GA4に「gtm.dom」という名前のイベントが延々と送られ続ける
という状態になっていました。3年間、ひたすら gtm.dom を送っていたわけです。
GA4の「表示回数」は、page_view という名前のイベントの数をそのまま数えています。名前が違えば別のイベントとして扱われるだけで、エラーにはなりません。
そしてpage_viewを送る役目を持つのが、まさに欠けていた**Googleタグ(GA4設定タグ)**です。これが無いので、
page_view は飛ばないgtm.dom は飛ぶのでセッションとユーザーは立つという、中途半端に動いている状態ができあがります。
GA4の設定画面を何度見直しても原因は分かりません。GTMのタグ一覧を見て初めて分かります。
やることは2つだけです。
GTMで タグ → 新規 から、タグの種類に 「Googleタグ」 を選びます。
G- で始まるもの)を入れますInitialization - All Pages(初期化 - All Pages)を選びますトリガーは「All Pages」ではなくInitialization(初期化)のほうを選ぶのがポイントです。他のタグより先に動く必要があるためです。
測定IDはGA4の 管理 → データストリーム から確認できます。
イベント名が {{Event}} になっているGA4イベントタグは削除します。残しておいてもgtm.domというゴミイベントが送られ続けるだけです。
あとは公開すれば反映されます。
なお、GA4側の設定(拡張計測機能、「ブラウザの履歴イベントに基づくページの変更」など)は元から正しく入っていたため、一切触っていません。 原因がGTM側だけの場合、GA4を触る必要はありません。
「たぶん直った」で終わらせないために、2段階で確認しました。
GA4の レポート → リアルタイム を開いた状態で、自分のサイトを別タブで開きます。
イベント名に page_view が出て、ページタイトルごとの表示回数が入れば成功です。
より確実なのはこちらです。開発者ツールのネットワークタブを開いて collect で絞り込み、サイトを再読み込みします。
/g/collect へのリクエストのクエリ文字列に、次の2つが入っていれば正しく飛んでいます。
en=page_view ← イベント名
tid=G-XXXXXXXXXX ← 測定ID
en は event name の略です。ここが gtm.dom になっていたら、まだ古いタグが生きています。
この確認方法はGA4の反映待ち(数分〜数十分)を待たずに済むので、修正直後の切り分けに便利です。
計測を直したら、今度は参照元に localhost:3000 が記録されていることに気づきました。ローカル開発中のアクセスが本番のGA4に流れ込んでいたわけです。
Next.jsなら、計測タグを本番サイトでのみ読み込むようにすれば防げます。
// pages/_app.js
const isProductionSite =
process.env.NODE_ENV === 'production' &&
process.env.NEXT_PUBLIC_VERCEL_ENV !== 'preview'
export default function App({ Component, pageProps }) {
return (
<>
{isProductionSite && (
<GoogleTagManager googleTagManagerId={googleTagManagerId} />
)}
<Component {...pageProps} />
</>
)
}
NODE_ENV だけで判定するとVercelのプレビューデプロイも本番扱いになってしまう点に注意してください。プレビューは NODE_ENV === 'production' でビルドされるためです。Vercelが自動で入れてくれる NEXT_PUBLIC_VERCEL_ENV を併用すると、プレビューも除外できます。
計測データを綺麗にしたいなら、直すのは早いほうがいいです。混ざったデータは後から取り除けません。
残念ながら無理です。送られていないデータはどこにも存在しないので、後から埋める手段はありません。私も3年分をきれいに諦めました。
とはいえ全滅でもありません。ユーザー数・セッション数・参照元は正しく記録され続けていたので、「去年の同じ時期と比べて人が減ったのか」くらいの話ならこれまで通り追えます。使えないのはページ単位の指標(表示回数、エンゲージメント時間)だけです。
どのページが読まれていたかを知りたいなら、Google Search Consoleが残っています。GSCはGA4とは別系統でGoogle検索経由の表示回数とクリック数をページごとに持っているので、今回の件とは無関係に無傷でした。私も結局そちらを見て過去を振り返っています。
そちらならまず起きないはずです。GA4のデータストリーム画面からコピーできるスニペットには最初からconfig(Googleタグに相当するもの)が含まれていて、これがpage_viewを送ってくれます。貼った時点で完成しているわけです。
裏を返すと、今回の落とし穴はGTMでタグを1つずつ手で組み立てたときにだけ開くものだと言えます。イベントタグのほうから作り始めると、土台にあたる設定タグの存在を意識しないまま出来上がった気になってしまう。私はそれをやりました。
たいていは要りません。GA4の拡張計測機能にある「ブラウザの履歴イベントに基づくページの変更」がオンなら、historyの書き換えを検知してpage_viewを送ってくれます。しかも既定でオンです。
ただ、そこを疑うのは後回しでいいと思います。SPA遷移が取れていないように見えて、実は初回ロードのpage_viewからして飛んでいなかった、というのが今回のパターンでした。まずGoogleタグを入れて1回目が記録されるか見るほうが、切り分けとしては圧倒的に速いです。
gtm.dom や gtm.js というイベントがGA4に出ているのですがまさにそれです。この記事は最初から最後までその状態の話をしています。
GTMが内部で使っているイベント名が、そのままGA4まで届いてしまっている状態です。イベント名に{{Event}}を指定したタグが紛れ込んでいないか、GTMのタグ一覧を見てみてください。
GA4でページ別の数字だけがゼロになる場合、チェックする順番はこうです。
page_view があるか見る{{Event}} のGA4イベントタグがあれば、それが犯人Initialization - All Pages で追加し、壊れたタグを削除して公開en=page_view が飛ぶことを確認する一番の教訓は、「グラフに線が出ている=正しく計測できている」ではないということでした。ユーザー数だけを見ていると、3年でも気づけません。
導入したときに一度、イベント名の一覧を目視する。これだけで防げます。
同じサイトの計測まわりでは、GTMのタグ読み込みが表示速度を落としていた話も書いています。
この記事が何かのお役に立てれば幸いです。
最後までお読みいただきありがとうございました!
Share Me!