Skip to content

Claude Code SEOStep 3 of 5

Google Search Console With Claude Code: Complete SEO Workflow

The common failure in AI-assisted SEO is writing the wrong thing enthusiastically. Search Console tells you what Google already associates with your domain — this is how to turn that into three changes rather than twelve articles.

Claude Code Guides: Google Search Console With Claude Code. Query bars sorted into position bands, with the four-to-ten band highlighted.

Let the data choose the work

The common failure in SEO with an AI assistant is not bad writing. It is writing the wrong thing enthusiastically — publishing a dozen more articles because publishing is what the tool makes cheap, while the pages that already have demand sit at position 50 with nobody touching them.

Search Console fixes that, because it tells you what Google already associates with your domain. The loop:

Search Console  →  real queries and positions
      ↓
Analysis        →  which pages have demand and where they sit
      ↓
A short list    →  three to five specific changes
      ↓
Deploy          →  one at a time
      ↓
Measure         →  four to six weeks later, same report

This guide is about the middle. For what to check on the site itself, that is the Claude Code SEO workflow; for running the audit and submitting what changed, that is the technical SEO audit guide. Neither covers reading the performance data that comes back, which is the whole subject here.

What the four metrics actually mean

Metric What it is The trap
Impressions Your URL appeared in a result set for that query Appearing at position 80 counts. It is demand plus visibility, not interest
Clicks Somebody clicked through The only one that is unambiguously a person doing something
CTR Clicks divided by impressions Meaningless at a position nobody scrolls to
Average position The mean of the positions your URL appeared at An average, over a period, across personalised and localised results

Average position is not a ranking. It is not a number you hold. One impression at position 6 and one at position 60 average to 33, describing a state the page was never in. Two consequences follow, and both matter more than they sound:

A row with a handful of impressions has an average position that is essentially noise. Set a floor — roughly ten impressions — below which you read a row as a hint rather than a finding. And a movement from 51 to 44 is usually the query mix changing, not the page improving.

Queries against pages, both directions

Two questions, and most people only ever ask the first.

Query → page. For this query, which URL does Google show? If it is not the one you intended, you have either a cannibalisation problem or a page that has been misunderstood.

Page → queries. For this URL, what is it actually being shown for? This is where the surprises live. A page written about one thing frequently earns impressions for an adjacent thing it barely mentions — and that is the clearest content signal Search Console produces.

A worked example from this site. The most-shown page was the guide on Claude Code skills, with 335 impressions in a month. Reading its queries rather than its position revealed that roughly a third were about installing a skill someone else wrote — "how to add skills to claude code", "how to download skills in claude code", "how to import skills to claude code" — an intent the article did not address anywhere. The fix was not a new article. It was three sections added to the page Google was already showing.

Windows, comparisons, and a new site

The default comparison is the last 28 days against the previous 28. It smooths weekday effects and is long enough that one odd day does not dominate.

A site move is the other reason to save windows before you need them. The migration SEO checklist starts with a twelve-month export from this report as the baseline, and explains what the Pages and URL Inspection tools can and cannot tell you afterwards.

Two adjustments worth knowing:

Data is not final immediately. Search Console finalises with a lag of roughly two days, so the most recent rows are provisional. In the API this is explicit: dataState takes final (the default) or all, and only the latter includes fresh data. If a report shows a cliff at the right-hand edge, check whether you are looking at incomplete days before concluding anything fell.

A young site has no 28-day comparison. Do not manufacture one. With three weeks of history the honest window is the whole of it, and the honest statement is that there is no trend yet. Say so in the report rather than presenting a comparison against a period of zeroes.

Five position bands and the action each deserves. Positions one to three should be left alone and protected. Four to ten are the cheapest gains and deserve optimisation. Eleven to twenty need a real gap in the page filled. Twenty-one to forty are topical signal and usually a content decision. Past forty, on-page work will not move the page.
The band decides the action. Treating every row the same is how a Search Console export becomes busywork.

Position bands, and what to do in each

Positions 1–3 — leave alone. Editing a page that already ranks is the easiest way to lose the position, and there is little headroom above it. Protect these.

Positions 4–10 — optimise. The highest-value band. The page is already on page one and Google already considers it relevant. Gains here come from title and description alignment, a clearer answer in the first screenful, and internal links. This is the smallest work for the largest return.

Positions 11–20 — strengthen. Close, but Google is preferring something else. The cause is usually a genuine gap in coverage rather than metadata. Read the queries the page earns, find the sub-question it does not answer, and answer it.

Positions 21–40 — read as signal. Not close, but informative: Google associates your domain with this topic. Usually a content decision rather than an optimisation, and often the right answer is to wait for more data.

