Claude Code and builder-marketer workflowsSearch ConsoleBy AgentSEONovember 13, 20266 min read

How to Analyze a Search Console CSV With Claude Code

Export matched query-by-page rows from Search Console, calculate CTR correctly, and use Claude Code to decide what to refresh or investigate.

Eight synthetic rows covering three queries and two finalized 28-day windows.

When clicks fall, a query total tells you which term to investigate. The query-by-page rows tell you which URL changed and which URL still serves the reader. Start there before asking Claude Code to recommend a refresh.

Export the pages that appeared for a specific query

Open Performance in Search Console and use the Search results report. Set the search type to Web, choose a country and device, then filter to the exact query. Open the Pages tab and export the report. Keep the Pages table and label each row with the query and filters you selected.

Repeat for a second finalized period with the same filters. Use two windows of the same length. The sample uses 28 days in each so weekday mix is consistent. Dates are inclusive and use Pacific time.

For a batch of queries, use the Search Analytics API with query and page in the same request. A generic export may contain a Queries table and a separate Pages table. Those are different totals and lack a key that tells you which page appeared for a query.

Search Analytics API request body for the current window
{
  "startDate": "2026-10-13",
  "endDate": "2026-11-09",
  "type": "web",
  "dataState": "final",
  "dimensions": ["query", "page"],
  "dimensionFilterGroups": [{
    "filters": [
      { "dimension": "country", "operator": "equals", "expression": "usa" },
      { "dimension": "device", "operator": "equals", "expression": "DESKTOP" }
    ]
  }],
  "rowLimit": 25000
}
Run the same request for September 15 through October 12 to reproduce the date comparison on your own property. Use an authorized Search Console credential and map each response key in order to query and page.

Work the CSV from clicks and impressions

In the sample, the guide receives 48 clicks on 1,200 impressions in the prior window and 24 on 1,200 in the current window. Divide clicks by impressions to get 4.00% and 2.00%. The change is a drop of 2.00 percentage points, or a 50% relative decline in CTR.

The template goes from 1 click on 45 impressions to 5 on 85. Its CTR is higher in the current window, but it has fewer impressions and serves a separate task. The guide's average position moved from 5.8 to 6.0. That average can hide differences across days and results, so keep the cause of the decline open.

Matched rows for “seo audit checklist”
URLPrior clicks / impressionsCurrent clicks / impressionsCTR change
/guides/seo-audit-checklist48 / 1,20024 / 1,2004.00% → 2.00% (−2.00 points)
/templates/seo-audit-checklist1 / 455 / 852.22% → 5.88% (+3.66 points)
Synthetic data. US desktop Google Web, September 15–October 12 and October 13–November 9, 2026 PT. Where rows can be combined, divide total clicks by total impressions. Query-by-page row totals may differ from property-level totals.

Give Claude the rows and page notes together

Install the starter skill, then map your export to the columns in the sample. Use one row per query, page, segment, and window. If you use your own data, give Claude a short note on what each page offers and any SERP result you actually inspected. Share files you are allowed to process with your configured Claude provider.

The archive includes the sample's calculated CTR and status values. The Python helper can produce the same comparison for your own CSV. It marks missing rows and leaves CTR blank when impressions are zero.

Compare the bundled case, then try your own export
/agentseo-claude-seo sample refresh
/agentseo-claude-seo console data/query-page.csv data/page-notes.md

Check missing rows before diagnosing cannibalization

The third practice case reports one guide in the prior period and a tool in the current period for “keyword cannibalization audit.” It provides no daily rows for either URL. An omitted row is missing evidence, so leave its CTR blank.

Pull daily query-by-page rows for both URLs, check each URL in Search Console, and inspect the current SERP under matching filters. If the pages serve different jobs, they can coexist. If comparable observations show that similarly purposed URLs repeatedly replace each other, investigate the content and internal links before choosing a remedy.

For the refresh case, the narrow next action is to add a filled example to the existing guide and check how its snippet describes the page. After the change, compare the same segment once you have a full period. Several factors can still move clicks during that time.

Keep the workflow moving

Bring one query and two comparable windows

Use the sample column layout and start with the page you already suspect needs work.

FAQ

Questions teams usually ask next

Can I join Queries.csv and Pages.csv to see which URL ranks for a query?

Those tables do not share the query-and-page key. Export the Pages table after filtering to a query or request both dimensions together through the Search Analytics API.

Does a missing Search Console row mean zero impressions?

An omitted row should be treated as unknown. Search Console can withhold sparse queries or omit rows due to limits. Keep omitted rows distinct from explicit zero values.

Should I redirect a page when two URLs appear for the same keyword?

Check whether both URLs serve the same task and whether comparable data shows repeated switching. A guide and its worksheet may both be useful destinations.

More in this topic

Claude Code and builder-marketer workflows