GEO Audit
geo audit scores your website from 0 to 100 across 9 GEO categories and tells you exactly what to fix.
What It Checks
Scored categories (100 points total)
| Area |
Max Points |
What is audited |
| Google AI readiness |
20 |
Indexing, snippets, canonical, dates, byline, links, viewport, sitemap, and manual generative-AI control check |
| Robots.txt |
14 |
27 AI bots across 3 tiers (training, search, user). Citation bots explicitly allowed? |
| llms.txt |
6 |
Present, sections, links, and companion llms-full.txt; useful to other AI agents, ignored by Google Search |
| Schema JSON-LD |
14 |
WebSite, Organization, FAQPage, Article, schema richness, and visible name match |
| Meta Tags |
11 |
Title, description, Open Graph complete? Canonical is scored in Google AI readiness |
| Content |
14 |
H1, statistics, external citations, heading hierarchy, lists/tables, front-loading, image alt coverage |
| Brand & Entity |
12 |
Brand coherence, Knowledge Graph links (Wikipedia/Wikidata/LinkedIn), about page, geo signals, topic authority |
| Signals |
6 |
<html lang>, RSS/Atom feed, dateModified freshness? |
| AI Discovery |
3 |
.well-known/ai.txt, /ai/summary.json, and markdown negotiation? |
| Check |
What it detects |
| CDN Crawler Access |
Does Cloudflare/Akamai/Vercel block GPTBot, ClaudeBot, PerplexityBot? |
| JS Rendering |
Is content accessible without JavaScript? SPA framework detection |
| WebMCP Readiness |
Chrome WebMCP support: registerTool(), toolname attributes, potentialAction schema |
| Negative Signals |
8 anti-citation signals: CTA overload, popups, thin content, keyword stuffing, missing author, boilerplate ratio |
| Prompt Injection Detection |
8 manipulation patterns: hidden text, invisible Unicode, LLM instructions, HTML comment injection |
| Trust Stack Score |
5-layer trust aggregation (Technical, Identity, Social, Academic, Consistency) β grade A-F |
Google AI readiness - max 20 pts (v2)
| Check |
Points |
One-line check |
Source |
G-INDEX |
5 |
Final status 200, no noindex directives, and Googlebot is not blocked by robots.txt. |
https://developers.google.com/search/docs/essentials/technical |
G-SNIPPET |
5 |
No restrictive snippet directives; data-nosnippet over 50% fails and over 10% warns. |
https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag |
G-CANONICAL |
3 |
Exactly one absolute canonical in <head> matches the final URL. |
https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls |
G-DATES |
2 |
Visible date agrees with datePublished/dateModified and is not in the future. |
https://developers.google.com/search/docs/appearance/publication-dates |
G-BYLINE |
2 |
Visible author or JSON-LD author is present, ideally linked to an author page. |
https://developers.google.com/search/docs/fundamentals/creating-helpful-content |
G-LINKS |
1 |
Internal links use crawlable <a href> elements, with no #/ routes. |
https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics |
G-VIEWPORT |
1 |
Meta viewport is present. |
https://developers.google.com/search/docs/appearance/page-experience |
G-SITEMAP |
1 |
Sitemap: is declared in robots.txt. |
https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap |
G-SD-VISIBLE |
2 |
JSON-LD name or headline appears in visible text; scored in Schema JSON-LD. |
https://developers.google.com/search/docs/appearance/structured-data/sd-policies |
G-GENAI-CONTROL |
0 |
Search Console generative-AI opt-out; manual check. |
https://developers.google.com/search/docs/fundamentals/ai-optimization-guide |
Plus a separate Citability Score (0-100) measuring content quality across 47 methods.
Usage
# Standard audit
geo audit --url https://yoursite.com
# Save the snapshot in local history
geo audit --url https://yoursite.com --save-history
# Fail CI if the score regressed vs the previous saved snapshot
geo audit --url https://yoursite.com --regression
# Choose output format
geo audit --url https://yoursite.com --format rich
# Batch audit from sitemap
geo audit --sitemap https://yoursite.com/sitemap.xml --max-urls 25
# Batch audit as JSON
geo audit --sitemap https://yoursite.com/sitemap.xml --format json
# Compare with the legacy v1 rubric
geo audit --url https://yoursite.com --score-version 1
Flags
| Flag |
Required |
Description |
--url |
Yes* |
Full URL of the site to audit (must include https://) |
--sitemap |
Yes* |
XML sitemap URL to audit multiple pages in one run |
--format |
No |
Output format: text (default), json, rich, html, sarif, junit, github |
--max-urls |
No |
Maximum number of sitemap URLs to audit in batch mode (default: 50) |
--max-pages |
No |
With --url: find the siteβs sitemap and audit up to N of its pages (2-500), reporting the average. Same as --sitemap without needing the sitemap URL; text or JSON output only. Fails with exit 1 if no sitemap is found. A home-only score can differ from the page average by several points (observed 2026-10-16 on 14 sites: mean gap 8.9, median 5.9) |
--concurrency |
No |
Concurrent page audits in batch mode (default: 5) |
--save-history |
No |
Save the URL audit in local history (~/.geo-optimizer/tracking.db) |
--regression |
No |
Exit with code 1 if the score dropped vs the previous saved snapshot |
--retention-days |
No |
Retention window for local snapshots (default: 90) |
--score-version |
No |
Scoring rubric version: 2 (default) or 1 (legacy) |
* Use either --url or --sitemap.
| Format |
Use case |
text |
Human-readable terminal output (default) |
json |
Machine-readable, pipe to jq or downstream tools |
rich |
Colored terminal with ASCII art dashboard |
html |
Self-contained HTML report (shareable) |
sarif |
GitHub Code Scanning (upload to Security tab) |
junit |
Jenkins, GitLab CI test reports |
github |
GitHub Actions step summary annotations |
When using --sitemap, only text and json are supported.
--save-history and --regression currently apply only to --url mode.
Output Explained
Each section in the output maps to one of the 9 scoring categories:
βΈ ROBOTS.TXT
+ β
GPTBot allowed (OpenAI β ChatGPT training)
+ β
OAI-SearchBot allowed (OpenAI β ChatGPT citations) β critical
- β ClaudeBot MISSING β critical
- β PerplexityBot MISSING β critical
βΈ LLMS.TXT
- β Not found at https://yoursite.com/llms.txt
βΈ SCHEMA JSON-LD
+ β
WebSite schema
+ β
Organization schema
- β FAQPage schema missing
- β Article schema missing
βΈ META TAGS
+ β
Title (62 chars)
+ β
Meta description (142 chars)
+ β
Canonical URL
- β Open Graph tags missing (og:title, og:image)
βΈ CONTENT QUALITY
+ β
18 headings Β· H2+H3 hierarchy
- β 1 statistic (target: 5+)
- β 0 external citations (target: 3+)
+ β
Lists/tables present
βΈ BRAND & ENTITY
+ β
Brand name coherent across title/schema/OG
- β No sameAs Knowledge Graph links
+ β
About page found
βΈ SIGNALS
+ β
<html lang="en">
- β No RSS/Atom feed
- β No dateModified freshness signal
βΈ AI DISCOVERY
- β /.well-known/ai.txt missing
- β /ai/summary.json missing
GEO Score Breakdown
The score is the sum of all points earned across 9 categories, capped at 100. Rubric v2 is the default; use --score-version 1 for legacy comparisons.
| Category |
Max Points |
How itβs scored |
| Google AI readiness |
20 |
G-INDEX 5 + G-SNIPPET 5 + G-CANONICAL 3 + G-DATES 2 + G-BYLINE 2 + G-LINKS 1 + G-VIEWPORT 1 + G-SITEMAP 1; G-GENAI-CONTROL is manual (0pt) |
| Robots.txt |
14 |
3pt found + 11pt all 4 citation bots allowed. 8pt partial credit if some bots allowed |
| llms.txt |
6 |
3pt found + 1pt sections + 1pt links + 1pt llms-full.txt; ignored by Google Search |
| Schema JSON-LD |
14 |
2pt any valid + 2pt richness + 2pt FAQPage + 2pt Article + 3pt Organization + 1pt WebSite + 2pt visible name match |
| Meta Tags |
11 |
5pt title + 2pt description + 4pt Open Graph; canonical moved to G-CANONICAL |
| Content |
14 |
2pt H1 + 1pt numbers + 1pt links + 1pt word count + 3pt hierarchy + 2pt lists/tables + 2pt front-loading + 2pt image alt coverage |
| Brand & Entity |
12 |
3pt coherence + 4pt KG readiness + 3pt about/contact + 1pt geo identity + 1pt topic authority |
| Signals |
6 |
3pt lang + 1pt RSS + 2pt freshness; valid, not future date |
| AI Discovery |
3 |
1pt ai.txt + 1pt summary.json + 1pt markdown negotiation (Accept: text/markdown β Content-Type: text/markdown) |
Score bands:
| Score |
Label |
Meaning |
| 86-100 |
Excellent |
Fully optimized for AI citation engines |
| 68-85 |
Good |
Well-optimized, minor gaps remain |
| 36-67 |
Foundation |
Partially visible β key signals missing |
| 0-35 |
Critical |
AI engines cannot reliably discover or cite you |
What Each Problem Means and How to Fix It
| Problem |
Fix |
Docs |
| AI bot MISSING in robots.txt |
Add the botβs User-agent block with Allow: / |
AI Bots Reference |
| llms.txt not found |
Generate with geo llms, place at site root |
Generating llms.txt |
| FAQPage schema missing |
Generate with geo schema --type faq |
Schema Injector |
| Organization schema missing |
Generate with geo schema --type organization |
Schema Injector |
| Meta description missing |
Add <meta name="description" content="..."> to <head> |
β |
| Open Graph tags missing |
Add og:title, og:description, og:image to <head> |
β |
| No KG sameAs links |
Add sameAs to Organization schema (Wikipedia, LinkedIn, etc.) |
Scoring Rubric |
| AI Discovery endpoints missing |
Use geo fix to generate .well-known/ai.txt and /ai/*.json |
β |
| Low statistics count |
Add specific numbers, %, dates to page content |
GEO Methods |
| 0 external citations |
Link to authoritative sources (papers, .gov, .edu) |
GEO Methods |
Example Outputs
Score 52/100 β Unoptimized Site
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GEO AUDIT β https://example.com
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βΈ ROBOTS.TXT βββββββββββββββββββββββββββ 5 / 14
β
robots.txt found
β OAI-SearchBot MISSING β critical
β ClaudeBot MISSING β critical
β PerplexityBot MISSING β critical
βΈ LLMS.TXT βββββββββββββββββββββββββββββ 0 / 6
β Not found at https://example.com/llms.txt
βΈ SCHEMA JSON-LD βββββββββββββββββββββββ 4 / 14
β
WebSite schema (3 attributes)
β FAQPage schema missing
β Article schema missing
β Organization schema missing
βΈ META TAGS ββββββββββββββββββββββββββββ 10 / 11
β
Title Β· Meta description Β· Canonical
β Open Graph tags missing
βΈ CONTENT QUALITY ββββββββββββββββββββββ 5 / 14
β
H1 present Β· 9 headings
β 1 statistic (target: 5+)
β 0 external citations (target: 3+)
βΈ BRAND & ENTITY βββββββββββββββββββββββ 3 / 12
β
Brand name coherent
β No sameAs Knowledge Graph links
β No about/contact pages
βΈ SIGNALS ββββββββββββββββββββββββββββββ 3 / 6
β
<html lang="en">
β No RSS/Atom feed
βΈ AI DISCOVERY βββββββββββββββββββββββββ 0 / 3
β No AI discovery endpoints found
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GEO SCORE [ββββββββββββββββββββ] 52 / 100 β οΈ FOUNDATION
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Score 87/100 β Optimized Site
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GEO AUDIT β https://optimized-site.com
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βΈ ROBOTS.TXT βββββββββββββββββββββββββββ 14 / 14
β
All 4 citation bots configured
β
27 AI bots explicitly allowed
βΈ LLMS.TXT βββββββββββββββββββββββββββββ 6 / 6
β
Found (6,517 bytes Β· 46 links Β· 6 sections)
β llms-full.txt missing (β2pt)
βΈ SCHEMA JSON-LD βββββββββββββββββββββββ 14 / 14
β
WebSite Β· Organization Β· Article (8 attributes)
β FAQPage schema missing (β3pt)
βΈ META TAGS ββββββββββββββββββββββββββββ 11 / 11
β
Title Β· Meta description Β· Canonical Β· OG tags
βΈ CONTENT QUALITY ββββββββββββββββββββββ 12 / 14
β
31 headings Β· H2+H3 hierarchy Β· 15 statistics Β· 4 citations
β
Lists/tables Β· Front-loading
βΈ BRAND & ENTITY βββββββββββββββββββββββ 9 / 12
β
Brand coherent Β· KG links (Wikipedia, LinkedIn)
β
About + Contact pages
β No geo identity signal (β1pt)
βΈ SIGNALS ββββββββββββββββββββββββββββββ 4 / 6
β
<html lang="en"> Β· RSS feed
β No dateModified freshness (β1pt)
βΈ AI DISCOVERY βββββββββββββββββββββββββ 0 / 3
β No AI discovery endpoints
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GEO SCORE [ββββββββββββββββββββ] 87 / 100 π EXCELLENT
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