Classic SEO optimised for the ten blue links. GEO — Generative Engine Optimization — optimises for the one paragraph an LLM pastes above them. ChatGPT browse, Perplexity, Google AI Overviews, Bing Copilot all work the same way: query → retrieve top-N pages → synthesise a ~200-word answer → cite 3-5 sources. Ranking #1 in classic SEO doesn't mean you're the cited source in the AI answer.
This guide covers the patterns that get your page cited.
Why GEO is different from SEO
Classic SEO targets a query → click
Title tag, meta description, headings, backlinks, word count. Success = reader clicks to your site. Page content after the click is secondary.
GEO targets a query → quote
Answer paragraphs, citation-worthy sentences, structured facts. Success = the LLM synthesiser pulls your exact sentence into its answer. The reader may never click — they got the answer.
Classic SEO rewards length
Longer pages rank better in most niches. 1500+ words is table stakes.
GEO rewards density
The best 3-sentence paragraph on the topic wins the citation. Long pages get their best chunks picked and the rest ignored.
The seven patterns
1. Lead-with-the-answer
LLMs retrieve chunk-by-chunk. The first chunk that matches the query wins. Put the answer in the first paragraph, not after a build-up.
❌ Build-up — LLM retrieves the intro paragraph, has nothing to cite
# Rate limits
Acme implements a rate-limiting system to protect our infrastructure
and ensure fair use for all customers. We continually monitor...
✅ Answer first — LLM retrieves the first paragraph, has the limit to cite
# Rate limits
Default limit: 100 requests per minute per API key. Enterprise plans
scale to 1000/min. Exceed the limit → HTTP 429 with `Retry-After` header.2. Query-matching headings
The retrieval step matches query keywords to heading text. "How do I add a CAA record" searches for "CAA record" — make sure your heading says that exactly, not "DNS records" or "SSL preparation".
❌ Vague ✅ Query-matching
## DNS ## CAA records
## Configuration ## Environment variables
## More info ## Rate limit error codes (429)
## Getting started ## Install the SDK via npmOne query per heading. Multiple-question headings ("DNS + SSL + CAA") confuse the matching.
3. Quotable fact sentences
LLMs pull sentences, not paragraphs. Write sentences the synthesiser can drop into an answer without editing.
Complete. "Default limit: 100 req/min" beats "we set a reasonable limit."
Self-contained. "Acme's API returns JSON." beats "It returns JSON." — pronouns don't survive chunking.
Imperative when instructive. "Add the CAA record:
acme.com. IN CAA 0 issue letsencrypt.org" beats "You might want to add a CAA record."
4. Structured data wins citations
LLMs prefer quoting structured content over prose. Given two equivalent pages, the one with a table gets cited.
Tables
Per-field semantics, numeric limits, pricing tiers, HTTP status codes. LLMs quote table rows intact.
Code blocks
Commands, config snippets, curl examples. Round-trip cleanly through every LLM.
ParamField / ResponseField
API docs with explicit type / required / default cite cleanly. Loose prose descriptions ("you'll probably want to set...") don't.
Step-by-step lists
Imperative numbered steps are the highest-citation format for how-to content. Paragraph walkthroughs lose.
5. Canonical URL + <link rel="canonical">
LLMs cite URLs. If your page lives at https://docs.acme.com/api/custom-domain but the canonical URL points to https://acme-docs.vercel.app/api/custom-domain, the LLM cites the Vercel URL — embarrassing and potentially broken on deploy.
NookDocs emits canonical tags automatically. When you add a custom domain and mark it primary, every page's <link rel="canonical"> updates. Verify once after adding a domain:
curl -sI https://docs.acme.com/any-page | grep -i canonical
# Link: <https://docs.acme.com/any-page>; rel="canonical"6. First-paragraph definition
Glossary-style first paragraphs rank in answer boxes. LLMs synthesise "what is X?" questions by pulling the first definition they find.
✅ First paragraph defines the term
# Rate limits
Acme enforces 100 requests per minute per API key by default, returning
HTTP 429 with a `Retry-After` header when exceeded. Enterprise customers
can request higher limits via support.This one paragraph will cite for "what is Acme's rate limit", "how many req/min does Acme allow", "does Acme rate limit by API key", and "what HTTP status does Acme return for rate limit?".
7. Freshness signals
LLMs prefer fresh sources when synthesis uncertainty is high. Signals the retrieval step uses:
<time>tags + ISO dates in visible prose ("Updated 2026-04-20")NookDocs' Last Updated footer — automatically emitted from the last git commit touching the file
Year in heading or subtitle — "2026 API changes", "Q2 2026 updates"
Changelog pages with recent
<Update date="...">entries
Dates from 2+ years ago get deprioritised. Pages with no date at all get assumed-stale and deprioritised further.
Where each AI engine gets its content
| Engine | How it fetches your page | GEO implication |
| ChatGPT (browse) | Bing search → top N → read HTML + render | Classic SEO signals matter for the initial retrieval. GEO structure matters for citation. |
| Perplexity | Own index + Bing. Checks /llms.txt when present. | /llms.txt presence is a real signal. NookDocs auto-generates. |
| Claude.ai Projects | User pastes URL. Claude fetches HTML + checks /llms.txt / /<slug>.md. | LLM-optimised endpoints win — ship both. |
| Google AI Overviews | Same index as Google search. Schema.org + featured-snippet patterns rank. | JSON-LD TechArticle / BreadcrumbList / Organization / FAQPage — NookDocs emits these automatically (tune via GEO config). |
| Bing Copilot | Bing index + content-type negotiation. | Accept: text/markdown returns raw MDX (roadmap on our side). .md URL suffix works today. |
| Google Gemini / Bard | Google index. Schema-driven. | Same as AI Overviews. |
Takeaway: emit rich HTML for classic search bots, AND emit /llms.txt + /<page>.md for AI crawlers. NookDocs does both automatically.
What NookDocs emits automatically
Every page ships JSON-LD structured data — the format AI Overviews, Perplexity, and Gemini parse to understand and cite a page:
TechArticle— headline, description, dates, author, keywords, licenseBreadcrumbList— the page's place in your nav hierarchyOrganization+WebSite— your publisher entity (name, logo,sameAs)FAQPage— from a page's frontmatterfaq(see below)
Tune it with the geo config block: set your
organization.sameAs profiles, primary topics, content license, and a
custom /llms.txt intro. You can also control which AI crawlers may access
your site (geo.aiCrawlers). Everything is on by default — a site with no
geo block still emits sensible structured data.
FAQ schema
Add a faq array to any page's frontmatter and NookDocs emits a FAQPage —
the single most cited format in answer engines:
---
title: Rate limits
faq:
- q: What is the default rate limit?
a: 100 requests per minute per API key.
- q: What happens when I exceed it?
a: The API returns HTTP 429 with a Retry-After header.
---Anti-patterns
Measuring GEO success
Classic SEO tracks impressions, clicks, rankings. GEO tracking is harder because AI engines don't expose impressions or ranks. Proxies that work:
AI traffic referrer. Check for
chat.openai.com,perplexity.ai,claude.ai,gemini.google.comin your analytics referrer field. Not precise but signals "users are coming here from AI answers".Manual LLM spot-checks. Weekly, ask the top 5-10 questions about your product in ChatGPT + Perplexity + Google AI. Note whether your docs are cited. Trend over time.
Brand mention tracking. Tools like Profound, Otterly, HubSpot AI Grader track "does the LLM mention your brand when answering relevant questions?". Early-stage, mostly heuristic.
Expect messy data. The discipline is about patterns (see the seven above), not dashboard-watching.
Related
Writing for LLMs — sibling guide, focused on the authoring mechanics
Style and tone — foundations
Content types — Diátaxis helps you split mega-pages into focused ones
llms.txt — the auto-generated LLM crawler index
SEO — classic search optimisation that complements GEO
Markdown export — the
/<page>.mdendpoint