GEO (Generative Engine Optimization)
Checks specific to how generative AI models (the ones answering questions directly, not just linking out) read, ground, and cite a page — entity disambiguation, JS-dependent content, quotability, statistic density. Source: src/lib/geoAudit.ts (analyzeGEO).
19 rules in this category.
geo-js-rendered-content
Page content requires JavaScript to render
| Severity | Weight | Category |
|---|---|---|
| High | 10 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Most AI crawlers fetch raw HTML and don't run JavaScript, so content that appears only after hydration is invisible to them. Confirmed by rendering when "Render JavaScript" is on, estimated otherwise. Gate: while this fails, the category score is capped at 40, so strengths elsewhere can't hide it.
How to fix it & effect on score: Server-render or prerender the primary content. Fixing this removes the 10 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: measured on the live site at scan time.
geo-entity-grounding-missing
Entity schema has no sameAs links to authoritative profiles
| Severity | Weight | Category |
|---|---|---|
| Medium | 6 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: The page's Organization/Person structured data doesn't include a sameAs property pointing to an external authoritative profile (Wikipedia, Wikidata, LinkedIn, Crunchbase, GitHub, etc.). Generative engines rely heavily on entity grounding to disambiguate brands and people before deciding what to say about them; without it, an AI answer engine may confuse this entity with a similarly named one or simply have less confidence citing it.
How to fix it & effect on score: Add a sameAs array to your Organization/Person JSON-LD listing this entity's Wikipedia/Wikidata page (if one exists) and other authoritative profiles. Fixing this removes the 6 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
geo-noai-directive
Page includes a generative-AI opt-out directive
| Severity | Weight | Category |
|---|---|---|
| Medium | 6 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: The robots meta tag includes (comma-separated list of the specific items found), an emerging token that some AI crawlers and training pipelines respect as an explicit opt-out. If this content is meant to be eligible for AI answer engines, this directive works directly against that.
How to fix it & effect on score: Remove noai/noimageai from the robots meta tag if you want this content eligible for generative-engine answers; keep it only if the opt-out is intentional. Fixing this removes the 6 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
What a pass looks like: No noai/noimageai directive blocking generative use
geo-statistics-density
No statistics, percentages, or figures found in the content
| Severity | Weight | Category |
|---|---|---|
| Medium | 5 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: The page has roughly N words of body text but no detectable numeric statistics, percentages, or dollar figures. Generative engines disproportionately lift and cite pages that back claims with concrete, quotable numbers rather than purely qualitative statements.
How to fix it & effect on score: Where relevant, back key claims with specific figures (percentages, counts, dates, dollar amounts) rather than vague qualifiers like "many" or "significant". Fixing this removes the 5 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
What a pass looks like: Content includes N quotable statistic(s)/figure(s)
geo-table-headers
N of N table(s) on the page has/have no header cells
| Severity | Weight | Category |
|---|---|---|
| Low | 4 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Tables without <th> header cells (in a <thead> or the first row) don't tell an extraction pipeline what each column or row represents, so generative engines are far less likely to lift the data accurately into a generated answer or comparison.
How to fix it & effect on score: Add <th scope="col"> (or scope="row") header cells to every data table so each value's meaning is unambiguous without visual layout. Fixing this removes the 4 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
What a pass looks like: Data tables use proper header cells, making them reliable for generative engines to extract
geo-attributed-quotes-missing
No directly attributed quotations found
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: No quoted statements tied to a named source (e.g. '"...", said/according to...') were found in the body text. Attributed quotes give generative engines a low-risk, verifiable snippet to reproduce, which increases the odds a page gets cited rather than paraphrased or skipped.
How to fix it & effect on score: Where you're citing an expert, customer, study author, or spokesperson, quote them directly and attribute the quote by name. Fixing this removes the 3 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
geo-content-chunking
At least one section runs to roughly N words without a subheading
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Generative engines and RAG pipelines typically retrieve content in heading-bounded chunks. A long run of text under a single heading is harder to retrieve precisely and more likely to be partially or incorrectly quoted.
How to fix it & effect on score: Break long sections into smaller subsections with their own H3 headings, each covering one idea. Fixing this removes the 3 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
What a pass looks like: Content is broken into well-sized, heading-bounded sections
geo-sentence-length
Average sentence length is N words
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Generative engines tend to extract and quote short, self-contained sentences rather than paraphrase long, clause-heavy ones. This page's prose runs long on average, making individual sentences harder to lift cleanly into a generated answer.
How to fix it & effect on score: Break long sentences into shorter, single-idea statements, especially in sections most likely to be quoted (openings, key claims, definitions). Fixing this removes the 3 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
What a pass looks like: Average sentence length (N words) is easy to quote
geo-attributed-quotes
Content includes N directly attributed quote(s)
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: Content includes N directly attributed quote(s). There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
geo-entity-grounding
Organization/Person schema links to Wikipedia or Wikidata for entity disambiguation
| Severity | Weight | Category |
|---|---|---|
| Positive signal | 0 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: This rule only ever surfaces as a passing signal in the current source — it fires (as a pass) when: Organization/Person schema includes sameAs links to authoritative external profiles. There is no separate failing issue() call under this exact id; the failure condition is the logical negation of the pass condition, and in most cases is covered by a related rule id documented elsewhere in this category (see the table above for a sibling rule on the same feature).
Effect on score: Meeting this condition costs nothing and confirms a positive signal. Missing it doesn't directly deduct points under this id — it typically shows up as a deduction under the related failing rule instead.
geo-x-robots-noindex
The server sends X-Robots-Tag: noindex
| Severity | Weight | Category |
|---|---|---|
| Critical | 14 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: The HTTP response header keeps the page out of search indexes, and so out of the AI answers built on them (Google AI Overviews, Copilot, ChatGPT search), even when the HTML has no noindex tag. Gate: while this fails, the category score is capped at 40, so strengths elsewhere can't hide it.
How to fix it & effect on score: Remove noindex from the X-Robots-Tag header unless the page is meant to be private. Fixing this removes the 14 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: official requirement (documented by the engine or standard).
geo-schema-incomplete
Structured-data items are missing required fields
| Severity | Weight | Category |
|---|---|---|
| Low | 4 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Schema types lack the fields that define them (e.g. LocalBusiness without address or telephone, Article without author or datePublished, Organization without logo). Engines skip or misread incomplete schema.
How to fix it & effect on score: Fill in the missing properties with the real values shown on the page. Fixing this removes the 4 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: official requirement (documented by the engine or standard).
geo-entity-name-mismatch
The brand name in structured data doesn't match the page
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: The Organization/LocalBusiness schema name differs from og:site_name or the title (legal suffixes like LLC are ignored). Conflicting names can split mentions between two "different" businesses.
How to fix it & effect on score: Use one brand name across schema, og:site_name and the title. Fixing this removes the 3 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: heuristic (a best-practice signal; thresholds are judgement calls).
geo-unsourced-stats
N of M statistics have no source
| Severity | Weight | Category |
|---|---|---|
| Low | 4 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Most statistics on the page have no link or "according to" attribution nearby. Engines prefer figures they can trace to a source. (Idea from geo-lint; the Princeton GEO study found cited sources and statistics raise visibility.)
How to fix it & effect on score: Link each statistic to its source or say who measured it. Fixing this removes the 4 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: research-backed (Aggarwal et al., "GEO: Generative Engine Optimization", KDD 2024).
geo-stale-year
The title or headings present a past year as current
| Severity | Weight | Category |
|---|---|---|
| Low | 3 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: A year older than last year appears in the title or H1/H2 as if current ("Best cafés in Dubai 2023"). History phrasing ("since 2015") and ranges are ignored.
How to fix it & effect on score: Update the content and the year, or drop the year. Fixing this removes the 3 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: heuristic (a best-practice signal; thresholds are judgement calls).
geo-vague-opening
The page opens with filler instead of the point
| Severity | Weight | Category |
|---|---|---|
| Low | 2 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: The first paragraph starts with a greeting or scene-setting line ("Welcome to…", "In today's world…"). Engines quote opening lines most.
How to fix it & effect on score: Open with one or two sentences stating what the page offers or answers. Fixing this removes the 2 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: heuristic (a best-practice signal; thresholds are judgement calls).
geo-section-context
Sections start by referring back to earlier text
| Severity | Weight | Category |
|---|---|---|
| Low | 2 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Two or more sections begin with "This…", "It…" or "As mentioned above…". Engines retrieve sections on their own; lifted alone, these lose their subject. (Idea from geo-lint.)
How to fix it & effect on score: Start each section by naming its subject in full. Fixing this removes the 2 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: heuristic (a best-practice signal; thresholds are judgement calls).
geo-acronyms
Acronyms are never spelled out
| Severity | Weight | Category |
|---|---|---|
| Informational | 1 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Acronyms used repeatedly are never expanded. A quoted passage can't rely on the reader knowing them. (Idea from geo-lint.)
How to fix it & effect on score: Spell each out the first time, e.g. "Customer Relationship Management (CRM)". Fixing this removes the 1 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: heuristic (a best-practice signal; thresholds are judgement calls).
geo-summary-missing
Long page has no summary near the top
| Severity | Weight | Category |
|---|---|---|
| Low | 2 pts | GEO (Generative Engine Optimization) |
What triggers it & why it matters: Pages of 1,200+ words with no TL;DR, key takeaways or summary block early on. A short summary gives engines a ready-made answer.
How to fix it & effect on score: Add a 2–4 bullet summary after the introduction. Fixing this removes the 2 pts deduction from the GEO (Generative Engine Optimization) category score on the next scan.
Evidence: heuristic (a best-practice signal; thresholds are judgement calls).