Past 40 — do not optimise. This is the band most people waste time on, because it is where the impressions often are. A page at position 55 does not reach page one through metadata. That distance is an authority problem, and rewriting the title will not close it.

CTR opportunities

The pattern to look for is respectable position, meaningful impressions, poor click rate. All three conditions, or you are chasing noise.

A rough expectation by band is enough to spot outliers — position 1–3 in the tens of percent, 4–10 in the low single digits, past 20 fractions of a percent. Use it to flag rows that fall well below their band, then look at each one by hand.

Two firm rules. A low CTR past position 20 is not a title problem; nobody scrolled that far. And never make a title more clickable than the page is accurate — you win a click and lose the visitor, and the pogo-stick back to the results is not a signal you want to send.

When there genuinely is no qualifying row, the correct output is "no CTR opportunities in this window". On a young site that will be the answer for months, and inventing rewrites to fill the report is how good pages get damaged.

Content gaps, and when not to write

Impressions on a query your page barely covers mean Google has associated your domain with a topic you have not properly served. That is the cheapest content signal available, and it comes with a decision:

Situation Action
An existing page earns the impressions and could cover the intent Improve that page. It already has whatever authority earned the impressions
The intent is genuinely separate and would need its own page Write one, and link it both ways
Two of your pages split the same query Merge, or sharpen one and redirect the other. Not both
One or two impressions, no pattern Nothing. Wait for more data

The default should be the first row. A new page starts from zero; an existing one starts from wherever Google already put it.

The query-to-page table

The artefact worth producing. One row per query/page pair, sorted by whatever score you choose:

Query Page Pos Impr Clicks CTR Action
claude code seo /blogs/guides/claude-code-seo… 47.7 35 0 0% Highest demand, wrong side of 40 — answer the query directly at the top
how to add skills to claude code /blogs/guides/claude-code-skills 76.5 2 0 0% Intent not covered — add a section
connect shopify to claude code /blogs/guides/build-shopify… 60.0 6 0 0% Add a direct answer

Those are real rows from this site. Note that none of them is in a band where optimisation reliably moves position — which is itself the finding, and the reason the actions are about serving the intent properly rather than tuning a title.

A simple score keeps the sort honest. Impressions carry the weight, because they are the only evidence demand exists; proximity multiplies rows in the 4–20 band where a gain is cheapest; commercial relevance breaks ties. Resist elaborating it. A score is a sort order, not a forecast, and a complicated one invites you to believe it.

The Search Analytics API

The interface is fine for looking. For anything repeatable, the API is better: it returns more rows, it can be diffed between runs, and it can be handed to a script without a manual export.

Practical points from the Search Analytics query reference:

  • Dimensions are query, page, date, country, device, searchAppearance and hour, and can be combined.
  • rowLimit has a valid range of 1–25,000, defaulting to 1,000.
  • dataState is final by default. Pass all to include fresh, not-yet-finalised data.
  • The response carries a metadata object with first_incomplete_date, which is how you know where the provisional data begins rather than guessing.
  • Google states the API "does not guarantee to return all data rows but rather top ones" — so a query missing from a report is not proof it had no impressions.
  • If you group or filter by page, you cannot aggregate by property.

On credentials: a service account with the property added as an owner is the least painful route for a script. Keep the key file outside the repository, readable only by its owner, and never let it reach a log, a commit, or a diagnostic paste. The same rules as any other secret, covered in the security audit guide.

Handing the data to Claude Code

Once the data is a file, the analysis is exactly the kind of tedious sorting an agent does well:

Here is a Search Console export: query, page, clicks, impressions,
CTR, average position.

Produce:
1. Rows at position 4-10 with at least 10 impressions, sorted by
   impressions. For each, one specific change to the ranking page.
2. Rows at 11-20 with at least 10 impressions. For each, the
   sub-question the page appears not to answer.
3. Rows where CTR is under half what the position band suggests,
   AND position is 10 or better, AND impressions are at least 20.
4. Any query where two or more of our URLs take impressions.
5. Queries with real volume whose ranking page only partly covers
   the intent.

Rules:
- Do not recommend a new page where an existing page could serve
  the intent. Say which page and what to add.
- Ignore any row under 10 impressions. Say how many you ignored.
- Do not estimate traffic, difficulty, or volume. You do not have
  that data.
- If a category is empty, say so. Do not fill it.

The last three rules do most of the work. Without the volume prohibition you will get confident invented numbers, because keyword data is abundant in training data and absent from your export. Without "if a category is empty, say so" you get a plausible list either way.

Improve the page that already ranks

Worth stating on its own because the instinct runs the other way.

