How brands get cited in AI answers, and how to measure it honestly
Ask ChatGPT for "the best project management tool for a small agency" and you get a few brand names and a few links. If your brand isn't in that answer, you never got the chance to compete for the click. People call the work of changing that GEO (generative engine optimization) or AEO, and Google's own guide to generative AI features treats both as part of SEO. Mostly it is SEO, plus a measurement problem that is harder than it looks.
I'm the main contributor to Jorge Castro, an AI SEO agent platform, and I own its AI Overview and AI-visibility tracking: the features that check whether ChatGPT, Gemini, Perplexity, Claude and Google AI Overviews mention or cite a brand. This post covers both sides: how the engines choose what to cite, and how to count the results honestly.
Mentions and citations are different signals
Before you measure anything, separate two things that dashboards often blur together. A mention is your brand name appearing in the answer text. A citation is the answer linking to a page as a source. They overlap, but not always.
| Outcome | What it means |
|---|---|
| Mentioned, your page cited | The engine names you and points people to your site |
| Mentioned, third-party page cited | You're recommended because a review, list or forum thread talks about you |
| Cited, not mentioned | Your page informed the answer, but the brand it named may be someone else |
| Neither | You're not part of this answer |
The second row means your visibility partly depends on pages you don't own. The third row is the trap: a citation count that looks healthy can hide the fact that the answer recommended a competitor.
How the engines choose sources
Each engine retrieves pages, then writes an answer grounded in what it retrieved. The details differ.
Google AI Overviews and AI Mode. Google's AI features documentation says both may use "query fan-out": running several related searches across subtopics to build one response, which surfaces more supporting pages than a classic results page. To be eligible as a supporting link, a page has to be indexed and eligible to appear in Search with a snippet. There are no extra technical requirements. The generative AI guide is blunt about the rest: no special schema is required, Google Search ignores llms.txt files, you don't need to chop content into tiny chunks, and chasing inauthentic mentions "isn't as helpful as it might seem". AI Overviews also only appear when Google decides they add something, so many queries won't show one at all.
ChatGPT search. OpenAI's crawler documentation separates OAI-SearchBot, which powers search, from GPTBot, which collects training data. Sites that block OAI-SearchBot won't be shown in ChatGPT search answers, apart from navigational links. Blocking GPTBot is a separate decision and doesn't remove you from search.
Perplexity, Gemini and Claude can all search the web and show their sources. The same rule applies everywhere: if retrieval can't reach and read your page, it can't be cited.
What moves visibility in practice
There is no secret format. What helps is mostly what already helps in search, aimed at the full-sentence questions people now type.
Let the right crawlers in. Check robots.txt, and also your CDN or firewall bot rules, for Googlebot, OAI-SearchBot and PerplexityBot. Bot protection at the edge can block a search crawler without anyone noticing.
Answer the sub-questions. Query fan-out means an answer about "best X for Y" pulls in pages about pricing, integrations, limits and alternatives. Pages that answer those specific questions in plain text give the engine something to retrieve.
Name yourself on the page. If a page explains a feature but only says "our tool", an engine can cite it without attaching your brand to the claim. Put the brand name near the facts you want associated with it.
Earn real third-party coverage. Reviews, comparisons and community discussions get retrieved too. Manufactured mentions are exactly what Google's guidance warns against; being worth mentioning is the route that lasts.
Keep facts consistent. Pricing, product names and capabilities should match across your site, docs and listings, so whichever page gets retrieved says the same thing.
Measuring it honestly
Track prompts, not keywords
Build a prompt set that reflects how buyers ask: category questions ("best CRM for a 10-person agency"), comparisons ("X vs Y") and problems ("how do I..."). Keep the set fixed, so changes over time mean something.
Run each prompt many times
AI answers vary between runs. A SparkToro study ran 12 recommendation prompts through ChatGPT, Claude and Google's AI features, roughly 60 to 100 times each. For ChatGPT and Google, the chance of getting the same list of brands twice was under 1 in 100, and the same list in the same order closer to 1 in 1,000. Claude repeated lists slightly more often, but not their order. The author's conclusion: how often a brand appears across many runs is a reasonable metric, and its position in the list isn't.
So "we rank #2 in ChatGPT" isn't a real metric. "Mentioned in 34 of 50 runs this week" is. Report rates over a sample, and treat small week-to-week moves as noise until they persist.
Verify that the cited page names the brand
This is the step I'd insist on. An answer can cite five sources and name your brand once. If you count a mention per cited source, one mention becomes five. And a model can attach a brand to a source that never mentions it.
In Jorge Castro, before an AI-visibility result is saved, each cited page is crawled and the brand is counted only where it really appears on that page. One answer citing several sources can't inflate the mention count. A simplified version of the idea:
type CitationCheck = { url: string; status: "names-brand" | "no-brand" | "unreachable"; }; async function checkCitations( urls: string[], brandPattern: RegExp, // word boundaries + aliases, e.g. /\bacme( crm)?\b/i fetchText: (url: string) => Promise<string | null> ): Promise<CitationCheck[]> { const seen = new Set<string>(); const checks: CitationCheck[] = []; for (const raw of urls) { const u = new URL(raw); u.hash = ""; if (seen.has(u.href)) continue; // the same page cited twice counts once seen.add(u.href); const text = await fetchText(u.href); if (text === null) { checks.push({ url: u.href, status: "unreachable" }); continue; } checks.push({ url: u.href, status: brandPattern.test(text) ? "names-brand" : "no-brand", }); } return checks; }
Two details matter. Match on word boundaries and known aliases, because a plain substring search will find "Apple" inside "pineapple". And keep unreachable pages as their own status instead of guessing either way.
Record the context of every run
Store the engine, the mode (AI Overview or AI Mode, for example), the date, the location, and whether the run came from an API or the consumer app. The SparkToro post treats whether API calls behave like the consumer apps as an open question, so don't mix the two in one trend line. For Google, store "no AI Overview shown" as its own state. It isn't the same as "shown, and you weren't in it".
Use first-party data where it exists
Search Console now has a Generative AI performance report showing how many times links to your site appeared in AI Overviews and AI Mode, by page, country, date and device. At the time of writing it reports impressions only, so it complements prompt tracking rather than replacing it.
Ask your tools how they count
Commercial trackers such as Semrush's AI Visibility Toolkit, Ahrefs Brand Radar, Profound and Peec AI collect data in different ways, which is one reason they disagree. Before trusting a number, ask: API or real interface? How many runs per prompt? Which locations? Are cited pages checked, or is the model's word taken for it?
The pitfalls in one table
| Pitfall | Why it misleads | Fix |
|---|---|---|
| One run per prompt | Answers change between runs | Sample repeatedly and report rates |
| Tracking position | Order is the least stable part of an answer | Track how often you appear |
| One mention per citation | Multiplies a single mention by the source count | Credit only pages that really name the brand |
| Trusting the attribution | The cited page may not name the brand | Crawl the page and check |
| "No AI Overview" counted as a miss | The feature didn't trigger | Store it as a separate state |
| Mixing API and app runs | They may behave differently | Keep separate series |
Conclusion
Getting cited in AI answers comes down to being reachable, being specific and being worth talking about. Measuring it honestly comes down to sampling, keeping mentions and citations apart, and checking the cited pages yourself. A smaller number you can defend is worth more than a bigger one that falls apart when someone opens the source.