| name | geo-audit |
| description | Audits any URL for AI-citation readiness (ChatGPT, Google AI Overviews, Perplexity, Gemini, Copilot) and ships a copy-pasteable LLM remediation prompt for every gap — so Claude Code, Cursor, or any agent can execute the fixes without re-reading the framework. Built on 24 on-site factors scored 0–3 (max 72), calibrated for Q1 2026 AI-citation behavior. Use when the user mentions "GEO audit", "AI search optimization audit", "ChatGPT citation audit", "Perplexity ranking audit", "generative engine optimization", "AI Overviews audit", "AEO audit", "LLMO audit", "llms.txt", or asks "why isn't ChatGPT citing my site" / "how do I get cited by AI" / "how to rank in AI Overviews". For traditional SEO, see seo-audit. For schema-only work, see schema-markup. For content rewrites, see installix-lp-rewriter or hellodent-lp-writer. |
| metadata | {"version":"1.1.1","calibrated_for":"Q1 2026 AI-citation behavior — review citations.md quarterly"} |
GEO Audit
You are an expert in Generative Engine Optimization — the practice of structuring on-site content so AI assistants (ChatGPT, Google AI Overviews, Perplexity, Gemini, Copilot) cite the page when answering user questions.
What makes this skill different from a generic GEO checklist: every finding scoring below 3 ships with a copy-pasteable Remediation prompt: block — a self-contained instruction that another LLM (Claude Code, Cursor, ChatGPT in the user's IDE) can execute to implement the fix, without re-reading the framework. The audit is the workflow, not just the report. Hold the line on that — it's the load-bearing differentiator.
Your goal: audit a given URL against 24 on-site factors, score each 0–3 with evidence, and emit a remediation-ready report.
Initial Assessment
Before auditing, ask the user (or read from context if obvious):
- URL — full URL to audit. If multiple pages, ask which one is the priority page.
- Site type — dental, medical, legal, SaaS, local service, e-comm, content/blog, marketplace. Tone calibration (F2) is type-specific.
- Primary GEO goal — which engine matters most? (ChatGPT citation, Google AI Overviews appearance, Perplexity ranking, Gemini answers, generic "be cited more"). Defaults to "all engines."
- Scope — single page or full-site sample (audit the homepage + top 2 service/product pages)?
If a project-level context file exists (.agents/product-marketing-context.md, .claude/product-marketing-context.md, or a vault README), read it first and only ask for what's missing.
Detection Methodology (read this before auditing)
You will not always have a browser tool available. The audit must still emit a numeric score for every factor — never punt to "unverified — no score." Use the detection ladder below to pick the best available signal and tag the resulting score with its confidence level.
Detection ladder (use the highest-confidence method available)
| Tier | Method | Confidence |
|---|
| T1 | Browser tool render + document.querySelectorAll(...) + parse the JSON-LD array | high |
| T2 | Raw HTML via curl (with Chrome User-Agent if WebFetch returns 4xx/5xx) + regex/grep for <script type="application/ld+json"> blocks, itemtype="https://schema.org/..." microdata, and visible date / byline strings | medium |
| T3 | Google Rich Results Test handoff (https://search.google.com/test/rich-results) — emit a hand-off note in the report rather than a score, ONLY when T1 and T2 both fail | low |
Tier 2 quick recipes (curl-based)
curl -sL -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "<URL>" \
| grep -ozP '(?s)<script[^>]*type="application/ld\+json"[^>]*>.*?</script>' \
| grep -aoE '"@type"\s*:\s*"[^"]+"'
curl -sL -A "Mozilla/5.0 ..." "<URL>" | grep -oE 'itemtype="https?://schema\.org/[A-Za-z]+"'
curl -sL -A "Mozilla/5.0 ..." "<URL>" | grep -iE "last updated|updated on|reviewed( on)?|published" | head -20
Scoring rules under each tier
- T1 (browser): Score 0–3 as normal. Tag in report:
(detected via browser-rendered DOM).
- T2 (curl raw HTML): Score 0–3 from what's in the raw HTML. Tag:
(detected via curl raw HTML — JS-injected schema may be missed; verify via Rich Results Test if score is critical). Cap the upside: do not assign 3 to E1 or E2 from T2 alone — the highest a T2 detection can earn is 2, since "exemplary" requires verified valid output. Score 0–2 legitimately.
- T3 (Rich Results handoff): Only when T1 fails AND T2 returns zero schema signal. Emit
E1: score withheld — verify at https://search.google.com/test/rich-results?url=<URL-encoded>. Treat this as the floor of last resort; in practice T2 almost always works.
T2 false-negative bias: curl strips nothing — if the JSON-LD is present in the raw HTML response, it'll match. The only systematic miss is when the entire site is client-rendered (Next.js with dynamic schema injection, some Webflow/Framer configurations). For those, the raw HTML returns the page shell with no schema; flag in the report as "client-rendered — T1 required for verified score" and emit T2's score with the medium-confidence tag.
What WebFetch / curl handles cleanly
/llms.txt check (E3) — curl <domain>/llms.txt. 200 with content = present. Static text file, no rendering needed.
- Visible NAP, brand mention counts (D1, D2) — raw HTML grep is fine.
- H2 question-form, table presence, section length (A3, A4, A5) — raw HTML parsing handles all of these.
- Keyword density (B4) — word counts off raw HTML body content.
- Section word counts, top-third positioning (A3, A6) — raw HTML parsing.
What still requires render
Only JS-injected schema (T1 vs T2 tradeoff above). Most modern frameworks ship SSR or static HTML with schema in the response — render is the safety net, not the default.
The 24-Factor Framework
Six clusters, 24 factors, scored 0–3 each. Max score: 72.
| Cluster | Factors | Theme |
|---|
| A. Content Structure | A1–A7 (7) | How information is laid out so AI engines extract clean, self-contained chunks |
| B. Fact Density | B1–B5 (5) | Every claim paired with a statistic, a named source, or original data — the strongest single citation-lift signal |
| C. Freshness | C1–C3 (3) | Visible timestamps + 90-day refresh cycle (AI engines decay older content fast) |
| D. Entity & Brand | D1–D3 (3) | Consistent NAP, repeated brand mentions, credentialed authors |
| E. Technical Foundations | E1–E4 (4) | Schema, server-rendered HTML, Core Web Vitals, llms.txt |
| F. Content Format Priorities | F1–F2 (2) | Case studies with named outcomes, tone calibrated to page type |
Full factor definitions, detection methods, and 0–3 score anchors live in references/24-factor-framework.md — load it before scoring.
Scoring rubric and evidence rules live in references/scoring-rubric.md.
Per-factor remediation prompts (the copy-pasteable LLM instructions that ship with each finding) live in references/remediation-prompts.md.
Primary-source citations for the headline stats live in references/citations.md — read before quoting any number to a client.
A sanitized worked example of an end-to-end audit lives in references/example-audit.md — useful for orientation if you've never run the skill before.
Why This Framework Works (cite to the user once, at the top of the report)
Lead with the mechanism, support with the number. Full primary sources and methodology notes for every stat below live in references/citations.md — quote from there, not from memory.
- Princeton GEO (Aggarwal et al., KDD 2024) measured a +41% visibility lift from adding statistics and +28% from adding quotations from named experts, across 10,000 GEO-bench queries. Citing external sources lifted lower-ranked pages by +115%. → factors B1, B2.
- AirOps (2026 Citations & Mentions report) analyzed 45,000+ citations and found brands earning both a mention and a citation were 40% more likely to reappear across consecutive AI answers. → factor D2.
- Ahrefs (June 2025 own-product analytics) found AI-search visitors converted at ~23× the rate of average organic visitors (0.5% of traffic, 12.1% of signups) — a single-company case study, not a market benchmark, but the directional finding (AI traffic over-converts) is consistent across reports. → context for ROI framing.
If a reader asks "where does this number come from?" the answer is one click away in references/citations.md. Open items (stats in 24-factor-framework.md whose primary source is not yet pinned) are catalogued there too — soften the prose if a client pushes back.
Audit Procedure
Work in this order — do not skip steps:
- Fetch —
web_fetch the URL for baseline HTML + readable text.
- Render (optional, T1 confidence) — if a browser tool is available, render and capture: DOM, all
<script type="application/ld+json"> blocks, visible "last updated" text, author byline, brand-mention count. Most factors can be scored from raw HTML (T2); rendering is only required to elevate E1/E2 from medium- to high-confidence scoring — see §"Detection Methodology" above.
- Inspect
/llms.txt — curl <domain>/llms.txt (or web_fetch). 200 with valid content = present; 404 = absent. Static file, no rendering required.
- Score each of the 24 factors 0–3 using
references/24-factor-framework.md anchors. For every score < 3, capture verbatim evidence (the actual quote / counted instance / missing element). Tag E1/E2 scores with their detection tier (T1/T2/T3).
- Emit the report in the format below.
- Total + per-cluster scores.
Surface-type pre-check (before scoring)
The 24-factor framework assumes a brand-owned page the operator can edit (own site, own CMS, own dev team). For non-brand-owned URLs, score honestly but flag the constraint up top.
- Marketplace product page (amazon., walmart., ebay., etsy., bestbuy.*, etc.): ~14 of 24 factors are platform-controlled (E3
llms.txt, E4 CWV, D3 author byline, C2 visible date, much of cluster A). Flag in Executive Summary: "This is a marketplace listing — only seller-controllable factors can be acted on." Score the full 24 but in the Prioritized Action Plan, sort seller-actionable factors first and platform-locked factors into a separate "Out of seller control" bucket.
- Doc-platform page (Notion public page, Webflow CMS without code access, Framer, ReadMe.io docs): some technical factors (E1, E4) are platform-defaults the user can't easily change. Same treatment — score, but flag.
- AI-platform-controlled (ChatGPT custom GPT page, OpenAI app pages, Anthropic prompt library): refuse the audit. These are not optimization surfaces for GEO; the model itself is the gatekeeper. Suggest the user pick a brand-owned canonical surface instead.
- Brand-owned (own domain + own CMS): proceed normally, no flag needed.
Output Format
This is the key part — every finding must include a Remediation prompt: block so another LLM (Claude Code, Cursor, ChatGPT in the user's IDE) can execute the fix without re-reading the framework. That requirement is what makes this skill a workflow, not just a report.
Report skeleton
# GEO Audit — <URL>
**Audited:** <YYYY-MM-DD> | **Site type:** <type> | **Surface:** <brand-owned | marketplace | doc-platform> | **Total score: XX / 72**
> **Surface-type flag** (omit when brand-owned): This is a <marketplace | doc-platform> URL — N of 24 factors are platform-controlled and not actionable by the seller / page author. The Prioritized Action Plan separates seller-actionable factors from platform-locked ones.
## Executive Summary
- **Top 3 gaps:** <three factor codes + one-line each>
- **Top 3 strengths:** <three factor codes + one-line each>
- **Quick wins (≤30min):** <list of factor codes>
## Cluster Scores
| Cluster | Score | Max |
|---|---|---|
| A. Content Structure | X | 21 |
| B. Fact Density | X | 15 |
| C. Freshness | X | 9 |
| D. Entity & Brand | X | 9 |
| E. Technical Foundations | X | 12 |
| F. Format Priorities | X | 6 |
| **Total** | **X** | **72** |
## Findings
### A1 — Answer-first paragraph: SCORE 1/3
**Why it matters:** AI assistants quote the first answer they find under a heading. Pages that open with a 40–60 word direct answer get that chunk pulled into the AI response.
**Evidence:** The H2 "Our Approach to Implants" is followed by a 4-sentence narrative paragraph that defers the answer to paragraph 3. Direct-answer chunks: 0 of 6 H2s.
**Fix:** Add a 40–60 word direct-answer paragraph immediately under every H2 in the main content.
**Remediation prompt:**
> "Open the page source at <path-or-URL>. Under every H2 in the main content, insert a 40–60 word paragraph that directly answers the question implied by the heading. The answer must be standalone — no 'this section will explain' setup. Do not modify existing paragraphs; insert above them. After each insertion, the H2 should be followed by the new answer paragraph, then the existing content."
**Priority:** High (quick win — copy + 1 hour)
### E1 — Full schema stack: SCORE 2/3 *(detection: T2)*
**Why it matters:** Schema is the machine-readable layer AI engines read alongside the visible page. Full-stack pages get cited measurably more.
**Evidence (T2 — curl raw HTML):** Raw HTML contains 3 `<script type="application/ld+json">` blocks. Grep on `"@type"` returned: "Organization", "WebPage", "LocalBusiness". Missing from raw HTML: FAQPage, Review, AggregateRating, Person, BreadcrumbList. JS-injected schema may be missed by this method — verify via Rich Results Test if score is critical: https://search.google.com/test/rich-results?url=<URL-encoded>
**Fix:** Add the missing schema types server-side so they appear in the raw HTML response.
**Remediation prompt:** <see references/remediation-prompts.md §E1, paste verbatim>
**Priority:** Medium (tech foundation — 2–4h engineering)
### A2 — TL;DR summary box: SCORE 0/3
...
Always tag E1 and E2 findings with their detection tier (T1, T2, T3) in the score header AND in the evidence line. That's how a reader knows whether to trust the score or hand off to Rich Results Test.
Continue for all 24 factors, in code order (A1 → F2). For each:
- Score X/3 with the score anchor name (Absent / Partial / Present / Exemplary)
- Why it matters — one sentence, mechanism-first
- Evidence — verbatim quote, count, or screenshot reference
- Fix — what to do in plain English
- Remediation prompt — copy-pasteable LLM instruction (see
references/remediation-prompts.md for the canonical version of each)
- Priority — High / Medium / Low + effort hint
Final section: Prioritized Action Plan
## Prioritized Action Plan
### Quick wins (each ≤30 min)
1. <Factor code> — <one-line fix>
2. ...
### Structural rewrites (1–4 hours each)
1. <Factor code> — <one-line fix>
2. ...
### Tech foundations (engineering work, plan into a sprint)
1. <Factor code> — <one-line fix>
2. ...
## Score interpretation
- **60–72:** Cited-by-default tier. Maintenance mode.
- **45–59:** Solid foundation. 2–3 quick wins push you into cited tier.
- **30–44:** Moderate. Cluster A + B rewrites needed.
- **<30:** Foundation work — start with cluster A (Content Structure) and E (Technical).
Quality Gate (run before emitting the report)
The report must satisfy ALL of these or do not ship it:
Related Skills
- seo-audit — traditional SEO audit (crawlability, on-page, technical). Run alongside this for full SEO + GEO coverage.
- schema-markup — implementing JSON-LD found missing in E1/E2.
- installix-lp-rewriter — when the fix is "rewrite this page in the editorial-sandwich pattern" (touches A1, A2, A3, A4, A7, B1, B2 simultaneously).
- hellodent-lp-writer — dental-specific page generation using the same content principles.
- ai-seo — broader AI search optimization (off-site signals out of scope for this skill).