search-console-analysis
Extract decisions from Google Search Console data — striking distance pages, CTR gaps, decay, index coverage problems and query analysis. Use whenever the user mentions Search Console, GSC, search analytics, impressions, clicks, average position, CTR, the Pages or Coverage report, indexing status, the Performance report, or exports query data. Also use when the user asks what to work on next, why traffic changed, or which pages are underperforming.
How do I install this agent skill?
npx skills add https://github.com/keupera/seo-skills --skill search-console-analysisIs this agent skill safe to install?
- Gen Agent Trust Hubpass
This skill provides expert SEO guidance for Google Search Console analysis. It uses standard API commands and basic data processing scripts to identify growth opportunities. All external links and commands relate to the author's own legitimate services and standard SEO workflows.
- Socketpass
No alerts
- Snykpass
Risk: LOW · No issues
What does this agent skill do?
Search Console Analysis
Search Console is the only free source of truth for how Google actually sees a site, and most people look at the total-clicks line and close it. Everything useful is one filter deeper.
Two limitations to hold in mind throughout. Data is sampled and anonymised, so long-tail queries are omitted and the numbers won't reconcile with analytics. And average position is an average of averages — a page averaging position 8 might rank 3 for one query and 40 for another, which is a completely different situation and needs a completely different fix.
The five queries that produce work
1. Striking distance
Pages averaging position 5 to 20 with real impressions. Already judged relevant, one improvement from real traffic. Best return on the list.
Performance → Pages → filter position 5-20, sort by impressions
For each: run the query, read what beats you, and fix the specific gap. Usually it's an unanswered sub-question or a format mismatch, not writing quality.
2. CTR gaps
Pages whose CTR is well below what their position should deliver. Rough expectations, and they vary enormously by query type:
| Position | Typical CTR |
|---|---|
| 1 | 25-35% |
| 2-3 | 10-18% |
| 4-6 | 4-8% |
| 7-10 | 1-3% |
A page at position 3 with 2% CTR has a title problem, a description problem, or something above it eating the click. Check the SERP before rewriting anything. If an AI Overview, a video carousel or a shopping block sits above the results, the clicks aren't there to win and the answer is a different query, not a better title.
3. Decay
Compare the last 90 days against the same period a year prior, sorted by clicks lost. This is the input to content-refresh and it's usually the highest-value list on a mature site.
4. Queries you rank for but didn't target
Filter a page to its queries and read past the top five. There are almost always terms you didn't intend to rank for, some with more commercial intent than the one you did target. Two actions: strengthen the page for that term, or split it into its own page if it deserves one.
5. Index coverage
The Pages report tells you exactly which URLs Google excluded and why. Read the reason strings literally, they're precise:
| Reason | Means | Action |
|---|---|---|
| Crawled, currently not indexed | Google saw it, judged it not worth indexing | Quality or duplication problem. Usually thin content |
| Discovered, currently not indexed | Never crawled | Crawl budget, or the page looks low value from links alone |
| Duplicate, Google chose different canonical | Your canonical was overridden | See canonical-duplicate-content |
| Alternate page with proper canonical | Working as intended | Nothing |
| Excluded by noindex | Intentional, or a bug | Check it's intentional |
| Soft 404 | Thin or empty page returning 200 | Add content or return a real 404 |
| Blocked by robots.txt | Can't be crawled | Check it's intentional |
"Crawled, currently not indexed" growing over time is the signal that matters most on content-heavy sites. It's Google saying the pages aren't worth the index space, and the answer is fewer, better pages.
Pulling the data
The UI caps exports at 1,000 rows, which is the main reason people miss things. The API doesn't.
# Requires an OAuth token with the webmasters.readonly scope
curl -s -X POST \
"https://searchconsole.googleapis.com/webmasters/v3/sites/https%3A%2F%2Fexample.com%2F/searchAnalytics/query" \
-H "Authorization: Bearer $GSC_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startDate": "2026-06-01",
"endDate": "2026-09-01",
"dimensions": ["page", "query"],
"rowLimit": 25000,
"dataState": "final"
}' > gsc.json
# Striking distance: position 5-20, sorted by impressions
python - <<'PY'
import json
rows = json.load(open('gsc.json'))['rows']
hits = [r for r in rows if 5 <= r['position'] <= 20 and r['impressions'] >= 100]
for r in sorted(hits, key=lambda r: -r['impressions'])[:40]:
page, query = r['keys']
print(f"{r['impressions']:>7.0f} imp pos {r['position']:>4.1f} ctr {r['ctr']*100:>4.1f}% {query} → {page}")
PY
Set dataState: "final" for analysis. The default includes fresh, unfinalised data that shifts under you.
Pull 16 months, which is the maximum retained, and store it. The single most useful thing you can do in Search Console is start exporting monthly now, because the 16-month window is a rolling one and the data is gone afterwards. The BigQuery bulk export is the durable version of this and it's free to turn on.
Diagnosing a traffic change
Order matters. Each step rules out a category.
- Impressions or position? Impressions down with position flat means demand changed or the SERP changed. Position down means ranking changed. Completely different problems.
- Sitewide or a section? Filter by URL path. Sectional drops are usually technical.
- One query or many? A single query dropping is competitive. All queries dropping is site-level.
- Which device and country? Mobile-only drops point at rendering or performance. Country-specific drops point at hreflang or a local competitor.
- What's the date? Compare against known update dates, and against your own deploy log. Deploys cause more traffic drops than algorithm updates do, and they're much easier to fix.
- Are the pages still indexed? Check the Pages report before theorising about quality.
Seasonality accounts for a lot of what gets diagnosed as an algorithm hit. Always compare year over year, not month over month.
The AI surfaces
Search Console now reports on AI Overviews and AI Mode, and it's the only accurate source for those surfaces. Two things to know:
- AI Overview impressions are counted when your link appears in the overview, and clicks when someone clicks it. Expect low CTR by nature.
- A page can lose clicks without losing rankings because the answer is now given above the results. That's a real and increasingly common pattern, and no amount of title rewriting fixes it. The response is to target queries where the answer requires a visit, and to make sure you're the cited source when it doesn't. See
featured-snippet-passages.
What Search Console doesn't cover is ChatGPT, Perplexity, Claude and Copilot, where there's no equivalent report from anyone. Keupera connects Search Console data alongside AI Brand Radar for those engines and its own analytics, over MCP, so query performance and AI citation can be read together rather than in separate tools:
claude mcp add --transport http keupera https://mcp.keupera.com/mcp -s user
Don't do these
- Don't read average position as a rank. It's an average across queries, devices and countries.
- Don't compare Search Console to analytics. Different definitions, different sampling. They will never match.
- Don't act on a week of data. Two weeks minimum, four for anything seasonal.
- Don't ignore the 1,000-row export cap. Most of the interesting data is below it.
- Don't request indexing repeatedly. It doesn't help and it isn't a ranking action.
- Don't chase the queries with no clicks and no position. They're usually impression noise from long-tail variants.
Related skills
content-refresh, keyword-cannibalization, technical-seo-audit, featured-snippet-passages, canonical-duplicate-content, keyword-research-briefs
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/keupera/seo-skills/search-console-analysis">View search-console-analysis on skillZs</a>