[{"data":1,"prerenderedAt":522},["ShallowReactive",2],{"content-/ga4-domain-and-ops-docs":3,"all-pages-for-dir":520,"og-image-/ga4-domain-and-ops-docs":521},{"id":4,"title":5,"body":6,"category":504,"description":505,"extension":506,"meta":507,"navigation":508,"ogImage":509,"path":510,"project_name":268,"published":511,"publishedAt":512,"seo":513,"stem":514,"tags":515,"todo":509,"unpublished":511,"updatedAt":509,"__hash__":519},"pages/2026-05/2026-05-12/ga4-domain-and-ops-docs.md","GA4設置とドメインの取り違え - runtimeConfig一元化と運営体制のドキュメント化",{"type":7,"value":8,"toc":496},"minimark",[9,30,35,77,81,87,242,245,249,256,270,275,278,297,300,304,307,359,362,427,433,437,444,450,455,469,472,475,492],[10,11,12,13,17,18,21,22,25,26,29],"p",{},"Nuxt 4 プロジェクトに GA4（G-9NMESN4QFX）を設置した。タグ自体は ",[14,15,16],"code",{},"nuxt.config.ts"," の ",[14,19,20],{},"app.head.script"," に2行追加するだけで終わった。だが、その途中で AI（私）が「このサイトのドメインは eurekapu.com」と思い込んで書いてしまい、実態と食い違うミスを生んだ。気づいたあと、絶対URLを ",[14,23,24],{},"runtimeConfig"," に集約し、運営体制のルールを ",[14,27,28],{},"CLAUDE.md"," に書き足すところまで一気に進めた。",[31,32,34],"h2",{"id":33},"やったこと時系列","やったこと（時系列）",[36,37,38,44,51,58,64,71],"ol",{},[39,40,41,43],"li",{},[14,42,16],{}," に GA4 タグ（gtag.js 本体 + 初期化スクリプト）を追加",[39,45,46,47,50],{},"デプロイ先ドメインを AI が ",[14,48,49],{},"eurekapu.com"," と決め打ちして書き始めた",[39,52,53,54,57],{},"実際のデプロイ先は ",[14,55,56],{},"info-accounting.com"," だった（指摘されて気づいた）",[39,59,60,61,63],{},"関連箇所3つを ",[14,62,56],{}," に統一（i18n baseUrl・ogUrl・README）",[39,65,66,67,70],{},"絶対URLの生成を ",[14,68,69],{},"runtimeConfig.public.siteUrl"," に一元化",[39,72,73,74,76],{},"運営体制のルールを ",[14,75,28],{}," の Conventions セクションに2項目追記",[31,78,80],{"id":79},"ga4-タグの設置","GA4 タグの設置",[10,82,83,84,86],{},"核心は ",[14,85,16],{}," の以下の部分だけ。",[88,89,94],"pre",{"className":90,"code":91,"language":92,"meta":93,"style":93},"language-ts shiki shiki-themes vitesse-light vitesse-light","app: {\n  head: {\n    script: [\n      { src: 'https://www.googletagmanager.com/gtag/js?id=G-9NMESN4QFX', async: true },\n      {\n        children: `\n          window.dataLayer = window.dataLayer || [];\n          function gtag(){dataLayer.push(arguments);}\n          gtag('js', new Date());\n          gtag('config', 'G-9NMESN4QFX');\n        `\n      }\n    ]\n  }\n}\n","ts","",[14,95,96,112,122,133,171,177,188,194,200,206,212,218,224,230,236],{"__ignoreMap":93},[97,98,101,105,109],"span",{"class":99,"line":100},"line",1,[97,102,104],{"class":103},"senZ8","app",[97,106,108],{"class":107},"shFtX",":",[97,110,111],{"class":107}," {\n",[97,113,115,118,120],{"class":99,"line":114},2,[97,116,117],{"class":103},"  head",[97,119,108],{"class":107},[97,121,111],{"class":107},[97,123,125,128,130],{"class":99,"line":124},3,[97,126,127],{"class":103},"    script",[97,129,108],{"class":107},[97,131,132],{"class":107}," [\n",[97,134,136,139,143,146,150,154,156,159,162,164,168],{"class":99,"line":135},4,[97,137,138],{"class":107},"      { ",[97,140,142],{"class":141},"sz8Xr","src",[97,144,145],{"class":107},": ",[97,147,149],{"class":148},"sMJiu","'",[97,151,153],{"class":152},"sdGka","https://www.googletagmanager.com/gtag/js?id=G-9NMESN4QFX",[97,155,149],{"class":148},[97,157,158],{"class":107},", ",[97,160,161],{"class":141},"async",[97,163,145],{"class":107},[97,165,167],{"class":166},"sHkkW","true",[97,169,170],{"class":107}," },\n",[97,172,174],{"class":99,"line":173},5,[97,175,176],{"class":107},"      {\n",[97,178,180,183,185],{"class":99,"line":179},6,[97,181,182],{"class":141},"        children",[97,184,145],{"class":107},[97,186,187],{"class":148},"`\n",[97,189,191],{"class":99,"line":190},7,[97,192,193],{"class":152},"          window.dataLayer = window.dataLayer || [];\n",[97,195,197],{"class":99,"line":196},8,[97,198,199],{"class":152},"          function gtag(){dataLayer.push(arguments);}\n",[97,201,203],{"class":99,"line":202},9,[97,204,205],{"class":152},"          gtag('js', new Date());\n",[97,207,209],{"class":99,"line":208},10,[97,210,211],{"class":152},"          gtag('config', 'G-9NMESN4QFX');\n",[97,213,215],{"class":99,"line":214},11,[97,216,217],{"class":148},"        `\n",[97,219,221],{"class":99,"line":220},12,[97,222,223],{"class":107},"      }\n",[97,225,227],{"class":99,"line":226},13,[97,228,229],{"class":107},"    ]\n",[97,231,233],{"class":99,"line":232},14,[97,234,235],{"class":107},"  }\n",[97,237,239],{"class":99,"line":238},15,[97,240,241],{"class":107},"}\n",[10,243,244],{},"ここは特に詰まらなかった。問題はこの次に起きた。",[31,246,248],{"id":247},"ドメインの取り違え-根拠1行で決め打ちしたミス","ドメインの取り違え - 根拠1行で決め打ちしたミス",[10,250,251,252,255],{},"GA4 設置後、関連する箇所（i18n baseUrl、OGP の絶対URL、README のサイト紹介文）にドメインを書こうとした。私はそこで ",[14,253,254],{},"https://eurekapu.com"," と書き始めた。",[10,257,258,259,261,262,265,266,269],{},"根拠は、",[14,260,16],{}," の i18n 設定にあった ",[14,263,264],{},"baseUrl: 'https://eurekapu.com'"," の1行だけ。プロジェクト名が ",[14,267,268],{},"eurekapu-nuxt4"," だったことも、思い込みを補強した。",[10,271,53,272,274],{},[14,273,56],{}," だった。指摘されて初めて、設定ファイル1行を根拠に決め打ちした自分のミスに気づいた。",[10,276,277],{},"事業の立て付けはこうなっている。",[279,280,281,288,294],"ul",{},[39,282,283,287],{},[284,285,286],"strong",{},"コンテンツ／ブランド",": エウレカープ（個人）",[39,289,290,293],{},[284,291,292],{},"運営主体",": info-accounting 合同会社（ひとり会社）",[39,295,296],{},"個人が作ったコンテンツを合同会社が提供を受けて運営する",[10,298,299],{},"つまりブランド名（eurekapu）とデプロイ先ドメイン（info-accounting.com）は意図的にずれている。AI が i18n 設定の1行だけ見て「このサイト = eurekapu.com」と単純化したのは、構造を理解せずに一番手前にあった情報で穴埋めしただけだった。",[31,301,303],{"id":302},"runtimeconfig-で絶対urlを一元化","runtimeConfig で絶対URLを一元化",[10,305,306],{},"同じミスを構造的に防ぐため、絶対URLを書く場所を1箇所に絞った。",[88,308,310],{"className":90,"code":309,"language":92,"meta":93,"style":93},"// nuxt.config.ts\nruntimeConfig: {\n  public: {\n    siteUrl: 'https://info-accounting.com'\n  }\n}\n",[14,311,312,318,326,335,351,355],{"__ignoreMap":93},[97,313,314],{"class":99,"line":100},[97,315,317],{"class":316},"sxvE3","// nuxt.config.ts\n",[97,319,320,322,324],{"class":99,"line":114},[97,321,24],{"class":103},[97,323,108],{"class":107},[97,325,111],{"class":107},[97,327,328,331,333],{"class":99,"line":124},[97,329,330],{"class":103},"  public",[97,332,108],{"class":107},[97,334,111],{"class":107},[97,336,337,340,342,345,348],{"class":99,"line":135},[97,338,339],{"class":103},"    siteUrl",[97,341,108],{"class":107},[97,343,344],{"class":148}," '",[97,346,347],{"class":152},"https://info-accounting.com",[97,349,350],{"class":148},"'\n",[97,352,353],{"class":99,"line":173},[97,354,235],{"class":107},[97,356,357],{"class":99,"line":179},[97,358,241],{"class":107},[10,360,361],{},"ページ側からはこう呼ぶ。",[88,363,365],{"className":90,"code":364,"language":92,"meta":93,"style":93},"// practice.vue\nconst config = useRuntimeConfig()\nconst ogUrl = `${config.public.siteUrl}/practice`\n",[14,366,367,372,391],{"__ignoreMap":93},[97,368,369],{"class":99,"line":100},[97,370,371],{"class":316},"// practice.vue\n",[97,373,374,378,382,385,388],{"class":99,"line":114},[97,375,377],{"class":376},"stQ0i","const ",[97,379,381],{"class":380},"s4oTP","config",[97,383,384],{"class":107}," =",[97,386,387],{"class":103}," useRuntimeConfig",[97,389,390],{"class":107},"()\n",[97,392,393,395,398,400,403,406,408,411,414,416,419,422,425],{"class":99,"line":124},[97,394,377],{"class":376},[97,396,397],{"class":380},"ogUrl",[97,399,384],{"class":107},[97,401,402],{"class":148}," `",[97,404,405],{"class":166},"${",[97,407,381],{"class":152},[97,409,410],{"class":107},".",[97,412,413],{"class":152},"public",[97,415,410],{"class":107},[97,417,418],{"class":152},"siteUrl",[97,420,421],{"class":166},"}",[97,423,424],{"class":152},"/practice",[97,426,187],{"class":148},[10,428,429,430,432],{},"これでドメインを書き換えたいときに ",[14,431,16],{}," の1箇所だけ触ればよくなり、AI が文字列を直書きする余地を減らせる。修正したのは i18n baseUrl・1ページの ogUrl・README の3箇所。",[31,434,436],{"id":435},"claudemd-に書かないとai-も自分も忘れる","CLAUDE.md に書かないと、AI も自分も忘れる",[10,438,439,440,443],{},"ドメインを訂正したあと、もう1つ気づいたことがある。「コンテンツ = エウレカープ（個人）、運営 = info-accounting 合同会社」という立て付けを、私は会話の中で口頭で伝えただけだった。次のセッションで AI が ",[14,441,442],{},"git log"," や設定ファイルを見ても、この構造は見えてこない。",[10,445,446,447,449],{},"だから次に同じ作業をするとき、AI はまた同じ思い込みで ",[14,448,49],{}," と書き始める可能性が高い。",[10,451,452,454],{},[14,453,28],{}," の Conventions セクション（既に「外部リンクは新規タブで開く」「参考書籍の出典を明記する」が並んでいる場所）に、運営体制のルールを2項目追記した。",[279,456,457,466],{},[39,458,459,460,462,463,465],{},"デプロイ先ドメインは ",[14,461,56],{},"。絶対URL は ",[14,464,69],{}," 経由で参照する",[39,467,468],{},"コンテンツのブランド名は「エウレカープ」、運営主体は「info-accounting 合同会社」。両者を混同しない",[10,470,471],{},"口頭で伝えた情報は、次のセッションでは消える。AI が再現可能な形で動くためには、設定ファイルかドキュメントに書き残すしかない。今回はその当たり前を、ドメイン取り違えで思い出させられた。",[31,473,474],{"id":474},"学び",[279,476,477,480,486],{},[39,478,479],{},"設定ファイルの1行を根拠に「このサイト = ◯◯」と決めつけるな。ブランド名とデプロイ先ドメインが一致しているとは限らない",[39,481,482,483,485],{},"絶対URLは直書きせず ",[14,484,24],{}," に集約する。書き換える場所が1箇所になり、AI の文字列直書きミスも減る",[39,487,488,489,491],{},"口頭で伝えた事業の立て付けは、次のセッションでは消えている。",[14,490,28],{}," に書かないと、AI も自分も同じミスを繰り返す",[493,494,495],"style",{},"html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}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 .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}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);}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}",{"title":93,"searchDepth":114,"depth":114,"links":497},[498,499,500,501,502,503],{"id":33,"depth":114,"text":34},{"id":79,"depth":114,"text":80},{"id":247,"depth":114,"text":248},{"id":302,"depth":114,"text":303},{"id":435,"depth":114,"text":436},{"id":474,"depth":114,"text":474},"dev","Nuxt 4 プロジェクトに GA4 を設置する作業の途中で、AI が思い込みで別ドメインを書いた。気づいた瞬間、設定ファイル3箇所を修正し、絶対URLを runtimeConfig に集約し、運営体制を CLAUDE.md に明文化した。","md",{},true,null,"/ga4-domain-and-ops-docs",false,"2026-05-12T00:00:00.000Z",{"title":5,"description":505},"2026-05/2026-05-12/ga4-domain-and-ops-docs",[516,517,24,28,518],"GA4","Nuxt","AI協働","Qil4vZbi7s179pk7L81FRUBcORmRtlFXSixDRmmhpT4",[],"https://log.eurekapu.com/og/blog/ga4-domain-and-ops-docs.png?v=2026-05-12T00%3A00%3A00.000Z&title=GA4%E8%A8%AD%E7%BD%AE%E3%81%A8%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E5%8F%96%E3%82%8A%E9%81%95%E3%81%88%20-%20runtimeConfig%E4%B8%80%E5%85%83%E5%8C%96%E3%81%A8%E9%81%8B%E5%96%B6%E4%BD%93%E5%88%B6%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E5%8C%96&author=Kei%20Komatsu&sig=f16484466038e977",1782528835985]