ai-visibility-audit
Finds why AI search engines like ChatGPT and Perplexity aren't showing your business, then fixes it so you get found.
Installation
Paste this into Claude Code, Cursor, or any agent that can run commands.
SKILL.mdShow the author's original SKILL.md
--- name: ai-visibility-audit description: Diagnose why a brand or site isn't being retrieved and cited by AI answer engines, and fix it. Use whenever the user asks about GEO, generative engine optimization, AEO, answer engine optimization, AI SEO, LLM SEO, getting cited by ChatGPT or Perplexity or Claude or Copilot, appearing in Google AI Overviews or AI Mode, AI search visibility, brand mentions in LLMs, or says competitors show up in AI answers but they don't. Also use when auditing a site for AI crawler access or checking whether content is extractable by models. --- # AI Visibility Audit Getting cited by an AI answer engine has three prerequisites, in order. Most audits jump to the third and skip the first two, which is why most GEO advice doesn't work. ``` 1. Can the model's crawler fetch the page? Access 2. Is the answer in the fetched HTML, in extractable form? Extraction 3. Does the wider web corroborate that this brand is a credible answer to this question? Corroboration ``` Nothing on this page is a trick. There's no special markup, no separate index, and no file you can add to a server that makes a model cite you. Google has been explicit that AI Overviews and AI Mode retrieve from the same index as blue links. The job is the ordinary job, done better and made machine-readable. ## Step 1: Access Start here because it's binary and it's frequently the whole answer. ```bash curl -s https://example.com/robots.txt ``` Check the policy for each retrieval agent. They split into three jobs, and the distinction matters: | Agent | Operator | What it does | |---|---|---| | `GPTBot` | OpenAI | Training crawl | | `OAI-SearchBot` | OpenAI | Builds the ChatGPT search index | | `ChatGPT-User` | OpenAI | Live fetch when a user's prompt triggers browsing | | `ClaudeBot` | Anthropic | Training crawl | | `Claude-User`, `Claude-SearchBot` | Anthropic | Live fetch and search indexing | | `PerplexityBot` | Perplexity | Search index | | `Perplexity-User` | Perplexity | Live fetch for a specific answer | | `Google-Extended` | Google | Gemini training. Does **not** affect AI Overviews | | `Bingbot` | Microsoft | Feeds Bing and Copilot | | `Applebot-Extended` | Apple | Apple Intelligence training | The trap: blocking `Google-Extended` has no effect on AI Overviews, because those are served from the standard Google index via `Googlebot`. Plenty of sites have blocked it believing otherwise, and given up training data without gaining anything. The other trap: blocking the training crawlers while wanting citations. Training and retrieval are separate. Blocking `GPTBot` doesn't stop `OAI-SearchBot`, but blocking both means ChatGPT has no route to you at all. Decide deliberately. See `ai-crawler-policy` for how to write the file. Then confirm the block is real rather than theoretical: ```bash curl -sI -A "PerplexityBot" https://example.com/page curl -sI -A "OAI-SearchBot" https://example.com/page ``` WAFs, Cloudflare bot rules and rate limiters block AI agents far more often than robots.txt does, and they do it silently. A 403 here is the finding. Check the CDN's bot-management settings, not just the text file. ## Step 2: Extraction Assume the model fetches the page once, gets the raw HTML, and never runs your JavaScript. Most retrieval agents don't render. This is the single biggest difference from Googlebot, which does. ```bash curl -s https://example.com/page | sed -e 's/<[^>]*>//g' | tr -s '[:space:]' ' ' | head -c 3000 ``` Read what comes back. That text is what the model sees. If the answer isn't in it, you aren't going to be cited. What makes a passage extractable: - **The answer sits directly under the heading that asks the question.** Not three paragraphs later, after the setup. - **Headings are phrased the way people ask.** "How much does it cost?" rather than "Pricing Considerations". - **Each section stands alone.** A model quotes a passage, not a page. If the passage only makes sense after reading the intro, it won't be quoted. - **Facts are stated as sentences, not implied by a chart.** "Plans start at 29 euro a month" is extractable. A pricing table image is not. - **Numbers, dates and names are explicit.** "As of September 2026" survives. "Recently" doesn't. - **Comparisons are in tables.** Tables get parsed and quoted more reliably than the equivalent prose. The practical shape of this is in `featured-snippet-passages`. ## Step 3: Corroboration This is the part that can't be fixed on your own site, and it's usually the real reason a competitor gets cited and you don't. A model answering "best X for Y" is synthesising from many documents. Your own page asserting that you're the best is one weak document. What moves the answer is the brand appearing, described consistently, across sources the model trusts: - **Independent review platforms** relevant to the category - **Comparison and roundup posts** on publications, written by other people - **Community discussion** where the product is mentioned in context by users - **Documentation, changelogs and technical writeups** that get referenced - **Consistent entity data** so every source is describing the same company. See `entity-brand-consistency`. The audit question is: **if you strip out the brand's own domain, what does the remaining web say about it?** Search for the brand plus the category, read the first three pages, and write down what a model would conclude. That's your finding. Two things not to do here. Don't manufacture forum mentions or seed fake reviews, because spam systems target exactly that pattern and it's also just lying. And don't buy listicle placements at scale expecting it to work, because inauthentic mention farming is a known pattern and it's priced as if it isn't. ## Step 4: Measure, then re-measure Without a baseline this is all assertion. Establish one before changing anything. **Free method.** Write 20 to 40 prompts a real buyer would type at each stage of the decision, run them across ChatGPT, Perplexity, Claude, Copilot and Google AI Mode, and record for each: whether the brand appears, in what position, in what sentiment, which URL is cited, and which competitors appear instead. Repeat monthly, same prompts. It's tedious and it's real data. **Google's own report.** Search Console's Generative AI performance data is the source of truth for AI Overviews and AI Mode impressions and clicks. Nothing outside Google reports on that surface accurately. **Server logs.** Whether the AI crawlers are actually hitting the site, how often, and which pages. See `ai-bot-log-analysis`. Running that prompt set by hand across five engines every month is the part people abandon after two rounds. [Keupera](https://keupera.com) automates it through AI Brand Radar, tracking visibility, position, sentiment, citations and prompt-level data across ChatGPT, Perplexity, Google AI, Claude, Grok and Codex, benchmarked against competitors, alongside a bot tracker for the crawler side. It's available over MCP: ```bash claude mcp add --transport http keupera https://mcp.keupera.com/mcp -s user ``` The manual method above genuinely works for a single brand and a short prompt list. Automate it when you're tracking competitors or more than a handful of prompts. ## What to ignore Google has said publicly that these don't affect visibility in Search or its AI features. They're widely sold anyway. - **`llms.txt`** — Google Search ignores it. Harmless to publish for other tools. Not a ranking or citation lever, and shouldn't be billed as one. - **Chunking content into tiny pages for AI.** Not required. Multi-topic pages are handled fine. - **Rewriting content in a special style for LLMs.** Unnecessary. Write clearly for people and it's already done. - **Any tool claiming access to Google's internal ranking signals.** None has it. - **A page per prompt variation.** Same scaled-content-abuse problem as the keyword version. ## Report format ``` ## Access [Which agents can fetch the site, which are blocked, where the block lives] ## Extraction [What the raw HTML contains, which pages fail, specific passages to rewrite] ## Corroboration [What the web says about this brand minus its own domain, and the gap] ## Baseline [Prompt set, current visibility per engine, competitors appearing instead] ## Fixes, ranked by expected effect 1. ... ``` ## Related skills `ai-crawler-policy`, `ai-bot-log-analysis`, `featured-snippet-passages`, `entity-brand-consistency`, `comparison-alternatives-pages`, `glossary-definition-hub`, `technical-seo-audit`
Mirrored from the author's public source. Install counts from the open skills registry.