What is GEO, and what is it not?
GEO is a name for the work of being a good source for AI assistants. When someone asks ChatGPT, Claude, Perplexity or Gemini a question, the assistant either answers from what it learned in training or fetches pages and answers from them, usually with a link. GEO is about the second case: making sure your page can be fetched, that its text is in the HTML, and that the answer is stated plainly enough to quote.
What GEO is not:
- Not a separate discipline that replaces SEO. Google has said that optimizing for its AI features is the same as optimizing for search. We wrote up what Google actually said, and the logic holds for the other assistants too: a page that search engines cannot crawl, assistants cannot use either.
- Not a traffic channel yet. AI crawlers fetched this site more than 25,000 times in October 2026. AI products sent about 85 people here in a whole year. The numbers are below.
- Not a trick. There is no hidden tag that makes an assistant cite you. The levers are access, readable HTML, clear structure and visible accountability.
How do AI assistants get your pages?
A search engine's crawler has one job: build the index. AI companies split the work into three kinds of fetch, and most of them run a separate user agent for each so you can treat them differently in robots.txt.
- Training crawl. Bulk crawling to build datasets for future models. Nothing is cited and nobody is sent to you. GPTBot, ClaudeBot and meta-externalagent are documented this way.
- Search index. Crawling to build the index an assistant searches when it answers. This is the closest thing to Googlebot: OAI-SearchBot, Claude-SearchBot and PerplexityBot.
- User-initiated fetch. One request, made because a person asked a question or pasted your link: ChatGPT-User, Claude-User and Perplexity-User. Some vendors say these may not follow robots.txt, because a person asked for the page.
Here is every AI-related crawler that fetched blackseoanalyzer.com in October 2026, from this site's server logs, with what each vendor's own documentation says it does. Hits are requests, not people.
| User agent | Operator | Kind of fetch | What the vendor says | Hits, Oct 2026 |
|---|---|---|---|---|
GPTBot |
OpenAI | Training crawl | Collects pages that may be used to train OpenAI's models. Disallowing it opts the site out of training. Source | 2,126 |
OAI-SearchBot |
OpenAI | Search index | Surfaces websites in ChatGPT's search features. Obeys robots.txt. Source | 1,159 |
ChatGPT-User |
OpenAI | User-initiated fetch | Visits a page when a ChatGPT user's request needs it. Not an automatic crawler; OpenAI says robots.txt rules may not apply. Source | 1,012 |
ClaudeBot |
Anthropic | Training crawl | Collects web content that may help train Anthropic's models. Obeys robots.txt and Crawl-delay. Source | 2,995 |
Claude-SearchBot |
Anthropic | Search index | Crawls to improve the quality of Claude's search results. Blocking it can reduce visibility in those answers. Source | 820 |
Claude-User |
Anthropic | User-initiated fetch | Fetches a page when a person asks Claude a question that needs it. Source | 829 |
PerplexityBot |
Perplexity | Search index | Surfaces and links websites in Perplexity's results. Perplexity says it is not used to train foundation models. Source | 1,182 |
Perplexity-User |
Perplexity | User-initiated fetch | Visits a page to answer a user's question. Perplexity says it generally ignores robots.txt because a person asked. Source | 866 |
Google-Extended |
robots.txt token only | Controls whether Google may use your content for Gemini training and grounding. Google says it has no HTTP user agent of its own and does not affect Search. Source | 295 | |
meta-externalagent |
Meta | Training crawl | Crawls for uses such as training foundation models and indexing content. Meta's separate meta-externalfetcher handles user-requested links. Source | 4,878 |
Amazonbot |
Amazon | Product and training crawl | Used to improve Amazon's products and services, and may be used to train Amazon AI models. Amazon also lists Amzn-SearchBot and Amzn-User. Source | 4,846 |
Applebot |
Apple | Search index | Powers search in Spotlight, Siri and Safari. Its data may also train Apple's models unless you disallow the Applebot-Extended token. Source | 1,295 |
Bytespider |
ByteDance | Not documented | We found no user-agent page from ByteDance that we could verify, so we report only what the logs show. | 1,266 |
DuckAssistBot |
DuckDuckGo | Real-time fetch for answers | Fetches pages in real time for DuckDuckGo's AI-assisted answers, which cite their sources. Not used to train models. Source | 842 |
CCBot |
Common Crawl | Open crawl archive | Builds Common Crawl's public repository of web crawl data. Its page does not mention AI training; the archive is free for anyone to download. Source | 567 |
MistralAI |
Mistral | Training and user fetch | Mistral documents MistralAI-User (fetches a page when a user asks) and MistralAI-Training (training datasets). Our log count covers both. Source | 330 |
Source: this site's server logs (nginx), October 1 to 31, 2026, matched on the user-agent string. Vendor documentation read on October 31, 2026. Meta's requests are counted under meta-externalagent; Amazon's and Mistral's other agents are not split out.
Three things in that table need saying separately, because the logs and the vendors do not line up neatly:
- Google-Extended. Google says it is only a robots.txt token and "doesn't have a separate HTTP request user agent string." Our logs still recorded 295 requests whose user-agent string contained
Google-Extended. By Google's own account those did not come from Google's documented crawlers. We have not verified who sent them. - Bytespider. ByteDance does not publish an English user-agent page we could find and verify. All we can report is the 1,266 requests in the logs.
- Growth. In May 2026 ClaudeBot fetched this site 63 times and GPTBot once. In October it was 2,995 and 2,126. The training crawlers found the site over the summer; the user-initiated fetchers were already here.
Robots.txt rules for each of these, with the mistakes we see most often, are in the AI crawler robots.txt guide. The short version for a site that wants to be cited but not trained on:
User-agent: OAI-SearchBot
Allow: /
User-agent: Claude-SearchBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: Claude-User
Allow: /
User-agent: Perplexity-User
Allow: /
# Opt out of model training, if you want to:
User-agent: GPTBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: Google-Extended
Disallow: /
What stays the same?
Almost everything that makes a page work in search makes it work for an assistant, because the assistant's search crawler is doing the same job as Googlebot with less patience.
- Crawlable HTML. The text, headings and links have to be in the response. Googlebot will render JavaScript eventually; most AI crawlers will not. See can AI crawlers see JavaScript content.
- Canonical URLs. One URL per piece of content, declared with a canonical tag, so the version that gets quoted is the one you want linked.
- Structured data. JSON-LD that names the article, author, publisher and organization, served in the HTML rather than injected by a tag manager.
- Speed and status codes. A fetch made while someone waits for an answer cannot wait long. Slow pages and soft errors get skipped.
- Internal links. Crawlers discover pages by following links. A page with no links pointing to it is as invisible to OAI-SearchBot as it is to Googlebot.
What changes?
The difference is the reader. A search engine ranks a page and sends a person to read it. An assistant reads the page itself and quotes a sentence or a list item from it. That shifts a few priorities.
- Quotable structure. State the answer in the first two sentences under each heading. Use lists and tables for anything with parts; the boundaries of each item are unambiguous, so they get lifted accurately.
- Question headings. People ask assistants questions. A heading that matches the question is the clearest signal that the section below it answers it. This page's headings are questions for that reason.
- Visible bylines and dates. An assistant deciding whether to cite a page has no PageRank to lean on, so it leans on whether the page says who wrote it and when. Put the author and date on the page, and make the structured data match what is visible.
- llms.txt. A short Markdown file at your root that points an assistant at the pages worth reading. It is optional and adoption is uneven; our take is in does llms.txt matter.
- Allowing the right bots. Robots.txt used to be one decision. Now it is up to three per vendor: training, search index and user fetch. A blanket
Disallowcopied from a "block AI" guide removes you from answers, not just from training sets. - Server-rendered text. In SEO, client-side rendering is a delay. For most AI crawlers it is a blank page. If the server sends an app shell, the assistant has nothing to quote.
How do you measure GEO honestly?
Not with trackers that ask a chatbot the same question a hundred times; assistants answer differently each time and for each user. Measure what reaches your server.
- Server logs first. Count requests by user agent each month. That tells you which assistants can reach you and whether it is growing. Your analytics package shows none of this, because crawlers do not run its JavaScript.
- Use the user-initiated fetchers as a citation proxy. ChatGPT-User, Claude-User and Perplexity-User only fetch a page because a person's request led there. In October 2026 they fetched this site 2,707 times. Over the last 90 days the homepage took 1,537 of those fetches, then
/en/cli-documentation(28) and an old Semrush post (25). Most of the rest were requests for paths like/fetchand/proxyand for secret files: people using assistants to probe sites, which is a finding in itself. - Count referrals, and be honest about the size. In the last twelve months AI products sent this site about 85 human visitors: ChatGPT about 60, Perplexity 12, Claude 11, Gemini 1, Kagi 1. Google sent 354 unique visitors in October 2026 alone. AI search sends fetches, not people. Anyone selling GEO as a traffic channel today should show you their logs.
What are the 26 AI-readiness checks?
bseoa's AI Readiness Analyzer runs 26 checks, grouped below by what they look at. Each link goes to the check's own page with what it means and how to fix it. The checks that compare the server's HTML with the rendered page need JavaScript rendering, which the desktop app and CLI do with headless Chrome; the hosted connector does not render JavaScript.
1. Crawler access (5)
Whether the bots that cite, index and fetch for users can read the site at all, and whether a training block is deliberate.
- An AI search crawler (OAI-SearchBot, Claude-SearchBot, PerplexityBot) is blocked
- A user-initiated fetcher is blocked, so links people paste into an assistant fail
- A training crawler is blocked (reported for awareness, not as a defect)
- Every retrieval crawler is blocked, one rule at a time
- One blanket rule blocks every AI crawler
2. Real HTML (6)
Whether the text, headings, links and markup exist in the HTML the server sends, since most AI crawlers do not run JavaScript.
- The server sends an empty app shell
- The page appears to be rendered entirely in the browser
- Most of the text only exists after JavaScript runs
- Most headings are added by JavaScript
- Most links are added by JavaScript
- JSON-LD is injected by JavaScript
3. Quotable structure (2)
Whether the page gives an assistant something it can lift accurately. Both checks are advisory.
4. Bylines, dates and structured data (7)
Whether the page says who wrote it, who stands behind it, when it was published and updated, and whether the markup matches what a reader can see.
- An article names no author
- An author is in the markup but no byline is visible
- An article declares no publisher
- An article has no datePublished
- An article has no dateModified
- FAQ markup questions are not on the visible page
- Structured data has no sameAs links
5. llms.txt (6)
Whether the site publishes an llms.txt and whether it is usable: a title, a summary and links that resolve.
- No /llms.txt
- /llms.txt exists but is empty
- No '# Title' heading
- No '> summary' blockquote
- No links
- Links that are neither absolute nor root-relative
What should you do first?
- Read your robots.txt. Allow OAI-SearchBot, Claude-SearchBot, PerplexityBot and the three user-initiated fetchers. Decide about training crawlers separately, on purpose.
- View the source of your most important page. Not the inspector, the raw HTML. If the main text is not there, fix rendering before anything else.
- Put the answer at the top. First two sentences of the page, and first sentence under each heading. Turn a few headings into the questions people ask.
- Show the byline and the dates. On the page, and in Article structured data with author, publisher, datePublished and dateModified.
- Publish an llms.txt. A title, a one-line summary, and absolute links to the pages that matter. Ours is at /llms.txt.
- Start counting. Pull user-agent counts from your logs once a month, and track the user-initiated fetchers on their own.