Google Search Console 分析で見つけた機会キーワードに即日対応した記録
朝、Claude Web に Google Search Console の過去28日データを読み込ませて分析させた結果が手元に届いた。冒頭の一文が「伸びていない原因はかなりはっきりデータに出ていて、改善できる余地も大きい」。この分析結果を Claude Code に渡して、実装側の対応を同日中に順次実行させた記録。
分析が突きつけた数字
GSC の全体データはこうだった。
- CTR 2.3%
- 平均掲載順位 8.4
検索結果の1ページ目下部には出ている。しかしクリックされない。「表示はされるが選ばれない」状態だ。分析は問題を構造的に分解していて、サイト側で打てる手が優先度付きで並んでいた。
まずこの分析結果を定点観測メモとして unpublished: true で保存させた。改善施策を打ったあとに数字がどう動いたかを突き合わせるための基準点になる。
「順次全部やってください」
メモ保存のあと、実装側の現状を3つの観点で並列調査させた。関連記事の表示機構、内部リンク構造、薄い記事の所在。調査結果が揃ったところで、私は一言だけ打った。
はい、順次全部やってください。
ここから Claude Code が P0〜P2 を順番に消化していった。
| 優先度 | 内容 |
|---|---|
| P0-A | 関連記事コンポーネント(RelatedArticles.vue)の新設と [...slug].vue への統合 |
| P0-B | Jリーグページの SEO 文言修正 |
| P1-A | 薄い記事の加筆(gitkeep 記事を 3,604 → 9,095 bytes、約2.5倍に増量 + 内部リンク4本) |
| P1-B | volta 関連のハブ記事整備 |
| P2 | タグページ(/tags/*)の新設、ArticleTable のタグ NuxtLink 化、DocPage フッターへのタグリンク追加 |
途中、全体テストで失敗が出たが、差分テストで切り分けたら私の変更による新規失敗は0件、残りはすべて既存問題だった。unpublished: true のメモに path フィールドが必要というテスト仕様も1件直した。
コミット a2b05dbe(12 files changed, 1,076 insertions)をデプロイして、ここまでが前半戦。
「積み残しありますか」→「全部やる」
デプロイが終わったところで、私はもう一度聞いた。
なんか積み残しってありますか?このセッション。
Claude Code がセッション中に「やっていない」「次のステップ」として残したものを一覧にして返してきた。未コミット変更、sitemap への /tags/* 追加、E2E テスト、og-meta-tags の既存 failed 12件、coverage 取得、本番動作確認、新規記事。
OK、じゃあ全部やる。
後半戦はこの一言で始まった。
消化した積み残し
- 未コミット変更の整理: 3グループに分けてコミット。途中 amend で意図しない混在が起きたが、分け直して回復
- sitemap / prerender:
nuxt.config.tsにタグルート収集の関数を追加し、/tags/* を prerender 対象に。最終的にタグルート 2,059 件が prerender された - og-meta-tags の既存 failed 12件: pass している
taiwan/index.vueのパターンを基準に、12ファイルを並列で修正。テストを再実行して 143 ファイル全 pass - E2E: 関連記事・タグページの spec を追加
- coverage: Statements 97.72% / Lines 100%
git log にはこう残った。
SEO: og-meta-tags 既存failed 12件修正 + /tags/* の prerender 追加 + 関連記事/タグ E2E
content: GSC 機会キーワード対応の解説記事 4本を追加
機会キーワードへの解説記事量産
GSC 分析が示した機会キーワード(表示されているのに受け皿となる記事がないクエリ)に対して、解説記事を書かせた。同日に公開したのは以下。
- IIFE(即時実行関数式)とは何か
- Number.isFinite と isFinite の違い
- 厳密等価演算子(===)と等価演算子(==)の違い
- Volta から mise へ移行する方法
- Cloudflare Pages にカスタムドメインを設定する手順
JavaScript の基礎文法系が並んでいるのは偶然ではない。過去のコード解説記事が拾っていた検索クエリのうち、専用記事がないものを受け皿にする狙いだ。掲載順位 8.4 のページを 1〜3 位の専用記事に置き換えにいく。
最後のオチ: WebFetch の AI 解釈ミス
最終デプロイ後の動作確認で、一瞬ヒヤリとする場面があった。タグページが 404、sitemap にも /tags/ がない、と Claude Code が報告してきたのだ。
切り分けを進めさせると、実際にはタグルート 2,059 件は prerender されていて、sitemap にもタグページが 1,946 件含まれ、dist/tags/git/index.html も生成済みだった。実 HTML を直接確認したら article-table が17箇所、Git 関連記事が約15件ちゃんと表示されている。WebFetch がページ内容を解釈する段階で「404 だ」と誤読していただけだった。
道具の報告を鵜呑みにせず、実 HTML まで掘らせて初めて「正常」と確定できた。確認手段そのものが誤ることがある、という小さな教訓。
振り返り
- 分析(Claude Web)と実装(Claude Code)を分けて、分析結果を渡すだけで実装側が優先度付きで動く流れは速かった。私がやったのは「順次全部やってください」「全部やる」の2回の意思決定
- 「積み残しありますか」という問いは、セッション終盤の儀式として機能する。AI は自分が後回しにしたものを正確に覚えていて、一覧で出してくる
- CTR 2.3% がどう動くかは、これからの GSC データで答え合わせする。定点メモを残したのはそのため