Agent-Ready SEO
Optimizing for search used to have one reader. It now has three, and they want
different things from the same text.
| Discipline |
Reader |
What success looks like |
| SEO |
The crawler that builds an index |
Position and click |
| AEO |
The agent that fetches and summarizes |
Read in full, without noise |
| GEO |
The model composing an answer |
Being the cited source |
Most sites are built for the first reader only. This skill covers the other two
without breaking the first, and the three layers share one content source rather
than becoming three codebases.
The load-bearing claim: a generative engine cites numbers, dates, sources and
methods. It does not cite restated common knowledge. So the work splits in two
halves that must both happen. Publish something only you can publish (GEO), and
make it trivially machine-readable (AEO). Doing only the second makes you easy to
read and forgettable.
Start here: what is the task?
Read the reference for the layer in play. Do not read all of them.
| The user wants to |
Read |
Then copy from |
Serve clean text to LLMs, add llms.txt, avoid duplicate-content risk |
references/agent-layer.md |
templates/next/markdown-response.ts, md-route.ts, rewrites.ts, page-metadata.ts, llms-txt.ts |
| Make a gated SaaS (public marketing + logged-in app) stop answering 200 for every path |
references/agent-layer.md (gated applications) |
templates/next/gated-app-404.ts |
| Turn proprietary data into something quotable: an index, a dated snapshot, a methodology page |
references/citable-data.md |
templates/next/index-basket.ts, dataset-jsonld.ts |
| Generate many pages from data without creating thin content |
references/pseo.md |
templates/next/sitemap.ts, sitemap-sharded.ts |
| Fix the technical base: sitemap, robots, canonical, titles, IndexNow, social images |
references/foundations.md |
templates/next/sitemap.ts, robots.ts |
| Decide which structured data type a page needs |
references/schema-catalog.md |
templates/next/dataset-jsonld.ts |
| Know whether any of it worked, and where AI traffic lands |
references/measurement.md |
templates/next/first-touch.ts |
| Change titles or templates as an experiment, without touching URLs |
references/measurement.md (experiments), references/foundations.md (titles) |
templates/next/seo-metadata.ts |
| Keep articles correct after the code they explain changes |
references/foundations.md (entities and authorship) |
templates/generic/content-review.js |
| Audit an existing site, or review a plan before building |
references/pitfalls.md |
none |
| Check that any of it actually works, in production or in CI |
references/verification.md |
none |
Templates are working code with the framework-neutral contract stated at the top
of each file. templates/generic/ holds the same contract as raw HTTP plus one
non-framework implementation, for stacks other than Next.js.
The order that works
Each step depends on the one before it. The most common failure is doing them
backwards: writing a hundred pages before having anything different to say.
- Survey the competition before writing. You need to know what is already
occupied and where the gap is. An afternoon of teardown saves months of
redundant content.
- Find the data only you have. This decides whether GEO is available to you
or only SEO. Without proprietary data, all that is left is writing better than
everyone else, which is much slower.
- Fix the technical base. Sitemap, robots, canonical, titles, structured
data. Cheap, fast, and what stops the rest of the effort from leaking.
- Ship the free tool before the content. A no-login calculator or checker
answers practical-intent queries better than any article, and it is what earns
unsolicited links. It is also what still gets the click: on one property the
guides sat near one percent click-through and the tools of the same segments
at three to six, at the same position, because the informational query is
increasingly answered on the results page and the click that survives is for
a page that does the thing. The tool must deliver to an anonymous visitor
what its title promises; gate saving and exporting, not the result.
- Only then scale pages per segment, with real data per page. If a page does
not answer something only you can answer, it should not exist.
- Add the agent layer. Text version,
llms.txt, canonical stitching the two.
Do it after the base is ready, because it mirrors content that already exists.
- Instrument before expecting results. First-touch attribution and search
console configured before traffic arrives, or the first months are lost data.
Verify the layer against production, and consider an external scorer as a
second opinion. See
references/verification.md. Any later change to
titles or templates is an experiment with a register, a control and a
baseline taken before the deploy; see references/measurement.md.
- Treat the data as a recurring publication. An index that stops updating
stops being citable within two months. The routine is part of the asset.
Non-negotiables
These hold regardless of stack, market or CMS. Violating one usually undoes the
rest of the work.
- Never ask a search engine to index two versions of the same text. The
markdown twin stays out of the sitemap and declares the HTML page as canonical.
Discovery for agents happens through
llms.txt, rel=alternate and a
predictable URL pattern.
- Generate, do not copy. Any second rendering of content (markdown twin,
llms.txt, a pricing summary) must be derived from the same source as the page.
Where a hand-maintained copy is unavoidable, say so and schedule an audit.
- Structured data that contradicts the page is worse than no structured data.
A model reads the declared block, not your table. A wrong number there gets
repeated with your name attached.
- Emit
lastmod only when a real content date backs it. A per-deploy
timestamp teaches crawlers to distrust the field entirely. Absent beats false.
- Let AI crawlers in, on purpose. Blocking them guarantees you are never
cited, at the exact moment that channel is growing. If the strategy is to be
the source, the reader has to be allowed in.
- Publish the aggregate, gate the live. Dated snapshots, methodology and
educational material are what get cited; per-user, current and personalized
data is what people pay for. That line is also what keeps a data business from
giving itself away.
- A page must answer something only you can answer. This is the single test
that separates programmatic SEO from doorway pages, and it applies before the
template is written, not after the penalty.
- No invented ratings, no fabricated review counts. Aggregate rating markup
without real reviews is the fastest way to lose rich results permanently.
- An unknown path answers 404, even behind an auth gate. A default-deny
middleware that redirects everything to a 200 login page tells every agent
that every URL exists. Keep the deny; distinguish "gated" from "nothing".
- Verify against the deployed site, from outside. The edge can override
robots.txt, the framework can drop a header, and a dev server hides both.
Using the templates
Every template is self-contained and starts with a comment block stating the
contract it implements, so it can be read without this skill loaded.
Adapt rather than transplant:
- Replace
SITE_URL with the canonical host, including the www decision.
- Replace the example content sources (
getGuides, getPosts) with the project's
real ones. Never leave a template's placeholder data in a shipped file.
- Keep the comments that explain a constraint (why
lastmod is conditional, why
the item route precedes the region route). Drop the ones that narrate the
template itself.
- Check the framework note at the bottom of each file before porting.
When the project is not Next.js, read templates/generic/contract.http first: it
states the observable behavior each endpoint must have, which is what actually
matters. The framework is an implementation detail of that contract.
Scope
In scope. Publishing and serving: the agent layer, citable datasets,
programmatic pages, the technical base, structured data, attribution of AI
referrals.
Also out of scope. Making the product operable by an agent: authentication
an agent can complete, controls it can drive, an API or MCP server for your
product, a machine-payable checkout. External scorers weight those heavily, so a
site that follows this skill completely will still not score full marks. That is
expected. See the layer mapping in references/verification.md.
Out of scope. Acquiring the data in the first place (scraping, licensing,
normalization pipelines) is a separate discipline with its own legal and ethical
constraints. This skill assumes the data exists and is yours to publish.
Adjacent skills. seo-audit for hunting on-page issues, programmatic-seo
for keyword-side opportunity sizing, schema-markup for a broader catalog of
types, copywriting for the words themselves.
1---2name: agent-ready-seo3description: Use when a site needs to be readable and citable by AI answer engines as well as search crawlers. Covers the markdown twin layer, llms.txt, structured data, programmatic pages backed by real data, publishing a citable dataset, and attributing AI referrals. Also use when the user mentions "AEO", "GEO", "answer engine optimization", "generative engine optimization", "llms.txt", "llms-full.txt", "markdown version of my pages", "get cited by ChatGPT", "AI search traffic", "AI crawlers", "JSON-LD", "structured data", "Dataset schema", "programmatic SEO", "thin content", "doorway pages", "sitemap", "canonical", "IndexNow", "title tag", "CTR", "click-through rate", "Search Console", "title experiment", or "where is my AI traffic coming from". For persuasion and page copy see copywriting; for classic on-page issue hunting see seo-audit.4license: MIT5---67# Agent-Ready SEO89Optimizing for search used to have one reader. It now has three, and they want10different things from the same text.1112| Discipline | Reader | What success looks like |13| --- | --- | --- |14| **SEO** | The crawler that builds an index | Position and click |15| **AEO** | The agent that fetches and summarizes | Read in full, without noise |16| **GEO** | The model composing an answer | Being the cited source |1718Most sites are built for the first reader only. This skill covers the other two19without breaking the first, and the three layers share one content source rather20than becoming three codebases.2122**The load-bearing claim:** a generative engine cites numbers, dates, sources and23methods. It does not cite restated common knowledge. So the work splits in two24halves that must both happen. Publish something only you can publish (GEO), and25make it trivially machine-readable (AEO). Doing only the second makes you easy to26read and forgettable.2728---2930## Start here: what is the task?3132Read the reference for the layer in play. Do not read all of them.3334| The user wants to | Read | Then copy from |35| --- | --- | --- |36| Serve clean text to LLMs, add `llms.txt`, avoid duplicate-content risk | `references/agent-layer.md` | `templates/next/markdown-response.ts`, `md-route.ts`, `rewrites.ts`, `page-metadata.ts`, `llms-txt.ts` |37| Make a gated SaaS (public marketing + logged-in app) stop answering 200 for every path | `references/agent-layer.md` (gated applications) | `templates/next/gated-app-404.ts` |38| Turn proprietary data into something quotable: an index, a dated snapshot, a methodology page | `references/citable-data.md` | `templates/next/index-basket.ts`, `dataset-jsonld.ts` |39| Generate many pages from data without creating thin content | `references/pseo.md` | `templates/next/sitemap.ts`, `sitemap-sharded.ts` |40| Fix the technical base: sitemap, robots, canonical, titles, IndexNow, social images | `references/foundations.md` | `templates/next/sitemap.ts`, `robots.ts` |41| Decide which structured data type a page needs | `references/schema-catalog.md` | `templates/next/dataset-jsonld.ts` |42| Know whether any of it worked, and where AI traffic lands | `references/measurement.md` | `templates/next/first-touch.ts` |43| Change titles or templates as an experiment, without touching URLs | `references/measurement.md` (experiments), `references/foundations.md` (titles) | `templates/next/seo-metadata.ts` |44| Keep articles correct after the code they explain changes | `references/foundations.md` (entities and authorship) | `templates/generic/content-review.js` |45| Audit an existing site, or review a plan before building | `references/pitfalls.md` | none |46| Check that any of it actually works, in production or in CI | `references/verification.md` | none |4748Templates are working code with the framework-neutral contract stated at the top49of each file. `templates/generic/` holds the same contract as raw HTTP plus one50non-framework implementation, for stacks other than Next.js.5152---5354## The order that works5556Each step depends on the one before it. The most common failure is doing them57backwards: writing a hundred pages before having anything different to say.58591. **Survey the competition before writing.** You need to know what is already60 occupied and where the gap is. An afternoon of teardown saves months of61 redundant content.622. **Find the data only you have.** This decides whether GEO is available to you63 or only SEO. Without proprietary data, all that is left is writing better than64 everyone else, which is much slower.653. **Fix the technical base.** Sitemap, robots, canonical, titles, structured66 data. Cheap, fast, and what stops the rest of the effort from leaking.674. **Ship the free tool before the content.** A no-login calculator or checker68 answers practical-intent queries better than any article, and it is what earns69 unsolicited links. It is also what still gets the click: on one property the70 guides sat near one percent click-through and the tools of the same segments71 at three to six, at the same position, because the informational query is72 increasingly answered on the results page and the click that survives is for73 a page that does the thing. The tool must deliver to an anonymous visitor74 what its title promises; gate saving and exporting, not the result.755. **Only then scale pages per segment,** with real data per page. If a page does76 not answer something only you can answer, it should not exist.776. **Add the agent layer.** Text version, `llms.txt`, canonical stitching the two.78 Do it after the base is ready, because it mirrors content that already exists.797. **Instrument before expecting results.** First-touch attribution and search80 console configured before traffic arrives, or the first months are lost data.81 Verify the layer against production, and consider an external scorer as a82 second opinion. See `references/verification.md`. Any later change to83 titles or templates is an experiment with a register, a control and a84 baseline taken before the deploy; see `references/measurement.md`.858. **Treat the data as a recurring publication.** An index that stops updating86 stops being citable within two months. The routine is part of the asset.8788---8990## Non-negotiables9192These hold regardless of stack, market or CMS. Violating one usually undoes the93rest of the work.9495- **Never ask a search engine to index two versions of the same text.** The96 markdown twin stays out of the sitemap and declares the HTML page as canonical.97 Discovery for agents happens through `llms.txt`, `rel=alternate` and a98 predictable URL pattern.99- **Generate, do not copy.** Any second rendering of content (markdown twin,100 `llms.txt`, a pricing summary) must be derived from the same source as the page.101 Where a hand-maintained copy is unavoidable, say so and schedule an audit.102- **Structured data that contradicts the page is worse than no structured data.**103 A model reads the declared block, not your table. A wrong number there gets104 repeated with your name attached.105- **Emit `lastmod` only when a real content date backs it.** A per-deploy106 timestamp teaches crawlers to distrust the field entirely. Absent beats false.107- **Let AI crawlers in, on purpose.** Blocking them guarantees you are never108 cited, at the exact moment that channel is growing. If the strategy is to be109 the source, the reader has to be allowed in.110- **Publish the aggregate, gate the live.** Dated snapshots, methodology and111 educational material are what get cited; per-user, current and personalized112 data is what people pay for. That line is also what keeps a data business from113 giving itself away.114- **A page must answer something only you can answer.** This is the single test115 that separates programmatic SEO from doorway pages, and it applies before the116 template is written, not after the penalty.117- **No invented ratings, no fabricated review counts.** Aggregate rating markup118 without real reviews is the fastest way to lose rich results permanently.119- **An unknown path answers 404, even behind an auth gate.** A default-deny120 middleware that redirects everything to a 200 login page tells every agent121 that every URL exists. Keep the deny; distinguish "gated" from "nothing".122- **Verify against the deployed site, from outside.** The edge can override123 `robots.txt`, the framework can drop a header, and a dev server hides both.124125---126127## Using the templates128129Every template is self-contained and starts with a comment block stating the130contract it implements, so it can be read without this skill loaded.131132Adapt rather than transplant:133134- Replace `SITE_URL` with the canonical host, including the `www` decision.135- Replace the example content sources (`getGuides`, `getPosts`) with the project's136 real ones. Never leave a template's placeholder data in a shipped file.137- Keep the comments that explain a constraint (why `lastmod` is conditional, why138 the item route precedes the region route). Drop the ones that narrate the139 template itself.140- Check the framework note at the bottom of each file before porting.141142When the project is not Next.js, read `templates/generic/contract.http` first: it143states the observable behavior each endpoint must have, which is what actually144matters. The framework is an implementation detail of that contract.145146---147148## Scope149150**In scope.** Publishing and serving: the agent layer, citable datasets,151programmatic pages, the technical base, structured data, attribution of AI152referrals.153154**Also out of scope.** Making the *product* operable by an agent: authentication155an agent can complete, controls it can drive, an API or MCP server for your156product, a machine-payable checkout. External scorers weight those heavily, so a157site that follows this skill completely will still not score full marks. That is158expected. See the layer mapping in `references/verification.md`.159160**Out of scope.** Acquiring the data in the first place (scraping, licensing,161normalization pipelines) is a separate discipline with its own legal and ethical162constraints. This skill assumes the data exists and is yours to publish.163164**Adjacent skills.** `seo-audit` for hunting on-page issues, `programmatic-seo`165for keyword-side opportunity sizing, `schema-markup` for a broader catalog of166types, `copywriting` for the words themselves.