A page with impressions has something a new page does not: Google has crawled it, indexed it, and decided it is relevant enough to show. Adding a section to it inherits all of that. A new page starts from discovery and, on a young domain, may wait weeks to be crawled at all.

So the order is: improve the ranking page; if the intent genuinely does not belong there, write a new page and link it from the ranking one; only then consider anything else.

Search Console also tells you where a link would help. Two patterns:

An emerging query on a page that mentions the topic in passing. Link from that mention to the page that covers it properly. You are telling Google which URL is the answer.

A page with impressions that no indexed page links to. On a young site this is the constraint that matters most — a link from a page Google has already indexed is worth considerably more than one from a page it has not yet crawled. Check which of your pages are actually indexed before deciding where to add links, or you may be linking from somewhere Google has never seen.

Indexing states, read correctly

The page indexing report is where the most misreading happens. Google's own definitions are worth quoting rather than paraphrasing:

"Discovered — currently not indexed": "The page was found by Google, but not crawled yet. Typically, Google wanted to crawl the URL but this was expected to overload the site; therefore Google rescheduled the crawl."

"Crawled — currently not indexed": "The page was crawled by Google but not indexed. It may or may not be indexed in the future; no need to resubmit this URL for crawling."

Two things follow that contradict a lot of received advice. Neither state is an error, and neither is fixed by requesting indexing again. Google explicitly says no resubmission is necessary for the second. Repeated manual requests do nothing except consume your quota.

What does help: making sure the page is genuinely worth indexing, that it is reachable from pages Google has already indexed, that it is in the sitemap, self-canonical, and not accidentally noindexed. Beyond that, on a new domain, the answer is authority and patience.

Do check the mechanical causes before concluding it is patience: an unintended noindex in the rendered HTML, a canonical pointing elsewhere, a page missing from the sitemap, or a page nothing links to.

A weekly routine that survives contact

Ambitious routines get abandoned. This one takes about an hour.

When What
Monday, 15 min Pull the last 28 days. Look at totals and the coverage report. Note anything that moved by more than noise
Monday, 15 min Generate the query/page table. Pick at most three things to act on
Tue–Wed Make those three changes. One page at a time, one commit each
Wednesday Deploy. Validate the rendered result. Submit only the URLs that changed
Then Nothing. Do not look again until next Monday
Week 4–6 Compare against the window before the change

The discipline is in the last two rows. Search results move for reasons that have nothing to do with you, and checking daily converts that noise into work.

What not to do

  • Do not track daily rank movement. It is noise, and reacting to it is how pages get edited into worse shape.
  • Do not rewrite pages weekly. You destroy the ability to attribute any change to anything.
  • Do not create an article per query. That is how a site ends up with forty pages competing with each other.
  • Do not request indexing repeatedly. Google says it is unnecessary; it is also rate-limited.
  • Do not chase average position without impressions. Position 4 on a query with one impression is not an achievement.
  • Do not let an assistant invent search volume or difficulty. If the number did not come from a request, it came from nowhere.
  • Do not act on a row with under ten impressions. Write down the floor and hold to it.

Where to go next

This guide covers reading performance data. For what to check on the site itself, read the Claude Code SEO workflow; for running the audit and proving your checks can fail, the technical SEO audit; and on a storefront, Shopify SEO with Claude Code. The wider inspection is in the website audit guide, and the free short forms are the SEO checklist and website audit checklist.

The Search Console workflows here are two of twenty in the SEO & Website Audit Toolkit, sequenced against crawlability and indexation so you are not optimising metadata on URLs that are about to be canonicalised away.

Sources and further reading

Read these next

See how this fits into Claude Code SEO

Continue your learning path

  1. Next

    "Make the website faster" is not a task an agent can complete. This is the loop that works: measure, find the one bot...

  2. Then

    A migration keeps its traffic when every URL that mattered still returns 200 or redirects in one hop to its replaceme...

  3. Going deeper

    Knowing what to check is the easy half. This is the execution: writing checks that are capable of failing, four false...

The whole sequence: Claude Code SEO

Free download

The CLAUDE.md Starter Kit, free

Four working CLAUDE.md files you can drop into a project today, plus the one-page checklist for what belongs in one and how to tell whether yours is actually working.

  • CLAUDE.md for a static marketing site
  • CLAUDE.md for a web application, with security and migration rules
  • CLAUDE.md for a Shopify theme, including the gotchas that cost hours
  • CLAUDE.md for a shared package in a monorepo
  • A one-page checklist, and how to test the file is actually working
What are you working on?

The download appears here as soon as you submit. I will also email you when there is a new guide worth reading. No fixed schedule, no selling your address, unsubscribe from any email. See the privacy policy.