The AEO audit checklist: earning citations in answer engines
An AEO audit checks whether answer engines can extract a citable answer from your pages. Answer engine optimization is narrower than general AI legibility: the engine has a specific question, it wants a specific answer, and it will cite the page that provides one with the least work.
That makes this a different pass from a crawl-and-legibility audit. If you have not confirmed that AI crawlers can fetch and read your pages at all, run the GEO audit checklist first. This checklist assumes access and audits for citation.
Each check below names what to verify, why answer engines care, and how to confirm it. Run it on the pages you most want cited, not the whole site.
1. Question-shaped headings
Verify: your section headings match the questions people actually ask.
Why it matters: answer engines match a user question against your page structure before they read your prose. A heading like "How long does a site migration take" is a direct index entry. A heading like "Our approach" indexes nothing.
Check it: list your H2s and read them as search queries. If a heading could not plausibly be typed by a person with a problem, it is costing you matches. Keep brand-voice headings on brand pages and question-shaped headings on content meant to be cited.
2. A direct answer in the first paragraph
Verify: the first paragraph under a question-shaped heading answers the question completely.
Why it matters: engines prefer spans that stand alone. When the answer arrives after context, caveats, and a story, the extractable span is buried, and a competitor page with a first-sentence answer wins the citation.
Check it: for each key section, read only the first sentence. It should carry the subject, the answer, and the qualifier in one line, with detail following it rather than preceding it. This post opens the same way on purpose.
3. Fact density and quotable sentences
Verify: your key pages contain concrete, self-contained statements of fact.
Why it matters: citations are built from sentences, and vague sentences are unquotable. "Scans complete in about two minutes" can be reused verbatim. "Blazing-fast results" cannot, because it asserts nothing checkable.
Check it:
curl -s https://yoursite.com/pricing | sed -e 's/<[^>]*>//g' | grep -Eo '[0-9][0-9,.]*( percent|%| minutes| days| dollars)?' | head
If the pages you want cited surface few numbers, dates, or named specifics, add them. Every number should trace to a real measurement or carry a sample label.
4. FAQ and HowTo structured data
Verify: pages that answer questions or teach procedures declare it in JSON-LD.
Why it matters: FAQPage and HowTo markup hands the engine pre-segmented question-and-answer pairs, which is precisely the shape it wants to serve. Typed markup also disambiguates: the engine no longer guesses where an answer starts and ends.
Check it: fetch the page and read the JSON-LD blocks:
curl -s https://yoursite.com/faq | grep -o 'application/ld+json'
Then validate one page in a rich-results view. Every post on this blog ships Article and BreadcrumbList JSON-LD generated from the same frontmatter that renders the page, so the markup cannot drift from the visible content. Generating markup from one source of truth is the pattern to copy.
5. Entity consistency
Verify: your organization name, address, and profile links are identical everywhere they appear.
Why it matters: answer engines resolve your site to an entity before they trust it as a source. A name spelled three ways, or an Organization block whose sameAs links point to dead profiles, fragments that entity and dilutes every citation signal you earn.
Check it: grep your rendered pages, JSON-LD, and footer for the organization name and compare byte for byte. Then open each sameAs URL and confirm it is live and actually yours.
6. Primary-source citations on claims
Verify: every factual claim on your key pages links to or names its source.
Why it matters: engines weigh evidence chains. A statistic with a named primary source is a strong span. An orphan statistic is a liability, because the engine can neither verify it nor attribute it, and pages full of unsourced claims read as generated filler.
Check it: read your top page and mark every sentence that asserts a number or an external fact. Each mark needs a source a reader could follow. On this site, posts carry a Sources section with first-party evidence for each marked claim.
7. Time to render for crawler budgets
Verify: the answer-bearing HTML arrives fast, ideally under one second at the origin.
Why it matters: answer engines fetch at question time as well as at index time, and slow origins get sampled less and cited less. The budget is spent on your time to first byte and full HTML delivery, not on your client-side polish.
Check it:
curl -s -o /dev/null -w "ttfb %{time_starttransfer}s total %{time_total}s\n" https://yoursite.com/
Run it three times and take the median. If TTFB is slow, fix caching at the edge before touching page weight.
8. Freshness signals
Verify: published and updated dates are visible, marked up, and true.
Why it matters: for time-sensitive questions, engines discount pages that look abandoned. A visible updated date, a matching dateModified in JSON-LD, and an accurate sitemap lastmod are three agreeing witnesses. Faking any of them without changing content teaches engines to distrust all three.
Check it:
curl -s https://yoursite.com/blog/your-post | grep -Eo '"date(Published|Modified)":"[^"]*"'
Compare against the visible byline and the sitemap entry for the same URL.
9. One question per URL
Verify: each page owns one primary question instead of competing with your own pages.
Why it matters: when three of your URLs half-answer the same question, the engine picks lazily or picks none. One canonical page per question concentrates the signal, and supporting pages should link to the owner rather than restate it.
Check it: search your own site for your highest-value question phrase. If more than one page could plausibly be the answer, consolidate, and pick the owner deliberately.
10. A full-text surface for machine readers
Verify: your site offers a complete machine-readable content inventory, not just a link list.
Why it matters: some answer pipelines work from bulk text rather than page-by-page crawling. Serving your public content in one predictable file removes every rendering obstacle between your facts and the engine. index365.co publishes a generated llms-full.txt that carries the full text of its public pages alongside the shorter llms.txt inventory, so machine readers can ingest the whole site in one fetch.
Check it:
curl -s https://yoursite.com/llms-full.txt | wc -c
A zero or a 404 means the surface does not exist yet. It is one route to add, and it serves exactly the audience this checklist is for.
Make it a habit, not a project
Citation is won page by page and lost silently. The checks above are mechanical enough to automate, which is the point: the AI-Readiness scan runs this class of checks on request and returns trusted Findings your coding agent can use, so an AEO regression becomes a Finding instead of a slow traffic decline.