[{"data":1,"prerenderedAt":461},["ShallowReactive",2],{"content-/ga4-analytics-inventory":3,"all-pages-for-dir":439,"related-/ga4-analytics-inventory":440,"og-image-/ga4-analytics-inventory":460},{"id":4,"title":5,"body":6,"category":420,"concepts":421,"description":422,"extension":423,"meta":424,"navigation":374,"ogImage":421,"path":425,"project_name":426,"published":427,"publishedAt":428,"seo":429,"source":430,"stem":431,"tags":432,"todo":421,"unpublished":427,"updatedAt":421,"__hash__":438},"pages/2026-08/2026-08-12/ga4-analytics-inventory.md","PVが測れていないサイトにGA4を入れ、ドメイン別の計測対応表を作った",{"type":7,"value":8,"toc":408},"minimark",[9,13,17,20,23,27,46,49,52,60,64,67,70,84,88,91,94,97,100,111,114,208,211,215,218,283,286,289,292,296,307,310,313,328,331,334,337,340,343,360,363,404],[10,11,5],"h1",{"id":12},"pvが測れていないサイトにga4を入れドメイン別の計測対応表を作った",[14,15,16],"p",{},"そういえばこのブログ、PVという概念がない。月にどれくらい読まれているのか、自分で答えられない。",[14,18,19],{},"手元に記録が残っていないか探させたら、出てきたのはSearch Consoleのスナップショットだけだった。検索クリックが月およそ480、検索結果への表示がおよそ2万。数字はある。ただしクリックはPVではない。検索からの流入回数であって、SNSの直リンクもサイト内の回遊も含まない。読まれた総量は、測っていない以上どこにも無い。",[14,21,22],{},"GA4を入れてほしい、と頼んだ。まず今どこに何が入っているのかを確認させたら、そこで手が止まった。",[24,25,26],"h2",{"id":26},"結論",[28,29,30,34,37,40,43],"ul",{},[31,32,33],"li",{},"保有ドメインは6件、稼働しているホストは26件あり、そのうち3ドメインは自分でも把握していなかった",[31,35,36],{},"GA4が入っていなかったのは、いちばん見たい本体サイトとこのブログの2つだった",[31,38,39],{},"「このドメインはどのリポジトリか」を毎回grepで探し直していたので、対応表をドキュメントとして残させた",[31,41,42],{},"本体サイトはタグを本番へ戻した。計測が止まったのは2026-06-07で、サイト移行のときにタグが引き継がれていなかった",[31,44,45],{},"ただし戻したあともGA側に1件も記録されない。ここは未解決のまま翌日へ持ち越した",[24,47,48],{"id":48},"手元にあったのは検索経由の数字だけだった",[14,50,51],{},"Search Consoleには直近3か月の実測が残っていた。このブログはクリック1,450、表示6.16万、平均掲載順位9.2。月に直すとクリック480、表示2万になる。ドメイン全体では3か月で6,790クリックだった。",[14,53,54,55,59],{},"この数字で分かるのは検索からの入口の広さだけで、入ったあとに何ページ見られたかは分からない。実PVを知るには計測タグが要る。",[56,57,58],"code",{},"nuxt.config.ts"," にはGAもCloudflare Web Analyticsも入っていなかった。",[24,61,63],{"id":62},"入れる前にどこに何が入っているのか分からなくなった","入れる前に、どこに何が入っているのか分からなくなった",[14,65,66],{},"タグを貼る対象を確定させるつもりで、ログイン済みのChromeを使って現状を洗わせた。",[14,68,69],{},"Cloudflareに登録されているドメインは6件。うち3件は、自分の口から名前が出てこなかった。本体サイトのドメインだけでサブドメインが16個ぶら下がっていて、全部を合わせると稼働ホストは26件になった。",[14,71,72,73,76,77,76,80,83],{},"26ホストのHTMLを1件ずつ取得して、",[56,74,75],{},"G-"," ",[56,78,79],{},"GTM-",[56,81,82],{},"UA-"," を検出させた。GAが入っていないのは、主力の本体サイトとこのブログの2つだった。業種別に切り出したランディングページ10件には、個別のGA4がすでに入って動いている。いちばん見たい2つだけが穴だった。",[24,85,87],{"id":86},"_2回の誤診","2回の誤診",[14,89,90],{},"1回目。あるサイトはトップページのHTMLにGTMのコンテナしか無く、その中身を取ると廃止済みのUAが出てきた。「実質計測ゼロ」と報告が上がってきたので、GA側のストリームを開かせた。過去48時間、データを受信中だった。UAは止まった残骸が同居していただけで、計測は生きている。トップページのHTMLだけを見て判定してはいけない。裏はGA側の受信状況で取る。",[14,92,93],{},"2回目。ChromeにはGoogleアカウントが3つログインしている。GAのアカウント一覧は、アクティブなアカウントによって中身が変わる。片方で「権限がありません」と出るプロパティが、もう片方では普通に見える。実際、本体サイト用のプロパティを「見当たらない」と報告してきたので、入っているはずだと押し返した。開いてみたら、URLまで登録済みのプロパティがちゃんとあった。ここで信じていたら、要らないプロパティを1つ増やしていた。",[24,95,96],{"id":96},"grepで探し直すのをやめるための対応表",[14,98,99],{},"持っているものを全部、対応表として正確に残しておいてほしいと頼んだ。",[14,101,102,103,106,107,110],{},"理由ははっきりしている。「このドメインはどのリポジトリだったか」を、これまで毎回grepで探し直していた。",[56,104,105],{},"Git_repo"," の直下にリポジトリが200以上あるので、全体を対象にした ",[56,108,109],{},"grep -r"," は5分でタイムアウトして返ってこない。この日も1回落ちた。",[14,112,113],{},"リポジトリ特定の最短経路は結局CloudflareのDNSだった。CNAMEの向き先がそのままPagesのプロジェクト名になるので、ゾーンごとにDNSレコードを一覧すればドメインと配信元が1対1で並ぶ。",[115,116,121],"pre",{"className":117,"code":118,"language":119,"meta":120,"style":120},"language-js shiki shiki-themes vitesse-light vitesse-light","// Cloudflareにログイン済みのタブで、ゾーンごとにDNSを引く\nconst zones = (await (await fetch('/api/v4/zones?per_page=100', { credentials: 'include' })).json()).result\n","js","",[56,122,123,132],{"__ignoreMap":120},[124,125,128],"span",{"class":126,"line":127},"line",1,[124,129,131],{"class":130},"sxvE3","// Cloudflareにログイン済みのタブで、ゾーンごとにDNSを引く\n",[124,133,135,139,143,147,150,154,156,158,162,165,169,173,175,178,181,185,188,191,194,196,199,202,205],{"class":126,"line":134},2,[124,136,138],{"class":137},"stQ0i","const",[124,140,142],{"class":141},"s4oTP"," zones",[124,144,146],{"class":145},"shFtX"," =",[124,148,149],{"class":145}," (",[124,151,153],{"class":152},"sHkkW","await",[124,155,149],{"class":145},[124,157,153],{"class":152},[124,159,161],{"class":160},"senZ8"," fetch",[124,163,164],{"class":145},"(",[124,166,168],{"class":167},"sMJiu","'",[124,170,172],{"class":171},"sdGka","/api/v4/zones?per_page=100",[124,174,168],{"class":167},[124,176,177],{"class":145},",",[124,179,180],{"class":145}," {",[124,182,184],{"class":183},"sz8Xr"," credentials",[124,186,187],{"class":145},":",[124,189,190],{"class":167}," '",[124,192,193],{"class":171},"include",[124,195,168],{"class":167},[124,197,198],{"class":145}," })).",[124,200,201],{"class":160},"json",[124,203,204],{"class":145},"()).",[124,206,207],{"class":141},"result\n",[14,209,210],{},"これでドメイン、ローカルリポジトリ、Cloudflareの配信先、GA4、Search Consoleの5列が埋まった。HTMLにしてChromeの前面タブに出させたら、本文が目次に14px重なっていた。目次の実幅はpadding込みで334px、右余白16pxで350px要るのに、336pxしか空けていなかった。直させてから読んだ。",[24,212,214],{"id":213},"タグを本番へ戻し止まった日付を確かめた","タグを本番へ戻し、止まった日付を確かめた",[14,216,217],{},"本体サイトはNuxtで動いている。開発中のアクセスを数えないよう、本番ビルドのときだけタグが入る形で実装させた。",[115,219,223],{"className":220,"code":221,"language":222,"meta":120,"style":120},"language-ts shiki shiki-themes vitesse-light vitesse-light","// nuxt.config.ts: 本番ビルドのときだけ計測タグを差し込む\n$production: {\n  app: { head: { script: [ /* gtag/js?id=G-XXXXXXX と gtag('config', ...) */ ] } }\n}\n","ts",[56,224,225,230,240,277],{"__ignoreMap":120},[124,226,227],{"class":126,"line":127},[124,228,229],{"class":130},"// nuxt.config.ts: 本番ビルドのときだけ計測タグを差し込む\n",[124,231,232,235,237],{"class":126,"line":134},[124,233,234],{"class":160},"$production",[124,236,187],{"class":145},[124,238,239],{"class":145}," {\n",[124,241,243,246,248,250,253,255,257,260,262,265,268,271,274],{"class":126,"line":242},3,[124,244,245],{"class":160},"  app",[124,247,187],{"class":145},[124,249,180],{"class":145},[124,251,252],{"class":160}," head",[124,254,187],{"class":145},[124,256,180],{"class":145},[124,258,259],{"class":160}," script",[124,261,187],{"class":145},[124,263,264],{"class":145}," [",[124,266,267],{"class":130}," /* gtag/js?id=G-XXXXXXX と gtag('config', ...) */",[124,269,270],{"class":145}," ]",[124,272,273],{"class":145}," }",[124,275,276],{"class":145}," }\n",[124,278,280],{"class":126,"line":279},4,[124,281,282],{"class":145},"}\n",[14,284,285],{},"ビルドして、生成物241ページすべてにタグが出ていることを確認した。",[14,287,288],{},"デプロイ直前に、報告のなかの「5年間データが入っていない」という一言が引っかかった。どこで確認したのかと聞くと、根拠は「過去48時間に受信データなし」という表示だけだった。ホーム画面を過去12か月で見せたら、アクティブユーザー3.7万、表示回数5.3万、イベント18万が並んでいた。異常検知の記録も残っていた。2026-06-07に新規ユーザー数が予測704に対して実際3まで落ち、マイナス99.6%と記録されていた。5年ではなく2か月前で、原因はWordPressからNuxtへ移したときにタグを引き継がなかったことだった。",[14,290,291],{},"数字を推測で埋められると、こちらの判断ごと狂う。誤記は直させ、反省として1行だけ対応表に残させた。",[24,293,295],{"id":294},"_204が返るのにgaには届かない","204が返るのに、GAには届かない",[14,297,298,299,302,303,306],{},"デプロイ後、本番のHTMLに測定IDが入っていることを確認した。ところがブラウザで開いても計測が動かない。見ていたのは古いキャッシュで、ハードリロードしたら ",[56,300,301],{},"collect"," のリクエストが2件飛んだ。",[56,304,305],{},"/g/collect"," はHTTP 204を返した。",[14,308,309],{},"それでもGAのリアルタイムは0のままだった。",[14,311,312],{},"最初に疑ったのは内部トラフィックの除外フィルタで、確かに登録はされていた。ただし状態は「テスト」で、テストでは実際には除外されない。それにこちらはスマホからも開いている。スマホは別IPなので、IPベースの除外では説明がつかない。仮説を取り下げさせた。",[14,314,315,316,319,320,322,323,327],{},"決定打はDebugViewだった。",[56,317,318],{},"debug_mode"," を付けて強制送信しても「デバッグに使用するデバイス 0」のまま動かない。ここで分かったのは、GA4の ",[56,321,305],{}," が",[324,325,326],"strong",{},"測定IDが無効でも204を返して黙って捨てる","という仕様だった。204は「受け取った」の証拠にならず、DebugViewに出ないことのほうが重い。",[14,329,330],{},"サイト側は正しく送っていて、GAのプロパティが受け取っていない。この状態で今日は終わった。対応表には、各プロパティへのリンクとこの未解決の状態をそのまま書かせた。",[24,332,333],{"id":333},"使っていないアカウントは置いておく",[14,335,336],{},"業種別ランディングページのうち5件は、サイト側で計測が動いているのにプロパティの置き場所が見つからなかった。確認していないGoogleアカウントが1つ残っているので、そこにある可能性が高い。",[14,338,339],{},"ただし切り替えは3回とも弾かれたし、そのアカウントは普段使っていない。5件はすでに計測が動いていて実務上の支障もない。とりあえず置いておく、と決めて対象外にした。分からないものを分からないまま台帳に書いておけば、次に必要になったときに探し直さずに済む。",[24,341,342],{"id":342},"学び",[28,344,345,348,351,354,357],{},[31,346,347],{},"クリックはPVではない。Search Consoleで見えるのは検索からの入口だけで、入ったあとの回遊は測れない",[31,349,350],{},"トップページのHTMLにタグが無くても、計測が死んでいるとは限らない。GTM経由や別ストリームで生きていることがある。判定はGA側の受信状況で取る",[31,352,353],{},"GAのアカウント一覧は、ブラウザでアクティブなGoogleアカウントによって変わる。「権限がありません」を「プロパティが無い」と読むと、要らないプロパティを増やす",[31,355,356],{},"ステータスコードは計測できている証拠にならない。204で受理されていても、GAが記録しているとは限らない",[31,358,359],{},"「どのドメインがどのリポジトリか」は、頭ではなくDNSが持っていた。CNAMEの向き先がそのまま答えになる",[24,361,362],{"id":362},"明日やること",[28,364,367,377,383,389,395],{"className":365},[366],"contains-task-list",[31,368,371,376],{"className":369},[370],"task-list-item",[372,373],"input",{"disabled":374,"type":375},true,"checkbox"," 送信は成功しているのにGAに記録されない件を切り分ける（プロパティの状態確認、測定IDの現行値確認、移行前の測定ID確認、新ストリーム作成の順）",[31,378,380,382],{"className":379},[370],[372,381],{"disabled":374,"type":375}," このブログ用のGA4プロパティを新規作成してタグを設置する",[31,384,386,388],{"className":385},[370],[372,387],{"disabled":374,"type":375}," 残り3サイトのプロパティ作成とタグ設置",[31,390,392,394],{"className":391},[370],[372,393],{"disabled":374,"type":375}," Search Consoleに未登録の4ドメインを登録する",[31,396,398,400,401,403],{"className":397},[370],[372,399],{"disabled":374,"type":375}," 本体サイトの ",[56,402,58],{}," をコミットする（デプロイは済んでいるが未コミット）",[405,406,407],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":120,"searchDepth":134,"depth":134,"links":409},[410,411,412,413,414,415,416,417,418,419],{"id":26,"depth":134,"text":26},{"id":48,"depth":134,"text":48},{"id":62,"depth":134,"text":63},{"id":86,"depth":134,"text":87},{"id":96,"depth":134,"text":96},{"id":213,"depth":134,"text":214},{"id":294,"depth":134,"text":295},{"id":333,"depth":134,"text":333},{"id":342,"depth":134,"text":342},{"id":362,"depth":134,"text":362},"dev",null,"月間PVを答えられないと気づいてGA4の導入を決めたら、どのドメインに何の計測が入っているのか分からなくなった。26ホストを実測して対応表に落とし、本体サイトへタグを戻すまでの記録。","md",{},"/ga4-analytics-inventory","mdx-playground",false,"2026-08-12T00:00:00.000Z",{"title":5,"description":422},"make-diary","2026-08/2026-08-12/ga4-analytics-inventory",[433,434,435,436,437],"GA4","アクセス解析","Search Console","Nuxt","Cloudflare","jvy52cljzHz1Hjj0HBLqw99za39FSjjO2l9Vclb0oG8",[],[441,445,449,452,456],{"title":442,"path":443,"publishedAt":444},"WordPressサイトの本番DNS切替と、移行後に見つかった301の穴","/wordpress-cutover-phase4","2026-07-26T00:00:00.000Z",{"title":446,"path":447,"publishedAt":448},"Cloudflare PagesとWorkers Static Assetsの違い、エッジキャッシュが効く仕組み","/cloudflare-pages-workers-static-assets","2026-07-22T00:00:00.000Z",{"title":450,"path":451,"publishedAt":448},"Webサービスの技術構成 2026年版 — Vue.js/Nuxt/Astroの使い分けとその理由","/web-tech-stack-2026",{"title":453,"path":454,"publishedAt":455},"Cloudflare Pages はもう Workers の中に住んでいる ― Static Assets 統合後の地図","/cloudflare-pages-to-workers-static-assets","2026-06-29T00:00:00.000Z",{"title":457,"path":458,"publishedAt":459},"Nuxt の pnpm generate を measure-deploy.ps1 でフェーズ別に計測した","/nuxt-build-deploy-time-measurement","2026-06-04T00:00:00.000Z","https://log.eurekapu.com/og/blog/ga4-analytics-inventory.png?v=2026-08-12T00%3A00%3A00.000Z&title=PV%E3%81%8C%E6%B8%AC%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%82%B5%E3%82%A4%E3%83%88%E3%81%ABGA4%E3%82%92%E5%85%A5%E3%82%8C%E3%80%81%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%88%A5%E3%81%AE%E8%A8%88%E6%B8%AC%E5%AF%BE%E5%BF%9C%E8%A1%A8%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F&author=Kei%20Komatsu&sig=826e9159ece18752",1786603439194]