GEO Technical SEO Audit

Technical SEO audit with GEO-specific checks — crawlability, indexability, security, performance, SSR, and AI crawler access

How to use it

  1. Hit Copy SKILL.md — or use the Claude Code line below to get every file.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit zubair-trabzada/geo-seo-claude/skills/geo-technical#main ~/.claude/skills/geo-technical

For one project only, change the path to .claude/skills/geo-technical. This skill also uses robots.txt, GEO-TECHNICAL-AUDIT.md, Next.js, Nuxt.js — copying SKILL.md alone won't be enough. See the folder on GitHub.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text533 lines
geo-technical/SKILL.md533 lines22.2 KBpushed 131d agoRawView on GitHub

GEO Technical SEO Audit

Purpose

Technical SEO forms the foundation of both traditional search visibility and AI search citation. A technically broken site cannot be crawled, indexed, or cited by any platform. This skill audits 8 categories of technical health with specific attention to GEO requirements — most critically, server-side rendering (AI crawlers do not execute JavaScript) and AI crawler access (many sites inadvertently block AI crawlers in robots.txt).

How to Use This Skill

  1. Collect the target URL (homepage + 2-3 key inner pages)
  2. Fetch each page using curl/WebFetch to get raw HTML and HTTP headers
  3. Run through each of the 8 audit categories below
  4. Score each category using the rubric
  5. Generate GEO-TECHNICAL-AUDIT.md with results

Category 1: Crawlability (15 points)

1.1 robots.txt Validity

  • Fetch https://[domain]/robots.txt
  • Check for syntactic validity: proper User-agent, Allow, Disallow directives
  • Check for common errors: missing User-agent, wildcards blocking important paths, Disallow: / blocking entire site
  • Verify XML sitemap is referenced: Sitemap: https://[domain]/sitemap.xml

1.2 AI Crawler Access (CRITICAL for GEO)

Check robots.txt for directives targeting these AI crawlers:

Crawler User-Agent Platform
GPTBot GPTBot ChatGPT / OpenAI
Google-Extended Google-Extended Gemini / Google AI training
Googlebot Googlebot Google Search + AI Overviews
Bingbot bingbot Bing Copilot + ChatGPT (via Bing)
PerplexityBot PerplexityBot Perplexity AI
ClaudeBot ClaudeBot Anthropic Claude
Amazonbot Amazonbot Alexa / Amazon AI
CCBot CCBot Common Crawl (used by many AI models)
FacebookBot FacebookExternalHit Meta AI
Bytespider Bytespider TikTok / ByteDance AI
Applebot-Extended Applebot-Extended Apple Intelligence

Scoring for AI crawler access:

  • All major AI crawlers allowed: 5 points
  • Some blocked but Googlebot + Bingbot allowed: 3 points
  • GPTBot or PerplexityBot blocked: 1 point (significant GEO impact)
  • Googlebot blocked: 0 points (fatal)

Important nuance: Blocking Google-Extended does NOT block Googlebot. Google-Extended only controls AI training data usage, not search indexing. However, blocking Google-Extended may reduce presence in AI Overviews. Recommend allowing Google-Extended unless there is a specific data licensing concern.

1.3 XML Sitemaps

  • Fetch sitemap (check robots.txt for location, or try /sitemap.xml, /sitemap_index.xml)
  • Validate XML syntax
  • Check for <lastmod> dates (should be present and accurate)
  • Count URLs — compare to expected number of indexable pages
  • Check for sitemap index if large site (50,000+ URLs per sitemap max)
  • Verify all sitemap URLs return 200 status codes (sample check)

1.4 Crawl Depth

  • Homepage = depth 0. Check that all important pages are reachable within 3 clicks (depth 3)
  • Pages at depth 4+ receive significantly less crawl budget and are less likely to be cited by AI
  • Check internal linking: are key content pages linked from the homepage or main navigation?

1.5 Noindex Management

  • Check for <meta name="robots" content="noindex"> on pages that SHOULD be indexed
  • Check for X-Robots-Tag: noindex HTTP headers
  • Common mistakes: noindex on paginated pages, category pages, or key landing pages

Category Scoring:

Check Points
robots.txt valid and complete 3
AI crawlers allowed 5
XML sitemap present and valid 3
Crawl depth within 3 clicks 2
No erroneous noindex directives 2

Category 2: Indexability (12 points)

2.1 Canonical Tags

  • Every indexable page must have a <link rel="canonical" href="..."> tag
  • Canonical must point to itself (self-referencing) for the authoritative version
  • Check for conflicting canonicals (canonical in HTML vs. HTTP header)
  • Check for canonical chains (A canonicals to B, B canonicals to C — should be A to C)

2.2 Duplicate Content

  • Check for www vs. non-www (both should resolve, one should redirect)
  • Check for HTTP vs. HTTPS (HTTP should redirect to HTTPS)
  • Check for trailing slash consistency (pick one pattern and redirect the other)
  • Check for parameter-based duplicates (?sort=price creating duplicate pages)

2.3 Pagination

  • If paginated content exists, check for rel="next" / rel="prev" (note: Google ignores these as of 2019, but Bing still uses them)
  • Preferred: use rel="canonical" on paginated pages pointing to a view-all page or the first page
  • Ensure paginated pages are not noindexed if they contain unique content

2.4 Hreflang (international sites)

  • Check for <link rel="alternate" hreflang="xx"> tags
  • Validate: reciprocal hreflang (if page A points to page B, B must point back to A)
  • Validate: x-default fallback exists
  • Check for language/region code validity (ISO 639-1 / ISO 3166-1)

2.5 Index Bloat

  • Estimate number of indexed pages (check sitemap count, use site:domain.com estimate)
  • Compare indexed pages to actual valuable content pages
  • Flag if indexed pages significantly exceed content pages (index bloat from thin/duplicate/parameter pages)

Category Scoring:

Check Points
Canonical tags correct on all pages 3
No duplicate content issues 3
Pagination handled correctly 2
Hreflang correct (if applicable) 2
No index bloat 2

Category 3: Security (10 points)

3.1 HTTPS Enforcement

  • Site must load over HTTPS
  • HTTP must redirect to HTTPS (301 redirect)
  • No mixed content warnings (HTTP resources on HTTPS pages)
  • SSL/TLS certificate must be valid and not expired

3.2 Security Headers

Check HTTP response headers for:

Header Required Value Purpose
Strict-Transport-Security max-age=31536000; includeSubDomains Forces HTTPS
Content-Security-Policy Appropriate policy Prevents XSS
X-Content-Type-Options nosniff Prevents MIME sniffing
X-Frame-Options DENY or SAMEORIGIN Prevents clickjacking
Referrer-Policy strict-origin-when-cross-origin or stricter Controls referrer data
Permissions-Policy Appropriate restrictions Controls browser features

Category Scoring:

Check Points
HTTPS enforced with valid cert 4
HSTS header present 2
X-Content-Type-Options 1
X-Frame-Options 1
Referrer-Policy 1
Content-Security-Policy 1

Category 4: URL Structure (8 points)

4.1 Clean URLs

  • URLs should be human-readable: /blog/seo-guide not /blog?id=12345
  • No session IDs in URLs
  • Lowercase only (no mixed case)
  • Hyphens for word separation (not underscores)
  • No special characters or encoded spaces

4.2 Logical Hierarchy

  • URL path should reflect site architecture: /category/subcategory/page
  • Flat where appropriate — avoid unnecessarily deep nesting
  • Consistent pattern across the site

4.3 Redirect Chains

  • Check for redirect chains (A redirects to B redirects to C)
  • Maximum 1 hop recommended (A redirects to C directly)
  • Check for redirect loops
  • All redirects should be 301 (permanent), not 302 (temporary), unless intentionally temporary

4.4 Parameter Handling

  • URL parameters should not create duplicate indexable pages
  • Use canonical tags or robots.txt Disallow for parameter variations
  • Configure parameter handling in Google Search Console and Bing Webmaster Tools

Category Scoring:

Check Points
Clean, readable URLs 2
Logical hierarchy 2
No redirect chains (max 1 hop) 2
Parameter handling configured 2

Category 5: Mobile Optimization (10 points)

Critical Context

As of July 2024, Google crawls ALL sites exclusively with mobile Googlebot. There is no desktop crawling. If your site does not work on mobile, it does not work for Google. Period.

5.1 Responsive Design

  • Check for <meta name="viewport" content="width=device-width, initial-scale=1">
  • Content must not require horizontal scrolling on mobile
  • No fixed-width layouts wider than viewport

5.2 Tap Targets

  • Interactive elements (buttons, links) must be at least 48x48 CSS pixels
  • Minimum 8px spacing between tap targets
  • Check that navigation is usable on mobile

5.3 Font Sizes

  • Base font size should be at least 16px
  • No text requiring zoom to read
  • Sufficient contrast ratio (WCAG AA: 4.5:1 for normal text, 3:1 for large text)

5.4 Mobile Content Parity

  • All content visible on desktop must also be visible on mobile
  • No hidden content behind "read more" toggles that Googlebot cannot expand (though Google has improved at expanding these as of 2025)
  • Images and media must load on mobile

Category Scoring:

Check Points
Viewport meta tag correct 3
Responsive layout (no horizontal scroll) 3
Tap targets appropriately sized 2
Font sizes legible 2

Category 6: Core Web Vitals (15 points)

2026 Metrics and Thresholds

Core Web Vitals use the 75th percentile of real user data (field data) as the benchmark. Lab data is useful for debugging but field data determines the ranking signal.

Metric Good Needs Improvement Poor Notes
LCP (Largest Contentful Paint) < 2.5s 2.5s - 4.0s > 4.0s Measures loading — time until largest visible element renders
INP (Interaction to Next Paint) < 200ms 200ms - 500ms > 500ms Replaced FID in March 2024. Measures ALL interactions, not just first
CLS (Cumulative Layout Shift) < 0.1 0.1 - 0.25 > 0.25 Measures visual stability — unexpected layout movements

How to Assess Without CrUX Data

When real user data is unavailable, estimate from page characteristics:

  • LCP: Check largest above-fold element. Is it an image (check size/format)? Is it text (check web font loading)? Server response time (TTFB)?
  • INP: Check for heavy JavaScript on page. Long tasks (>50ms) block interactivity. Check for third-party scripts.
  • CLS: Check for images without explicit width/height. Check for dynamically inserted content above the fold. Check for web fonts causing layout shift (FOUT/FOIT).

Common LCP Fixes

  1. Optimize hero images: WebP/AVIF format, correct sizing, preload with <link rel="preload">
  2. Reduce server response time (TTFB < 800ms)
  3. Eliminate render-blocking CSS/JS
  4. Preconnect to critical third-party origins

Common INP Fixes

  1. Break up long tasks (>50ms) into smaller chunks using requestIdleCallback or scheduler.yield()
  2. Reduce third-party JavaScript
  3. Use content-visibility: auto for off-screen content
  4. Debounce/throttle event handlers

Common CLS Fixes

  1. Always include width and height attributes on images and videos
  2. Reserve space for ads and embeds with CSS aspect-ratio or explicit dimensions
  3. Use font-display: swap with size-adjusted fallback fonts
  4. Avoid inserting content above existing content after page load

Category Scoring:

Check Points
LCP < 2.5s 5
INP < 200ms 5
CLS < 0.1 5

Category 7: Server-Side Rendering (15 points) — CRITICAL FOR GEO

Why SSR Is Mandatory for AI Visibility

AI crawlers (GPTBot, PerplexityBot, ClaudeBot, etc.) do NOT execute JavaScript. They fetch the raw HTML and parse it. If your content is rendered client-side by React, Vue, Angular, or any other JavaScript framework, AI crawlers see an empty page.

Even Googlebot, which does execute JavaScript, deprioritizes JS-rendered content due to the additional crawl budget required. Google processes JS rendering in a separate "rendering queue" that can delay indexing by days or weeks.

Detection Method

  1. Fetch the page with curl (no JavaScript execution): curl -s [URL]
  2. Compare the raw HTML to the rendered DOM (via browser)
  3. If key content (headings, paragraphs, product info, article text) is MISSING from the curl output, the site relies on client-side rendering

What to Check

  • Main content text: Is the article body / product description / page content in the raw HTML?
  • Headings: Are H1, H2, H3 tags present in raw HTML?
  • Navigation: Is the main navigation server-rendered?
  • Structured data: Is JSON-LD in the raw HTML or injected by JavaScript?
  • Meta tags: Are title, description, canonical, OG tags in the raw HTML?
  • Internal links: Are navigation and content links in the raw HTML? (Critical for crawlability)

SSR Solutions to Recommend

Framework SSR Solution
React Next.js (SSR/SSG), Remix, Gatsby (SSG)
Vue Nuxt.js (SSR/SSG)
Angular Angular Universal
Svelte SvelteKit
Generic Prerender.io (prerendering service), Rendertron

Scoring Detail

  • All key content server-rendered: 15 points
  • Main content server-rendered but some elements JS-only: 10 points
  • Critical content requires JS (product info, article text): 5 points
  • Entire page is client-rendered (empty body in raw HTML): 0 points

Category Scoring:

Check Points
Main content in raw HTML 8
Meta tags + structured data in raw HTML 4
Internal links in raw HTML 3

Category 8: Page Speed & Server Performance (15 points)

8.1 Time to First Byte (TTFB)

  • Target: < 800ms (ideally < 200ms)
  • Measure with curl: curl -o /dev/null -s -w 'TTFB: %{time_starttransfer}s\n' [URL]
  • If TTFB > 800ms: check server location, caching, database queries, CDN usage

8.2 Resource Optimization

  • Total page weight target: < 2MB (critical pages < 1MB)
  • Check for uncompressed resources (gzip/brotli compression should be enabled)
  • Check for unminified CSS and JavaScript
  • Check for unused CSS/JS (can represent 50%+ of downloaded bytes on many sites)

8.3 Image Optimization

  • Check image formats: WebP or AVIF preferred over JPEG/PNG
  • Check for oversized images (images larger than display size)
  • Check for lazy loading: images below fold should have loading="lazy"
  • Check for explicit dimensions (width/height attributes prevent CLS)
  • Above-fold images should NOT be lazy loaded (harms LCP)

8.4 Code Splitting and Lazy Loading

  • JavaScript should be code-split so each page only loads what it needs
  • Check for large JavaScript bundles (> 200KB compressed is a warning, > 500KB is critical)
  • Third-party scripts should load asynchronously (async or defer)
  • Check for render-blocking resources in <head>

8.5 Caching

  • Check Cache-Control headers on static resources (images, CSS, JS)
  • Static assets should have long cache times: max-age=31536000 (1 year) with content-hashed filenames
  • HTML pages should have shorter cache or no-cache with validation (ETag or Last-Modified)

8.6 CDN Usage

  • Check if static resources are served from a CDN (different domain or CDN-specific headers)
  • For global audience, CDN is critical for consistent performance
  • Check for CDN-specific headers: CF-Ray (Cloudflare), X-Cache (AWS CloudFront), X-Served-By (Fastly)

Category Scoring:

Check Points
TTFB < 800ms 3
Page weight < 2MB 2
Images optimized (format, size, lazy) 3
JS bundles reasonable (< 200KB compressed) 2
Compression enabled (gzip/brotli) 2
Cache headers on static resources 2
CDN in use 1

Category 9: Agent-Readiness Signals (non-scoring)

These checks surface emerging AI agent compatibility signals. None contribute to the numeric score — they produce a pass or a recommendation. The underlying standards are either IETF drafts or early-adoption features; penalizing absence would be unfair.

9.1 RFC 8288 Link Headers (Service Discovery)

RFC 8288 (Web Linking) defines the HTTP Link: response header. Servers can use it to advertise related resources — API catalog, service docs, MCP server card — in a machine-readable way, without HTML parsing.

How to check: Capture all Link: response headers from the standard homepage fetch (no extra request).

What to look for:

  • Parse <url>; rel="relation-type" pairs.
  • High-value rel types: api-catalog (RFC 9609), describedby, service-doc, mcp-server-card.

When to surface a recommendation: Only for API-first sites (API docs linked in nav, /api/ or /developers/ paths, swagger/OpenAPI in sitemap). Omit this section entirely for standard business sites — absence is expected and not noteworthy.

State Treatment
Link: headers present, known rel types Informational — document what was found
Link: headers present, unknown rel types Informational — note and explain
Absent, API-first site Recommendation — explain and suggest implementation
Absent, standard business site Omit — do not surface

9.2 Markdown Content Negotiation

Checks if the server responds to Accept: text/markdown with Content-Type: text/markdown. Cloudflare's "Markdown for Agents" feature enables this — AI agents receive clean Markdown instead of HTML, eliminating boilerplate stripping and improving content extraction accuracy.

How to check: Send a GET to the homepage with Accept: text/markdown. This is one additional HTTP request per audit.

Evaluation:

  • If response Content-Type is text/markdown (or text/markdown; charset=utf-8): pass — note as a leading-edge capability.
  • Otherwise: forward-looking recommendation, not a failure.
  • If the request errors or returns non-200: skip and note the error. Do not penalize.
State Treatment
text/markdown returned Bonus — note as a leading-edge capability
Standard HTML returned Forward-looking recommendation
Request errors / non-200 Skip, note the error, do not penalize

IndexNow Protocol

What It Is

IndexNow is an open protocol that allows websites to notify search engines instantly when content is created, updated, or deleted. Supported by Bing, Yandex, Seznam, and Naver. Google does NOT support IndexNow but monitors the protocol.

Why It Matters for GEO

ChatGPT uses Bing's index. Bing Copilot uses Bing's index. Faster Bing indexing means faster AI visibility on two major platforms.

Implementation Check

  1. Check for IndexNow key file: https://[domain]/.well-known/indexnow-key.txt or similar
  2. Check if CMS has IndexNow plugin (WordPress: IndexNow plugin; many modern CMS platforms support it natively)
  3. If not implemented, recommend adding it with instructions

Overall Scoring

Category Max Points Weight
Crawlability 15 Core foundation
Indexability 12 Core foundation
Security 10 Trust signal
URL Structure 8 Crawl efficiency
Mobile Optimization 10 Google requirement
Core Web Vitals 15 Ranking signal
Server-Side Rendering 15 GEO critical
Page Speed & Server 15 Performance
Total 100

Non-scoring checks (Category 9) appear in the output under "Agent-Readiness Signals" and do not affect this total.

Score Interpretation

  • 90-100: Excellent — technically sound for both traditional SEO and GEO
  • 70-89: Good — minor issues to address but fundamentally solid
  • 50-69: Needs Work — significant technical debt impacting visibility
  • 30-49: Poor — major issues blocking crawling, indexing, or AI visibility
  • 0-29: Critical — fundamental technical failures requiring immediate attention

Output Format

Generate GEO-TECHNICAL-AUDIT.md with:

# GEO Technical SEO Audit — [Domain]
Date: [Date]

## Technical Score: XX/100

## Score Breakdown
| Category | Score | Status |
|---|---|---|
| Crawlability | XX/15 | Pass/Warn/Fail |
| Indexability | XX/12 | Pass/Warn/Fail |
| Security | XX/10 | Pass/Warn/Fail |
| URL Structure | XX/8 | Pass/Warn/Fail |
| Mobile Optimization | XX/10 | Pass/Warn/Fail |
| Core Web Vitals | XX/15 | Pass/Warn/Fail |
| Server-Side Rendering | XX/15 | Pass/Warn/Fail |
| Page Speed & Server | XX/15 | Pass/Warn/Fail |

Status: Pass = 80%+ of category points, Warn = 50-79%, Fail = <50%

## AI Crawler Access
| Crawler | User-Agent | Status | Recommendation |
|---|---|---|---|
| GPTBot | GPTBot | Allowed/Blocked | [Action] |
| Googlebot | Googlebot | Allowed/Blocked | [Action] |
[Continue for all AI crawlers]

## Critical Issues (fix immediately)
[List with specific page URLs and what is wrong]

## Warnings (fix this month)
[List with details]

## Recommendations (optimize this quarter)
[List with details]

## Agent-Readiness Signals (non-scoring)

### RFC 8288 Link Headers (Service Discovery)

**Status:** Present / Absent / Not Applicable

<!-- If present: -->
| Relation Type | URL | Meaning |
|---|---|---|
| api-catalog | /.well-known/api-catalog | Machine-readable index of available APIs |
| mcp-server-card | /.well-known/mcp.json | MCP server capability declaration |

AI agents and API clients can discover your services without parsing HTML.

<!-- If absent, API-first site only: -->
**Informational Recommendation:** This site has API/developer-oriented content but no `Link:` headers advertising discoverable services.

Example: `Link: </.well-known/api-catalog>; rel="api-catalog"`

Relevant for: sites with public APIs, OpenAPI docs, or MCP server integrations.
Reference: RFC 8288, RFC 9609.

<!-- If absent, standard business site: omit this section entirely -->

### Markdown Content Negotiation

**Status:** Supported / Not Supported
**Test:** GET [url] with `Accept: text/markdown`
**Response Content-Type:** [value]

<!-- If supported: -->
This site serves clean Markdown to AI agents on request. AI crawlers that support content negotiation receive formatted text without HTML boilerplate.

<!-- If not supported: -->
**Forward-Looking Recommendation:** Cloudflare Workers/Pages sites can enable Markdown content negotiation with a one-line configuration change. When an AI agent sends `Accept: text/markdown`, the server responds with clean Markdown instead of HTML.

- Currently Cloudflare-specific
- Relevant for: sites already on Cloudflare infrastructure
- Other CDNs and frameworks expected to adopt this pattern as AI agent traffic grows

## Detailed Findings
[Per-category breakdown with evidence]
1---
2name: geo-technical
3description: Technical SEO audit with GEO-specific checks — crawlability, indexability, security, performance, SSR, and AI crawler access
4version: 1.0.0
5author: geo-seo-claude
6tags: [geo, technical-seo, core-web-vitals, ssr, crawlability, security, performance]
7allowed-tools: Read, Grep, Glob, Bash, WebFetch, Write
8---
9 
10# GEO Technical SEO Audit
11 
12## Purpose
13 
14Technical SEO forms the foundation of both traditional search visibility and AI search citation. A technically broken site cannot be crawled, indexed, or cited by any platform. This skill audits 8 categories of technical health with specific attention to GEO requirements — most critically, **server-side rendering** (AI crawlers do not execute JavaScript) and **AI crawler access** (many sites inadvertently block AI crawlers in robots.txt).
15 
16## How to Use This Skill
17 
181. Collect the target URL (homepage + 2-3 key inner pages)
192. Fetch each page using curl/WebFetch to get raw HTML and HTTP headers
203. Run through each of the 8 audit categories below
214. Score each category using the rubric
225. Generate GEO-TECHNICAL-AUDIT.md with results
23 
24---
25 
26## Category 1: Crawlability (15 points)
27 
28### 1.1 robots.txt Validity
29- Fetch `https://[domain]/robots.txt`
30- Check for syntactic validity: proper `User-agent`, `Allow`, `Disallow` directives
31- Check for common errors: missing User-agent, wildcards blocking important paths, Disallow: / blocking entire site
32- Verify XML sitemap is referenced: `Sitemap: https://[domain]/sitemap.xml`
33 
34### 1.2 AI Crawler Access (CRITICAL for GEO)
35Check robots.txt for directives targeting these AI crawlers:
36 
37| Crawler | User-Agent | Platform |
38|---|---|---|
39| GPTBot | GPTBot | ChatGPT / OpenAI |
40| Google-Extended | Google-Extended | Gemini / Google AI training |
41| Googlebot | Googlebot | Google Search + AI Overviews |
42| Bingbot | bingbot | Bing Copilot + ChatGPT (via Bing) |
43| PerplexityBot | PerplexityBot | Perplexity AI |
44| ClaudeBot | ClaudeBot | Anthropic Claude |
45| Amazonbot | Amazonbot | Alexa / Amazon AI |
46| CCBot | CCBot | Common Crawl (used by many AI models) |
47| FacebookBot | FacebookExternalHit | Meta AI |
48| Bytespider | Bytespider | TikTok / ByteDance AI |
49| Applebot-Extended | Applebot-Extended | Apple Intelligence |
50 
51**Scoring for AI crawler access:**
52- All major AI crawlers allowed: 5 points
53- Some blocked but Googlebot + Bingbot allowed: 3 points
54- GPTBot or PerplexityBot blocked: 1 point (significant GEO impact)
55- Googlebot blocked: 0 points (fatal)
56 
57**Important nuance**: Blocking Google-Extended does NOT block Googlebot. Google-Extended only controls AI training data usage, not search indexing. However, blocking Google-Extended may reduce presence in AI Overviews. Recommend allowing Google-Extended unless there is a specific data licensing concern.
58 
59### 1.3 XML Sitemaps
60- Fetch sitemap (check robots.txt for location, or try `/sitemap.xml`, `/sitemap_index.xml`)
61- Validate XML syntax
62- Check for `<lastmod>` dates (should be present and accurate)
63- Count URLs — compare to expected number of indexable pages
64- Check for sitemap index if large site (50,000+ URLs per sitemap max)
65- Verify all sitemap URLs return 200 status codes (sample check)
66 
67### 1.4 Crawl Depth
68- Homepage = depth 0. Check that all important pages are reachable within **3 clicks** (depth 3)
69- Pages at depth 4+ receive significantly less crawl budget and are less likely to be cited by AI
70- Check internal linking: are key content pages linked from the homepage or main navigation?
71 
72### 1.5 Noindex Management
73- Check for `<meta name="robots" content="noindex">` on pages that SHOULD be indexed
74- Check for `X-Robots-Tag: noindex` HTTP headers
75- Common mistakes: noindex on paginated pages, category pages, or key landing pages
76 
77**Category Scoring:**
78| Check | Points |
79|---|---|
80| robots.txt valid and complete | 3 |
81| AI crawlers allowed | 5 |
82| XML sitemap present and valid | 3 |
83| Crawl depth within 3 clicks | 2 |
84| No erroneous noindex directives | 2 |
85 
86---
87 
88## Category 2: Indexability (12 points)
89 
90### 2.1 Canonical Tags
91- Every indexable page must have a `<link rel="canonical" href="...">` tag
92- Canonical must point to itself (self-referencing) for the authoritative version
93- Check for conflicting canonicals (canonical in HTML vs. HTTP header)
94- Check for canonical chains (A canonicals to B, B canonicals to C — should be A to C)
95 
96### 2.2 Duplicate Content
97- Check for www vs. non-www (both should resolve, one should redirect)
98- Check for HTTP vs. HTTPS (HTTP should redirect to HTTPS)
99- Check for trailing slash consistency (pick one pattern and redirect the other)
100- Check for parameter-based duplicates (`?sort=price` creating duplicate pages)
101 
102### 2.3 Pagination
103- If paginated content exists, check for `rel="next"` / `rel="prev"` (note: Google ignores these as of 2019, but Bing still uses them)
104- Preferred: use `rel="canonical"` on paginated pages pointing to a view-all page or the first page
105- Ensure paginated pages are not noindexed if they contain unique content
106 
107### 2.4 Hreflang (international sites)
108- Check for `<link rel="alternate" hreflang="xx">` tags
109- Validate: reciprocal hreflang (if page A points to page B, B must point back to A)
110- Validate: x-default fallback exists
111- Check for language/region code validity (ISO 639-1 / ISO 3166-1)
112 
113### 2.5 Index Bloat
114- Estimate number of indexed pages (check sitemap count, use `site:domain.com` estimate)
115- Compare indexed pages to actual valuable content pages
116- Flag if indexed pages significantly exceed content pages (index bloat from thin/duplicate/parameter pages)
117 
118**Category Scoring:**
119| Check | Points |
120|---|---|
121| Canonical tags correct on all pages | 3 |
122| No duplicate content issues | 3 |
123| Pagination handled correctly | 2 |
124| Hreflang correct (if applicable) | 2 |
125| No index bloat | 2 |
126 
127---
128 
129## Category 3: Security (10 points)
130 
131### 3.1 HTTPS Enforcement
132- Site must load over HTTPS
133- HTTP must redirect to HTTPS (301 redirect)
134- No mixed content warnings (HTTP resources on HTTPS pages)
135- SSL/TLS certificate must be valid and not expired
136 
137### 3.2 Security Headers
138Check HTTP response headers for:
139 
140| Header | Required Value | Purpose |
141|---|---|---|
142| `Strict-Transport-Security` | `max-age=31536000; includeSubDomains` | Forces HTTPS |
143| `Content-Security-Policy` | Appropriate policy | Prevents XSS |
144| `X-Content-Type-Options` | `nosniff` | Prevents MIME sniffing |
145| `X-Frame-Options` | `DENY` or `SAMEORIGIN` | Prevents clickjacking |
146| `Referrer-Policy` | `strict-origin-when-cross-origin` or stricter | Controls referrer data |
147| `Permissions-Policy` | Appropriate restrictions | Controls browser features |
148 
149**Category Scoring:**
150| Check | Points |
151|---|---|
152| HTTPS enforced with valid cert | 4 |
153| HSTS header present | 2 |
154| X-Content-Type-Options | 1 |
155| X-Frame-Options | 1 |
156| Referrer-Policy | 1 |
157| Content-Security-Policy | 1 |
158 
159---
160 
161## Category 4: URL Structure (8 points)
162 
163### 4.1 Clean URLs
164- URLs should be human-readable: `/blog/seo-guide` not `/blog?id=12345`
165- No session IDs in URLs
166- Lowercase only (no mixed case)
167- Hyphens for word separation (not underscores)
168- No special characters or encoded spaces
169 
170### 4.2 Logical Hierarchy
171- URL path should reflect site architecture: `/category/subcategory/page`
172- Flat where appropriate — avoid unnecessarily deep nesting
173- Consistent pattern across the site
174 
175### 4.3 Redirect Chains
176- Check for redirect chains (A redirects to B redirects to C)
177- Maximum 1 hop recommended (A redirects to C directly)
178- Check for redirect loops
179- All redirects should be 301 (permanent), not 302 (temporary), unless intentionally temporary
180 
181### 4.4 Parameter Handling
182- URL parameters should not create duplicate indexable pages
183- Use canonical tags or `robots.txt` Disallow for parameter variations
184- Configure parameter handling in Google Search Console and Bing Webmaster Tools
185 
186**Category Scoring:**
187| Check | Points |
188|---|---|
189| Clean, readable URLs | 2 |
190| Logical hierarchy | 2 |
191| No redirect chains (max 1 hop) | 2 |
192| Parameter handling configured | 2 |
193 
194---
195 
196## Category 5: Mobile Optimization (10 points)
197 
198### Critical Context
199As of **July 2024**, Google crawls ALL sites exclusively with mobile Googlebot. There is no desktop crawling. If your site does not work on mobile, it does not work for Google. Period.
200 
201### 5.1 Responsive Design
202- Check for `<meta name="viewport" content="width=device-width, initial-scale=1">`
203- Content must not require horizontal scrolling on mobile
204- No fixed-width layouts wider than viewport
205 
206### 5.2 Tap Targets
207- Interactive elements (buttons, links) must be at least 48x48 CSS pixels
208- Minimum 8px spacing between tap targets
209- Check that navigation is usable on mobile
210 
211### 5.3 Font Sizes
212- Base font size should be at least 16px
213- No text requiring zoom to read
214- Sufficient contrast ratio (WCAG AA: 4.5:1 for normal text, 3:1 for large text)
215 
216### 5.4 Mobile Content Parity
217- All content visible on desktop must also be visible on mobile
218- No hidden content behind "read more" toggles that Googlebot cannot expand (though Google has improved at expanding these as of 2025)
219- Images and media must load on mobile
220 
221**Category Scoring:**
222| Check | Points |
223|---|---|
224| Viewport meta tag correct | 3 |
225| Responsive layout (no horizontal scroll) | 3 |
226| Tap targets appropriately sized | 2 |
227| Font sizes legible | 2 |
228 
229---
230 
231## Category 6: Core Web Vitals (15 points)
232 
233### 2026 Metrics and Thresholds
234Core Web Vitals use the **75th percentile** of real user data (field data) as the benchmark. Lab data is useful for debugging but field data determines the ranking signal.
235 
236| Metric | Good | Needs Improvement | Poor | Notes |
237|---|---|---|---|---|
238| **LCP** (Largest Contentful Paint) | < 2.5s | 2.5s - 4.0s | > 4.0s | Measures loading — time until largest visible element renders |
239| **INP** (Interaction to Next Paint) | < 200ms | 200ms - 500ms | > 500ms | Replaced FID in March 2024. Measures ALL interactions, not just first |
240| **CLS** (Cumulative Layout Shift) | < 0.1 | 0.1 - 0.25 | > 0.25 | Measures visual stability — unexpected layout movements |
241 
242### How to Assess Without CrUX Data
243When real user data is unavailable, estimate from page characteristics:
244- **LCP**: Check largest above-fold element. Is it an image (check size/format)? Is it text (check web font loading)? Server response time (TTFB)?
245- **INP**: Check for heavy JavaScript on page. Long tasks (>50ms) block interactivity. Check for third-party scripts.
246- **CLS**: Check for images without explicit width/height. Check for dynamically inserted content above the fold. Check for web fonts causing layout shift (FOUT/FOIT).
247 
248### Common LCP Fixes
2491. Optimize hero images: WebP/AVIF format, correct sizing, preload with `<link rel="preload">`
2502. Reduce server response time (TTFB < 800ms)
2513. Eliminate render-blocking CSS/JS
2524. Preconnect to critical third-party origins
253 
254### Common INP Fixes
2551. Break up long tasks (>50ms) into smaller chunks using `requestIdleCallback` or `scheduler.yield()`
2562. Reduce third-party JavaScript
2573. Use `content-visibility: auto` for off-screen content
2584. Debounce/throttle event handlers
259 
260### Common CLS Fixes
2611. Always include `width` and `height` attributes on images and videos
2622. Reserve space for ads and embeds with CSS `aspect-ratio` or explicit dimensions
2633. Use `font-display: swap` with size-adjusted fallback fonts
2644. Avoid inserting content above existing content after page load
265 
266**Category Scoring:**
267| Check | Points |
268|---|---|
269| LCP < 2.5s | 5 |
270| INP < 200ms | 5 |
271| CLS < 0.1 | 5 |
272 
273---
274 
275## Category 7: Server-Side Rendering (15 points) — CRITICAL FOR GEO
276 
277### Why SSR Is Mandatory for AI Visibility
278AI crawlers (GPTBot, PerplexityBot, ClaudeBot, etc.) do **NOT execute JavaScript**. They fetch the raw HTML and parse it. If your content is rendered client-side by React, Vue, Angular, or any other JavaScript framework, AI crawlers see an empty page.
279 
280Even Googlebot, which does execute JavaScript, deprioritizes JS-rendered content due to the additional crawl budget required. Google processes JS rendering in a separate "rendering queue" that can delay indexing by days or weeks.
281 
282### Detection Method
2831. Fetch the page with curl (no JavaScript execution): `curl -s [URL]`
2842. Compare the raw HTML to the rendered DOM (via browser)
2853. If key content (headings, paragraphs, product info, article text) is MISSING from the curl output, the site relies on client-side rendering
286 
287### What to Check
288- **Main content text**: Is the article body / product description / page content in the raw HTML?
289- **Headings**: Are H1, H2, H3 tags present in raw HTML?
290- **Navigation**: Is the main navigation server-rendered?
291- **Structured data**: Is JSON-LD in the raw HTML or injected by JavaScript?
292- **Meta tags**: Are title, description, canonical, OG tags in the raw HTML?
293- **Internal links**: Are navigation and content links in the raw HTML? (Critical for crawlability)
294 
295### SSR Solutions to Recommend
296| Framework | SSR Solution |
297|---|---|
298| React | Next.js (SSR/SSG), Remix, Gatsby (SSG) |
299| Vue | Nuxt.js (SSR/SSG) |
300| Angular | Angular Universal |
301| Svelte | SvelteKit |
302| Generic | Prerender.io (prerendering service), Rendertron |
303 
304### Scoring Detail
305- All key content server-rendered: 15 points
306- Main content server-rendered but some elements JS-only: 10 points
307- Critical content requires JS (product info, article text): 5 points
308- Entire page is client-rendered (empty body in raw HTML): 0 points
309 
310**Category Scoring:**
311| Check | Points |
312|---|---|
313| Main content in raw HTML | 8 |
314| Meta tags + structured data in raw HTML | 4 |
315| Internal links in raw HTML | 3 |
316 
317---
318 
319## Category 8: Page Speed & Server Performance (15 points)
320 
321### 8.1 Time to First Byte (TTFB)
322- Target: **< 800ms** (ideally < 200ms)
323- Measure with curl: `curl -o /dev/null -s -w 'TTFB: %{time_starttransfer}s\n' [URL]`
324- If TTFB > 800ms: check server location, caching, database queries, CDN usage
325 
326### 8.2 Resource Optimization
327- Total page weight target: **< 2MB** (critical pages < 1MB)
328- Check for uncompressed resources (gzip/brotli compression should be enabled)
329- Check for unminified CSS and JavaScript
330- Check for unused CSS/JS (can represent 50%+ of downloaded bytes on many sites)
331 
332### 8.3 Image Optimization
333- Check image formats: WebP or AVIF preferred over JPEG/PNG
334- Check for oversized images (images larger than display size)
335- Check for lazy loading: images below fold should have `loading="lazy"`
336- Check for explicit dimensions (width/height attributes prevent CLS)
337- Above-fold images should NOT be lazy loaded (harms LCP)
338 
339### 8.4 Code Splitting and Lazy Loading
340- JavaScript should be code-split so each page only loads what it needs
341- Check for large JavaScript bundles (> 200KB compressed is a warning, > 500KB is critical)
342- Third-party scripts should load asynchronously (`async` or `defer`)
343- Check for render-blocking resources in `<head>`
344 
345### 8.5 Caching
346- Check `Cache-Control` headers on static resources (images, CSS, JS)
347- Static assets should have long cache times: `max-age=31536000` (1 year) with content-hashed filenames
348- HTML pages should have shorter cache or `no-cache` with validation (`ETag` or `Last-Modified`)
349 
350### 8.6 CDN Usage
351- Check if static resources are served from a CDN (different domain or CDN-specific headers)
352- For global audience, CDN is critical for consistent performance
353- Check for CDN-specific headers: `CF-Ray` (Cloudflare), `X-Cache` (AWS CloudFront), `X-Served-By` (Fastly)
354 
355**Category Scoring:**
356| Check | Points |
357|---|---|
358| TTFB < 800ms | 3 |
359| Page weight < 2MB | 2 |
360| Images optimized (format, size, lazy) | 3 |
361| JS bundles reasonable (< 200KB compressed) | 2 |
362| Compression enabled (gzip/brotli) | 2 |
363| Cache headers on static resources | 2 |
364| CDN in use | 1 |
365 
366---
367 
368## Category 9: Agent-Readiness Signals (non-scoring)
369 
370These checks surface emerging AI agent compatibility signals. None contribute to the numeric score — they produce a pass or a recommendation. The underlying standards are either IETF drafts or early-adoption features; penalizing absence would be unfair.
371 
372### 9.1 RFC 8288 Link Headers (Service Discovery)
373 
374RFC 8288 (Web Linking) defines the HTTP `Link:` response header. Servers can use it to advertise related resources — API catalog, service docs, MCP server card — in a machine-readable way, without HTML parsing.
375 
376**How to check:** Capture all `Link:` response headers from the standard homepage fetch (no extra request).
377 
378**What to look for:**
379- Parse `<url>; rel="relation-type"` pairs.
380- High-value rel types: `api-catalog` (RFC 9609), `describedby`, `service-doc`, `mcp-server-card`.
381 
382**When to surface a recommendation:** Only for API-first sites (API docs linked in nav, `/api/` or `/developers/` paths, swagger/OpenAPI in sitemap). Omit this section entirely for standard business sites — absence is expected and not noteworthy.
383 
384| State | Treatment |
385|---|---|
386| `Link:` headers present, known rel types | Informational — document what was found |
387| `Link:` headers present, unknown rel types | Informational — note and explain |
388| Absent, API-first site | Recommendation — explain and suggest implementation |
389| Absent, standard business site | Omit — do not surface |
390 
391### 9.2 Markdown Content Negotiation
392 
393Checks if the server responds to `Accept: text/markdown` with `Content-Type: text/markdown`. Cloudflare's "Markdown for Agents" feature enables this — AI agents receive clean Markdown instead of HTML, eliminating boilerplate stripping and improving content extraction accuracy.
394 
395**How to check:** Send a GET to the homepage with `Accept: text/markdown`. This is one additional HTTP request per audit.
396 
397**Evaluation:**
398- If response `Content-Type` is `text/markdown` (or `text/markdown; charset=utf-8`): pass — note as a leading-edge capability.
399- Otherwise: forward-looking recommendation, not a failure.
400- If the request errors or returns non-200: skip and note the error. Do not penalize.
401 
402| State | Treatment |
403|---|---|
404| `text/markdown` returned | Bonus — note as a leading-edge capability |
405| Standard HTML returned | Forward-looking recommendation |
406| Request errors / non-200 | Skip, note the error, do not penalize |
407 
408---
409 
410## IndexNow Protocol
411 
412### What It Is
413IndexNow is an open protocol that allows websites to notify search engines instantly when content is created, updated, or deleted. Supported by Bing, Yandex, Seznam, and Naver. Google does NOT support IndexNow but monitors the protocol.
414 
415### Why It Matters for GEO
416ChatGPT uses Bing's index. Bing Copilot uses Bing's index. Faster Bing indexing means faster AI visibility on two major platforms.
417 
418### Implementation Check
4191. Check for IndexNow key file: `https://[domain]/.well-known/indexnow-key.txt` or similar
4202. Check if CMS has IndexNow plugin (WordPress: IndexNow plugin; many modern CMS platforms support it natively)
4213. If not implemented, recommend adding it with instructions
422 
423---
424 
425## Overall Scoring
426 
427| Category | Max Points | Weight |
428|---|---|---|
429| Crawlability | 15 | Core foundation |
430| Indexability | 12 | Core foundation |
431| Security | 10 | Trust signal |
432| URL Structure | 8 | Crawl efficiency |
433| Mobile Optimization | 10 | Google requirement |
434| Core Web Vitals | 15 | Ranking signal |
435| Server-Side Rendering | 15 | GEO critical |
436| Page Speed & Server | 15 | Performance |
437| **Total** | **100** | |
438 
439Non-scoring checks (Category 9) appear in the output under "Agent-Readiness Signals" and do not affect this total.
440 
441### Score Interpretation
442- **90-100**: Excellent — technically sound for both traditional SEO and GEO
443- **70-89**: Good — minor issues to address but fundamentally solid
444- **50-69**: Needs Work — significant technical debt impacting visibility
445- **30-49**: Poor — major issues blocking crawling, indexing, or AI visibility
446- **0-29**: Critical — fundamental technical failures requiring immediate attention
447 
448---
449 
450## Output Format
451 
452Generate **GEO-TECHNICAL-AUDIT.md** with:
453 
454```markdown
455# GEO Technical SEO Audit — [Domain]
456Date: [Date]
457 
458## Technical Score: XX/100
459 
460## Score Breakdown
461| Category | Score | Status |
462|---|---|---|
463| Crawlability | XX/15 | Pass/Warn/Fail |
464| Indexability | XX/12 | Pass/Warn/Fail |
465| Security | XX/10 | Pass/Warn/Fail |
466| URL Structure | XX/8 | Pass/Warn/Fail |
467| Mobile Optimization | XX/10 | Pass/Warn/Fail |
468| Core Web Vitals | XX/15 | Pass/Warn/Fail |
469| Server-Side Rendering | XX/15 | Pass/Warn/Fail |
470| Page Speed & Server | XX/15 | Pass/Warn/Fail |
471 
472Status: Pass = 80%+ of category points, Warn = 50-79%, Fail = <50%
473 
474## AI Crawler Access
475| Crawler | User-Agent | Status | Recommendation |
476|---|---|---|---|
477| GPTBot | GPTBot | Allowed/Blocked | [Action] |
478| Googlebot | Googlebot | Allowed/Blocked | [Action] |
479[Continue for all AI crawlers]
480 
481## Critical Issues (fix immediately)
482[List with specific page URLs and what is wrong]
483 
484## Warnings (fix this month)
485[List with details]
486 
487## Recommendations (optimize this quarter)
488[List with details]
489 
490## Agent-Readiness Signals (non-scoring)
491 
492### RFC 8288 Link Headers (Service Discovery)
493 
494**Status:** Present / Absent / Not Applicable
495 
496<!-- If present: -->
497| Relation Type | URL | Meaning |
498|---|---|---|
499| api-catalog | /.well-known/api-catalog | Machine-readable index of available APIs |
500| mcp-server-card | /.well-known/mcp.json | MCP server capability declaration |
501 
502AI agents and API clients can discover your services without parsing HTML.
503 
504<!-- If absent, API-first site only: -->
505**Informational Recommendation:** This site has API/developer-oriented content but no `Link:` headers advertising discoverable services.
506 
507Example: `Link: </.well-known/api-catalog>; rel="api-catalog"`
508 
509Relevant for: sites with public APIs, OpenAPI docs, or MCP server integrations.
510Reference: RFC 8288, RFC 9609.
511 
512<!-- If absent, standard business site: omit this section entirely -->
513 
514### Markdown Content Negotiation
515 
516**Status:** Supported / Not Supported
517**Test:** GET [url] with `Accept: text/markdown`
518**Response Content-Type:** [value]
519 
520<!-- If supported: -->
521This site serves clean Markdown to AI agents on request. AI crawlers that support content negotiation receive formatted text without HTML boilerplate.
522 
523<!-- If not supported: -->
524**Forward-Looking Recommendation:** Cloudflare Workers/Pages sites can enable Markdown content negotiation with a one-line configuration change. When an AI agent sends `Accept: text/markdown`, the server responds with clean Markdown instead of HTML.
525 
526- Currently Cloudflare-specific
527- Relevant for: sites already on Cloudflare infrastructure
528- Other CDNs and frameworks expected to adopt this pattern as AI agent traffic grows
529 
530## Detailed Findings
531[Per-category breakdown with evidence]
532```
533 

Discussion

From GitHub

1 thread

Alternatives

Also in SEO & keywords