AI answer engines cite sources they can crawl, parse, and corroborate. In practice a citation is earned in three stages: your page has to be retrievable by the index the assistant queries, it has to contain a passage that answers the question directly enough to lift, and the claim in that passage has to agree with what the rest of the web says about you. Everything that actually moves AI visibility maps to one of those three stages: crawler access, passage-level clarity and structured facts, and third party corroboration of your entity. There is no submission form, no paid inclusion, and no known way to force a citation on a given prompt.
How an answer engine assembles an answer
Most consumer assistants that cite sources are retrieval systems with a language model attached, not memory machines. The pattern is consistent across products: the user question gets rewritten into several sub-queries, each sub-query hits a web index, the top documents come back, relevant passages are extracted, and the model writes an answer that stitches those passages together with links. OpenAI documents that ChatGPT search uses its own crawler alongside third party search providers. Perplexity operates its own crawler and index. Google has said that AI Overviews and AI Mode are built on Google Search infrastructure rather than a separate opt-in index.
The practical consequence is the part most people miss. Because retrieval comes first, a page that cannot be found or cannot be fetched generally cannot be cited, no matter how well written it is. And because the model is extracting passages rather than reading your page as a narrative, the unit of competition is a paragraph, not a document. Two teams can publish on the same topic with the same authority, and the one whose second sentence contains a clean, self-contained answer gets the link.
Stage one: crawler access
This is the most common silent failure we find, and it is usually accidental. Someone enabled a blanket AI bot block at the CDN, or a security team switched on aggressive bot fighting, or a robots.txt inherited a disallow from a staging config. The site keeps ranking in Google, so nobody notices that the assistants stopped seeing it.
It helps to know that the major operators publish distinct user agents for distinct jobs, and that blocking one is not the same as blocking another.
- GPTBot is documented by OpenAI as the crawler associated with model training.
- OAI-SearchBot is documented as the crawler used to surface sites in ChatGPT search results.
- ChatGPT-User fetches a page when a user or a task in a session asks for it directly.
- PerplexityBot handles Perplexity indexing, with a separate agent for user-initiated fetches.
- ClaudeBot and the related Anthropic agents crawl for Claude.
- Google-Extended is a control token for Gemini and Vertex grounding use. Google states it does not affect whether you are included in Google Search.
- Bingbot still matters, because the Bing index feeds Copilot and has historically been a retrieval source for several assistants.
The access audit, in order
- 01 Fetch your own robots.txt and read every group, not just the one for Googlebot. Confirm each agent above is either allowed on purpose or blocked on purpose.
- 02 Check your CDN or WAF for a one-click AI crawler block. Cloudflare, Fastly, and most managed hosts now ship one, and it is frequently on by default for new zones.
- 03 Request your key pages with each user agent string using curl and confirm you get a 200 with full HTML, not a 403, a 429, or a JavaScript challenge page.
- 04 Confirm the answer is in the server-rendered HTML. Many AI crawlers do not execute JavaScript, so content injected client-side after hydration may simply not exist for them.
- 05 Grep your server or CDN logs for those user agents over the last 30 days. Zero hits from OAI-SearchBot and PerplexityBot is a finding, not a shrug.
- 06 Re-check after every deploy that touches headers, edge rules, or the security stack. This decays exactly like conversion tracking decays.
Stage two: write passages a model can lift
Once you are retrievable, the competition is passage quality. The behaviour we see consistently, across every assistant, is that the sentence that gets quoted is short, self-contained, and sits immediately under a heading that matches the question. It does not begin with a transition. It does not refer back to a previous paragraph with a pronoun. It can be cut out of the page and still make sense on its own.
Concretely, that means one question per H2, phrased close to how a person would ask it, followed by a forty to eighty word direct answer, followed by the detail. It means definitions written in a plain subject-verb-object pattern, because that is the shape a model extracts most reliably. It means every number carries its unit, its scope, and its source, so the model does not have to guess whether your figure is monthly or annual. And it means small tables and tight ordered lists, which survive extraction far better than a wall of prose.
Write the answer first and the argument second. An answer engine will only ever quote the first thing that resolves the question.
Where schema and llms.txt actually help
Nobody at OpenAI, Google, Perplexity, or Microsoft has published a statement that structured data is a direct input into AI citation selection, so treat any confident claim to that effect as inference. What structured data verifiably does is remove ambiguity. Organization, Service, Product, Article, BreadcrumbList, and FAQPage markup state your facts in a machine-readable form that cannot be misparsed out of the layout, and it drives rich results in classic search, which is upstream of the retrieval step these systems depend on. That is a good enough reason on its own.
The same honesty applies to llms.txt. It is a community proposal for a markdown summary of a site at the root path, not a ratified standard, and no major answer engine has publicly committed to reading it. We publish one for every client anyway, because writing it forces a single canonical statement of the company name, the service list with URLs, the pricing, the guarantee, and the contact address. The value is that those facts stop contradicting each other. Whether a crawler reads the file is a bonus.
Stage three: be an entity the web agrees on
An entity is a thing a system can resolve and attach facts to, as opposed to a string of characters it has seen. When a model has to decide whether to name you, it is effectively checking whether multiple independent sources describe the same organization the same way. Conflicting facts are the fastest way to lose that check. If your site says you serve three counties, your Google Business Profile says one city, an old directory lists a phone number you gave up in 2023, and your LinkedIn describes a different service line, the safe move for the model is to cite somebody else.
The fix is unglamorous. Pick canonical facts: legal-style business name, address format, phone, service list, service area, founding year, pricing model. Publish them on an About page and in Organization schema with sameAs pointing only at profiles you genuinely control. Then push the same values through your Google Business Profile, Apple Business Connect, Bing Places, the major data aggregators, and any industry directory that already ranks. This is the same NAP consistency work that drives local and maps visibility, which is one reason the two programs share a workstream.
Corroboration is the other half. Independent mentions on pages that already rank for your topic do double duty: they support classic rankings and they give a retrieval system a second source that says the same thing. Earn them the legitimate way, through genuine expert commentary, original data, industry publications, comparison and review platforms, and communities where you actually participate. Manufacturing fake mentions in forums is both detectable and, in the review context, a legal exposure.
How to measure something with no rank tracker
There is no Search Console for ChatGPT, and answers are non-deterministic, so the same prompt can produce different sources on different days. That rules out a rank number and leaves you with a trend line, which is still useful if you build it deliberately. Define a fixed set of twenty to fifty questions that a real buyer would ask on the way to purchase, run them on a schedule against each assistant you care about, and record two things only: whether your brand was named, and whether your domain was linked. Watch the direction over quarters, not days.
Layer two supporting signals on top. First, referral traffic in GA4 from assistant domains, which will show up in the session source and referrer dimensions and is worth isolating into its own exploration. Second, server log hits from the AI user agents, which tell you the crawl side of the story independently of anything a dashboard chooses to report. Getting both of those wired properly is ordinary analytics and tracking work, and it is the reason we refuse to run an AI search program on an account whose measurement is unverified.
What we would not tell you
No agency, ours included, can promise you a citation in a specific answer for a specific prompt. The systems are opaque, they change without notice, retrieval is partly personalized, and generation is probabilistic. What can be promised is the work: crawler access verified rather than assumed, answer-first pages on the questions your buyers actually ask, structured data that matches reality, one consistent set of facts across every surface you control, and a corroboration program aimed at sources that already rank. That is the whole of our AI search program, and it is built directly on top of conventional SEO rather than beside it.

