← All Skills
AI Skill

aeo-audit

Last updated: 2026-05-17

Run a complete AEO health audit on a deployed site — discovery files, crawler access, citation-shaped content, schema, freshness signals. Triggers — 'AEO audit'

Quick Install
npx skills add aeo-audit

Skill: AEO Health Audit

Three-tier audit of how well a site is set up for AI answer engines (ChatGPT, Claude, Perplexity, Gemini, Bing Copilot). Run weekly for Tier 1, monthly for Tier 2, quarterly for Tier 3.

Inputs

  • DOMAIN — e.g. acme.com
  • CANONICAL_URL — e.g. https://www.acme.com
  • SAMPLE_PAGES (optional) — list of 5-10 high-value page URLs to deep-audit. Default: pull from sitemap, take top 10 by sitemap priority.

Tier 1 — Discovery surface (must pass weekly)

For each check, use WebFetch to retrieve the URL, then verify the body content matches the assertion.

#CheckHow to verifyPass criteria
1/robots.txt reachable + permissiveWebFetch {URL}/robots.txtBody contains GPTBot, ClaudeBot, PerplexityBot, Google-Extended, OAI-SearchBot. None blocked.
2/llms.txt reachableWebFetch {URL}/llms.txt200, ≥ 500 chars, contains brand name in first 100 chars, has Last Updated line within 90 days
3/llms-full.txt reachable (if used)WebFetch {URL}/llms-full.txt200, ≥ 10 KB OR clear "site too small for full dump" comment
4/.well-known/ai-plugin.json valid JSONWebFetch + JSON.parseSchema fields present: schema_version, name_for_human, description_for_model, contact_email
5/sitemap.xml reachableWebFetch + XML parse200, valid XML, ≥ 1
6/sitemap-llm.xml exists (if site > 100 pages)WebFetch200 OR explicit "skipped intentionally" rationale
7Canonical URL agreesWebFetch {URL}/, parse href = CANONICAL_URL (or with trailing slash)
8HTTPS onlycurl -I http://{DOMAIN}301/302 to https
9No noindex on cornerstone pagesFetch each SAMPLE_PAGES, check None says noindex unless intentional
10Server-rendered content (not JS-only)WebFetch + check whether main content appears in raw HTMLPrimary content present without JS execution
Output Tier 1: Pass/fail table. Any fail = block of ≥ 1 line in remediation.

Tier 2 — Page-level citation-readiness (monthly)

For each SAMPLE_PAGES URL, fetch and score:

A. Answer-first lede (40-60 words)

  • Read the first paragraph after the H1.
  • Does it directly answer the page's implied question?
  • Word count between 40-80?
  • Score: 0 (no), 1 (partial), 2 (yes — quotable)

B. Fact anchors (specific numbers)

  • Count specific numbers/dates/proper nouns in first 300 words.
  • ≥ 3 = good (citation-shaped). 0-2 = weak (vague claims).
  • Score: 0/1/2

C. Heading structure

  • One H1, multiple H2s, H3s nested under H2s.
  • H2s phrased as questions when natural ("What is X?", "How does Y work?").
  • Score: 0 (no H1, or all H1s, or random), 1 (clean hierarchy), 2 (clean + question-shaped H2s)

D. FAQ / HowTo / Article schema

  • Inspect <script type="application/ld+json">.
  • Count distinct schema types per page.
  • Page should have ≥ 1 of: Article, FAQPage, HowTo, Product, WebAPI, depending on intent.
  • Score: 0 (none), 1 (one type), 2 (multiple appropriate types)

E. Last Updated visible to users + crawlers

  • Look for dateModified in schema.
  • Look for visible "Last updated: YYYY-MM-DD" in page body.
  • Date within 90 days?
  • Score: 0 (no date), 1 (date but stale), 2 (date + recent)

F. Tables and lists

Quality gate before declaring "done"

The audit itself must pass:

  • [ ] All Tier 1 checks ran against live URLs (not cached/local)
  • [ ] Tier 2 sample is ≥ 5 distinct page types (homepage, alternatives, vs, blog, glossary)
  • [ ] Output identifies ≥ 1 specific, actionable fix per failing check (not "improve content")
  • [ ] Maturity level is grounded in the actual signals observed, not aspirational

Common gotchas

  1. Cloudflare / WAF blocking AI bots — robots.txt allows them, but the WAF/bot-fight rule blocks the IPs. Check Cloudflare settings; add Verified Bots allowlist for AI crawlers.
  2. noindex from staging environment — staging meta tag accidentally shipped to prod. Always grep prod HTML for noindex before signing off.
  3. AI plugin manifest with stale models/pricing — JSON gets crawled and quoted verbatim by AI. Date-stamp it; refresh quarterly.
  4. Schema validation passing but not eligible — Google's Rich Results Test says "valid" but page doesn't appear with rich snippets. Schema must align with page intent (don't add FAQPage schema to a page where the FAQ isn't the primary content).
  5. AI bot traffic count = 0 — most likely cause: server logs aren't capturing bot user-agents (CDN strips them), not that bots aren't crawling. Check log pipeline before concluding "AI doesn't crawl us."