Google Search Console optimization. Index coverage, performance analysis, sitemap management, and search appearance debugging.
Verify ownership via DNS TXT record (most reliable):
google-site-verification=XXXXXXXXXXXXXXXX
Alternatives: HTML file upload, HTML meta tag, Google Analytics, Google Tag Manager.
Add both versions:
https://example.com (URL prefix) — for specific path filteringexample.com (Domain) — for comprehensive data including subdomainsNavigate to Pages → Indexing to review status:
| Status | Meaning | Action |
|---|---|---|
| Valid | Indexed, no issues | Monitor |
| Valid with warnings | Indexed but has issues | Fix warnings |
| Excluded | Not indexed (intentional or not) | Review each reason |
| Error | Cannot index, wants to | Fix immediately |
Common exclusion reasons and fixes:
| Reason | Fix |
|---|---|
| Crawled - currently not indexed | Improve content quality, add internal links |
| Discovered - currently not indexed | Submit in sitemap, build backlinks, wait |
| Excluded by noindex tag | Remove noindex if page should be indexed |
| Alternate page with proper canonical | Expected for canonical dedup — verify canonical is correct |
| Blocked by robots.txt | Update robots.txt if page should be crawled |
| Duplicate without user-selected canonical | Set explicit canonical tag |
| Soft 404 | Add real content or return proper 404 status |
Key metrics: impressions, clicks, CTR, average position.
Analysis by query cluster:
| Position | Expected CTR |
|---|---|
| 1 | 25-35% |
| 2 | 12-18% |
| 3 | 8-12% |
| 4-5 | 5-8% |
| 6-10 | 2-5% |
If actual CTR < expected: Title/description needs optimization. If actual CTR > expected: Strong snippet — protect this content.
Quick wins — filter for:
Submit at Sitemaps → Add a new sitemap:
https://example.com/sitemap.xml
Sitemap audit checklist:
<lastmod> dates are accurate (not auto-generated today's date)Check Page Experience → Core Web Vitals:
| Metric | Good | Needs Improvement | Poor |
|---|---|---|---|
| LCP (Largest Contentful Paint) | ≤ 2.5s | ≤ 4.0s | > 4.0s |
| INP (Interaction to Next Paint) | ≤ 200ms | ≤ 500ms | > 500ms |
| CLS (Cumulative Layout Shift) | ≤ 0.1 | ≤ 0.25 | > 0.25 |
Debugging workflow:
Common fixes:
requestIdleCallbackUse URL Inspection tool to:
API access for bulk inspection:
from googleapiclient.discovery import build
service = build('searchconsole', 'v1', credentials=creds)
request = {
'inspectionUrl': 'https://example.com/page',
'siteUrl': 'https://example.com'
}
response = service.urlInspection().index().inspect(body=request).execute()
print(response['inspectionResult']['indexStatusResult']['coverageState'])
Check Enhancements section for structured data issues:
Validation workflow:
Common schema errors:
aggregateRating without reviewCount)2025-01-15)Title tag formula: Primary Keyword — Benefit | Brand (under 60 chars)
Meta description: Include primary keyword, CTA, value prop (under 155 chars)
Test changes: