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
- Collect the target URL (homepage + 2-3 key inner pages)
- Fetch each page using curl/WebFetch to get raw HTML and HTTP headers
- Run through each of the 8 audit categories below
- Score each category using the rubric
- 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
- Optimize hero images: WebP/AVIF format, correct sizing, preload with
<link rel="preload">
- Reduce server response time (TTFB < 800ms)
- Eliminate render-blocking CSS/JS
- Preconnect to critical third-party origins
Common INP Fixes
- Break up long tasks (>50ms) into smaller chunks using
requestIdleCallback or scheduler.yield()
- Reduce third-party JavaScript
- Use
content-visibility: auto for off-screen content
- Debounce/throttle event handlers
Common CLS Fixes
- Always include
width and height attributes on images and videos
- Reserve space for ads and embeds with CSS
aspect-ratio or explicit dimensions
- Use
font-display: swap with size-adjusted fallback fonts
- 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
- Fetch the page with curl (no JavaScript execution):
curl -s [URL]
- Compare the raw HTML to the rendered DOM (via browser)
- 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 |
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
- Check for IndexNow key file:
https://[domain]/.well-known/indexnow-key.txt or similar
- Check if CMS has IndexNow plugin (WordPress: IndexNow plugin; many modern CMS platforms support it natively)
- 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 |
|
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]
## Detailed Findings
[Per-category breakdown with evidence]
1---2name: geo-technical3description: Technical SEO audit with GEO-specific checks — crawlability, indexability, security, performance, SSR, and AI crawler access4---56# GEO Technical SEO Audit78## Purpose910Technical 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).1112## How to Use This Skill13141. Collect the target URL (homepage + 2-3 key inner pages)152. Fetch each page using curl/WebFetch to get raw HTML and HTTP headers163. Run through each of the 8 audit categories below174. Score each category using the rubric185. Generate GEO-TECHNICAL-AUDIT.md with results1920---2122## Category 1: Crawlability (15 points)2324### 1.1 robots.txt Validity25- Fetch `https://[domain]/robots.txt`26- Check for syntactic validity: proper `User-agent`, `Allow`, `Disallow` directives27- Check for common errors: missing User-agent, wildcards blocking important paths, Disallow: / blocking entire site28- Verify XML sitemap is referenced: `Sitemap: https://[domain]/sitemap.xml`2930### 1.2 AI Crawler Access (CRITICAL for GEO)31Check robots.txt for directives targeting these AI crawlers:3233| Crawler | User-Agent | Platform |34|---|---|---|35| GPTBot | GPTBot | ChatGPT / OpenAI |36| Google-Extended | Google-Extended | Gemini / Google AI training |37| Googlebot | Googlebot | Google Search + AI Overviews |38| Bingbot | bingbot | Bing Copilot + ChatGPT (via Bing) |39| PerplexityBot | PerplexityBot | Perplexity AI |40| ClaudeBot | ClaudeBot | Anthropic Claude |41| Amazonbot | Amazonbot | Alexa / Amazon AI |42| CCBot | CCBot | Common Crawl (used by many AI models) |43| FacebookBot | FacebookExternalHit | Meta AI |44| Bytespider | Bytespider | TikTok / ByteDance AI |45| Applebot-Extended | Applebot-Extended | Apple Intelligence |4647**Scoring for AI crawler access:**48- All major AI crawlers allowed: 5 points49- Some blocked but Googlebot + Bingbot allowed: 3 points50- GPTBot or PerplexityBot blocked: 1 point (significant GEO impact)51- Googlebot blocked: 0 points (fatal)5253**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.5455### 1.3 XML Sitemaps56- Fetch sitemap (check robots.txt for location, or try `/sitemap.xml`, `/sitemap_index.xml`)57- Validate XML syntax58- Check for `<lastmod>` dates (should be present and accurate)59- Count URLs — compare to expected number of indexable pages60- Check for sitemap index if large site (50,000+ URLs per sitemap max)61- Verify all sitemap URLs return 200 status codes (sample check)6263### 1.4 Crawl Depth64- Homepage = depth 0. Check that all important pages are reachable within **3 clicks** (depth 3)65- Pages at depth 4+ receive significantly less crawl budget and are less likely to be cited by AI66- Check internal linking: are key content pages linked from the homepage or main navigation?6768### 1.5 Noindex Management69- Check for `<meta name="robots" content="noindex">` on pages that SHOULD be indexed70- Check for `X-Robots-Tag: noindex` HTTP headers71- Common mistakes: noindex on paginated pages, category pages, or key landing pages7273**Category Scoring:**74| Check | Points |75|---|---|76| robots.txt valid and complete | 3 |77| AI crawlers allowed | 5 |78| XML sitemap present and valid | 3 |79| Crawl depth within 3 clicks | 2 |80| No erroneous noindex directives | 2 |8182---8384## Category 2: Indexability (12 points)8586### 2.1 Canonical Tags87- Every indexable page must have a `<link rel="canonical" href="...">` tag88- Canonical must point to itself (self-referencing) for the authoritative version89- Check for conflicting canonicals (canonical in HTML vs. HTTP header)90- Check for canonical chains (A canonicals to B, B canonicals to C — should be A to C)9192### 2.2 Duplicate Content93- Check for www vs. non-www (both should resolve, one should redirect)94- Check for HTTP vs. HTTPS (HTTP should redirect to HTTPS)95- Check for trailing slash consistency (pick one pattern and redirect the other)96- Check for parameter-based duplicates (`?sort=price` creating duplicate pages)9798### 2.3 Pagination99- If paginated content exists, check for `rel="next"` / `rel="prev"` (note: Google ignores these as of 2019, but Bing still uses them)100- Preferred: use `rel="canonical"` on paginated pages pointing to a view-all page or the first page101- Ensure paginated pages are not noindexed if they contain unique content102103### 2.4 Hreflang (international sites)104- Check for `<link rel="alternate" hreflang="xx">` tags105- Validate: reciprocal hreflang (if page A points to page B, B must point back to A)106- Validate: x-default fallback exists107- Check for language/region code validity (ISO 639-1 / ISO 3166-1)108109### 2.5 Index Bloat110- Estimate number of indexed pages (check sitemap count, use `site:domain.com` estimate)111- Compare indexed pages to actual valuable content pages112- Flag if indexed pages significantly exceed content pages (index bloat from thin/duplicate/parameter pages)113114**Category Scoring:**115| Check | Points |116|---|---|117| Canonical tags correct on all pages | 3 |118| No duplicate content issues | 3 |119| Pagination handled correctly | 2 |120| Hreflang correct (if applicable) | 2 |121| No index bloat | 2 |122123---124125## Category 3: Security (10 points)126127### 3.1 HTTPS Enforcement128- Site must load over HTTPS129- HTTP must redirect to HTTPS (301 redirect)130- No mixed content warnings (HTTP resources on HTTPS pages)131- SSL/TLS certificate must be valid and not expired132133### 3.2 Security Headers134Check HTTP response headers for:135136| Header | Required Value | Purpose |137|---|---|---|138| `Strict-Transport-Security` | `max-age=31536000; includeSubDomains` | Forces HTTPS |139| `Content-Security-Policy` | Appropriate policy | Prevents XSS |140| `X-Content-Type-Options` | `nosniff` | Prevents MIME sniffing |141| `X-Frame-Options` | `DENY` or `SAMEORIGIN` | Prevents clickjacking |142| `Referrer-Policy` | `strict-origin-when-cross-origin` or stricter | Controls referrer data |143| `Permissions-Policy` | Appropriate restrictions | Controls browser features |144145**Category Scoring:**146| Check | Points |147|---|---|148| HTTPS enforced with valid cert | 4 |149| HSTS header present | 2 |150| X-Content-Type-Options | 1 |151| X-Frame-Options | 1 |152| Referrer-Policy | 1 |153| Content-Security-Policy | 1 |154155---156157## Category 4: URL Structure (8 points)158159### 4.1 Clean URLs160- URLs should be human-readable: `/blog/seo-guide` not `/blog?id=12345`161- No session IDs in URLs162- Lowercase only (no mixed case)163- Hyphens for word separation (not underscores)164- No special characters or encoded spaces165166### 4.2 Logical Hierarchy167- URL path should reflect site architecture: `/category/subcategory/page`168- Flat where appropriate — avoid unnecessarily deep nesting169- Consistent pattern across the site170171### 4.3 Redirect Chains172- Check for redirect chains (A redirects to B redirects to C)173- Maximum 1 hop recommended (A redirects to C directly)174- Check for redirect loops175- All redirects should be 301 (permanent), not 302 (temporary), unless intentionally temporary176177### 4.4 Parameter Handling178- URL parameters should not create duplicate indexable pages179- Use canonical tags or `robots.txt` Disallow for parameter variations180- Configure parameter handling in Google Search Console and Bing Webmaster Tools181182**Category Scoring:**183| Check | Points |184|---|---|185| Clean, readable URLs | 2 |186| Logical hierarchy | 2 |187| No redirect chains (max 1 hop) | 2 |188| Parameter handling configured | 2 |189190---191192## Category 5: Mobile Optimization (10 points)193194### Critical Context195As 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.196197### 5.1 Responsive Design198- Check for `<meta name="viewport" content="width=device-width, initial-scale=1">`199- Content must not require horizontal scrolling on mobile200- No fixed-width layouts wider than viewport201202### 5.2 Tap Targets203- Interactive elements (buttons, links) must be at least 48x48 CSS pixels204- Minimum 8px spacing between tap targets205- Check that navigation is usable on mobile206207### 5.3 Font Sizes208- Base font size should be at least 16px209- No text requiring zoom to read210- Sufficient contrast ratio (WCAG AA: 4.5:1 for normal text, 3:1 for large text)211212### 5.4 Mobile Content Parity213- All content visible on desktop must also be visible on mobile214- No hidden content behind "read more" toggles that Googlebot cannot expand (though Google has improved at expanding these as of 2025)215- Images and media must load on mobile216217**Category Scoring:**218| Check | Points |219|---|---|220| Viewport meta tag correct | 3 |221| Responsive layout (no horizontal scroll) | 3 |222| Tap targets appropriately sized | 2 |223| Font sizes legible | 2 |224225---226227## Category 6: Core Web Vitals (15 points)228229### 2026 Metrics and Thresholds230Core 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.231232| Metric | Good | Needs Improvement | Poor | Notes |233|---|---|---|---|---|234| **LCP** (Largest Contentful Paint) | < 2.5s | 2.5s - 4.0s | > 4.0s | Measures loading — time until largest visible element renders |235| **INP** (Interaction to Next Paint) | < 200ms | 200ms - 500ms | > 500ms | Replaced FID in March 2024. Measures ALL interactions, not just first |236| **CLS** (Cumulative Layout Shift) | < 0.1 | 0.1 - 0.25 | > 0.25 | Measures visual stability — unexpected layout movements |237238### How to Assess Without CrUX Data239When real user data is unavailable, estimate from page characteristics:240- **LCP**: Check largest above-fold element. Is it an image (check size/format)? Is it text (check web font loading)? Server response time (TTFB)?241- **INP**: Check for heavy JavaScript on page. Long tasks (>50ms) block interactivity. Check for third-party scripts.242- **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).243244### Common LCP Fixes2451. Optimize hero images: WebP/AVIF format, correct sizing, preload with `<link rel="preload">`2462. Reduce server response time (TTFB < 800ms)2473. Eliminate render-blocking CSS/JS2484. Preconnect to critical third-party origins249250### Common INP Fixes2511. Break up long tasks (>50ms) into smaller chunks using `requestIdleCallback` or `scheduler.yield()`2522. Reduce third-party JavaScript2533. Use `content-visibility: auto` for off-screen content2544. Debounce/throttle event handlers255256### Common CLS Fixes2571. Always include `width` and `height` attributes on images and videos2582. Reserve space for ads and embeds with CSS `aspect-ratio` or explicit dimensions2593. Use `font-display: swap` with size-adjusted fallback fonts2604. Avoid inserting content above existing content after page load261262**Category Scoring:**263| Check | Points |264|---|---|265| LCP < 2.5s | 5 |266| INP < 200ms | 5 |267| CLS < 0.1 | 5 |268269---270271## Category 7: Server-Side Rendering (15 points) — CRITICAL FOR GEO272273### Why SSR Is Mandatory for AI Visibility274AI 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.275276Even 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.277278### Detection Method2791. Fetch the page with curl (no JavaScript execution): `curl -s [URL]`2802. Compare the raw HTML to the rendered DOM (via browser)2813. If key content (headings, paragraphs, product info, article text) is MISSING from the curl output, the site relies on client-side rendering282283### What to Check284- **Main content text**: Is the article body / product description / page content in the raw HTML?285- **Headings**: Are H1, H2, H3 tags present in raw HTML?286- **Navigation**: Is the main navigation server-rendered?287- **Structured data**: Is JSON-LD in the raw HTML or injected by JavaScript?288- **Meta tags**: Are title, description, canonical, OG tags in the raw HTML?289- **Internal links**: Are navigation and content links in the raw HTML? (Critical for crawlability)290291### SSR Solutions to Recommend292| Framework | SSR Solution |293|---|---|294| React | Next.js (SSR/SSG), Remix, Gatsby (SSG) |295| Vue | Nuxt.js (SSR/SSG) |296| Angular | Angular Universal |297| Svelte | SvelteKit |298| Generic | Prerender.io (prerendering service), Rendertron |299300### Scoring Detail301- All key content server-rendered: 15 points302- Main content server-rendered but some elements JS-only: 10 points303- Critical content requires JS (product info, article text): 5 points304- Entire page is client-rendered (empty body in raw HTML): 0 points305306**Category Scoring:**307| Check | Points |308|---|---|309| Main content in raw HTML | 8 |310| Meta tags + structured data in raw HTML | 4 |311| Internal links in raw HTML | 3 |312313---314315## Category 8: Page Speed & Server Performance (15 points)316317### 8.1 Time to First Byte (TTFB)318- Target: **< 800ms** (ideally < 200ms)319- Measure with curl: `curl -o /dev/null -s -w 'TTFB: %{time_starttransfer}s\n' [URL]`320- If TTFB > 800ms: check server location, caching, database queries, CDN usage321322### 8.2 Resource Optimization323- Total page weight target: **< 2MB** (critical pages < 1MB)324- Check for uncompressed resources (gzip/brotli compression should be enabled)325- Check for unminified CSS and JavaScript326- Check for unused CSS/JS (can represent 50%+ of downloaded bytes on many sites)327328### 8.3 Image Optimization329- Check image formats: WebP or AVIF preferred over JPEG/PNG330- Check for oversized images (images larger than display size)331- Check for lazy loading: images below fold should have `loading="lazy"`332- Check for explicit dimensions (width/height attributes prevent CLS)333- Above-fold images should NOT be lazy loaded (harms LCP)334335### 8.4 Code Splitting and Lazy Loading336- JavaScript should be code-split so each page only loads what it needs337- Check for large JavaScript bundles (> 200KB compressed is a warning, > 500KB is critical)338- Third-party scripts should load asynchronously (`async` or `defer`)339- Check for render-blocking resources in `<head>`340341### 8.5 Caching342- Check `Cache-Control` headers on static resources (images, CSS, JS)343- Static assets should have long cache times: `max-age=31536000` (1 year) with content-hashed filenames344- HTML pages should have shorter cache or `no-cache` with validation (`ETag` or `Last-Modified`)345346### 8.6 CDN Usage347- Check if static resources are served from a CDN (different domain or CDN-specific headers)348- For global audience, CDN is critical for consistent performance349- Check for CDN-specific headers: `CF-Ray` (Cloudflare), `X-Cache` (AWS CloudFront), `X-Served-By` (Fastly)350351**Category Scoring:**352| Check | Points |353|---|---|354| TTFB < 800ms | 3 |355| Page weight < 2MB | 2 |356| Images optimized (format, size, lazy) | 3 |357| JS bundles reasonable (< 200KB compressed) | 2 |358| Compression enabled (gzip/brotli) | 2 |359| Cache headers on static resources | 2 |360| CDN in use | 1 |361362---363364## IndexNow Protocol365366### What It Is367IndexNow 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.368369### Why It Matters for GEO370ChatGPT uses Bing's index. Bing Copilot uses Bing's index. Faster Bing indexing means faster AI visibility on two major platforms.371372### Implementation Check3731. Check for IndexNow key file: `https://[domain]/.well-known/indexnow-key.txt` or similar3742. Check if CMS has IndexNow plugin (WordPress: IndexNow plugin; many modern CMS platforms support it natively)3753. If not implemented, recommend adding it with instructions376377---378379## Overall Scoring380381| Category | Max Points | Weight |382|---|---|---|383| Crawlability | 15 | Core foundation |384| Indexability | 12 | Core foundation |385| Security | 10 | Trust signal |386| URL Structure | 8 | Crawl efficiency |387| Mobile Optimization | 10 | Google requirement |388| Core Web Vitals | 15 | Ranking signal |389| Server-Side Rendering | 15 | GEO critical |390| Page Speed & Server | 15 | Performance |391| **Total** | **100** | |392393### Score Interpretation394- **90-100**: Excellent — technically sound for both traditional SEO and GEO395- **70-89**: Good — minor issues to address but fundamentally solid396- **50-69**: Needs Work — significant technical debt impacting visibility397- **30-49**: Poor — major issues blocking crawling, indexing, or AI visibility398- **0-29**: Critical — fundamental technical failures requiring immediate attention399400---401402## Output Format403404Generate **GEO-TECHNICAL-AUDIT.md** with:405406```markdown407# GEO Technical SEO Audit — [Domain]408Date: [Date]409410## Technical Score: XX/100411412## Score Breakdown413| Category | Score | Status |414|---|---|---|415| Crawlability | XX/15 | Pass/Warn/Fail |416| Indexability | XX/12 | Pass/Warn/Fail |417| Security | XX/10 | Pass/Warn/Fail |418| URL Structure | XX/8 | Pass/Warn/Fail |419| Mobile Optimization | XX/10 | Pass/Warn/Fail |420| Core Web Vitals | XX/15 | Pass/Warn/Fail |421| Server-Side Rendering | XX/15 | Pass/Warn/Fail |422| Page Speed & Server | XX/15 | Pass/Warn/Fail |423424Status: Pass = 80%+ of category points, Warn = 50-79%, Fail = <50%425426## AI Crawler Access427| Crawler | User-Agent | Status | Recommendation |428|---|---|---|---|429| GPTBot | GPTBot | Allowed/Blocked | [Action] |430| Googlebot | Googlebot | Allowed/Blocked | [Action] |431[Continue for all AI crawlers]432433## Critical Issues (fix immediately)434[List with specific page URLs and what is wrong]435436## Warnings (fix this month)437[List with details]438439## Recommendations (optimize this quarter)440[List with details]441442## Detailed Findings443[Per-category breakdown with evidence]444```