Measuring AI visibility: how to track citations in ChatGPT, Perplexity and AI Overviews
What you can actually measure about answer-engine citations — referrals, crawler hits, sampled answers and Search Console — and how to define the metrics.
Short answer
AI visibility is measured from four partial signals, because no answer engine reports citations directly. Referral traffic identifies clicks from chatgpt.com, perplexity.ai, copilot.microsoft.com, claude.ai and gemini.google.com; server logs show which AI crawlers fetch which pages; a fixed panel of prompts run on a schedule gives citation rate and share of answer; and Google Search Console reports AI Overview clicks only blended into Web search totals.
Key takeaways
- 01No answer engine publishes a citation report, so AI visibility is triangulated from referrals, crawler logs, sampled prompts and Search Console.
- 02ChatGPT appends utm_source=chatgpt.com to cited links; other engines are identified by referrer host, and app traffic often arrives with no referrer.
- 03User-triggered fetchers such as ChatGPT-User, Perplexity-User and Claude-User in your logs are the closest thing to a real-time citation signal.
- 04A fixed panel of prompts, run weekly with repeated samples, turns citations into two trackable numbers: citation rate and share of answer.
- 05Google Search Console counts AI Overview and AI Mode clicks inside the Web search type, so they cannot be separated there.
- 06Commercial tools automate prompt sampling at scale; judge them on panel size, cadence, repeat runs and raw data export.
On this page
Why AI visibility has to be triangulated
Classic search gives you a report: queries, impressions, clicks, position. Answer engines give you nothing of the kind. OpenAI, Perplexity, Anthropic and Microsoft publish no per-site citation data, and Google folds AI Overview traffic into its existing search totals. Measurement therefore means combining four partial signals, each of which sees a different slice of what happens between a question and your page.
| Signal | What it sees | What it misses |
|---|---|---|
| Referral traffic | Citations that produced a click | Citations that did not, and clicks with no referrer |
| Server logs | Which AI crawlers and fetchers requested which URLs | Whether the fetched page was actually used |
| Prompt sampling | Which engines cite you for which questions, and against whom | Every question you did not put in the panel |
| Search Console | Total Google clicks and impressions, AI features included | The split between AI Overviews and ordinary results |
When referrals, user-triggered fetches and sampled citations move in the same direction for a topic, the trend is real. When one moves alone, check the instrument first.
Referral traffic from answer engines
The cheapest signal is already in your analytics. When someone clicks a citation, the visit arrives with a referrer, a UTM parameter, or both.
OpenAI's Publishers and Developers FAQ states that ChatGPT automatically includes utm_source=chatgpt.com in referral URLs so that publishers can track the traffic in tools such as Google Analytics. The other engines are identified by referrer host:
chatgpt.com(and the olderchat.openai.com) for ChatGPTperplexity.aifor Perplexitycopilot.microsoft.comfor Microsoft Copilotclaude.aifor Claudegemini.google.comfor Gemini
Grouping them in Google Analytics 4
GA4 files these under Referral by default. Google's custom channel group documentation includes an "AI assistants" example built on a matches regex condition against the Source dimension, and notes that custom channel groups apply retroactively. Google's example pattern is deliberately broad; a tighter expression that matches only the hosts above is:
^(www\.)?(chatgpt\.com|chat\.openai\.com|perplexity\.ai|copilot\.microsoft\.com|claude\.ai|gemini\.google\.com)$Place the new channel above Referral so it is evaluated first. A standard GA4 property allows two custom channel groups.
What referrals undercount
Referral traffic is a lower bound on citations. Answer engines resolve many questions without a click, so a citation often produces no session. Native apps and in-app browsers frequently drop the referrer, so the visit lands in Direct. And some engines put citations in a collapsed source list that few users open. A flat referral line means clicks are rare, which is the normal case, not that you are uncited.
AI crawler hits in server logs
Your access logs record every fetch, including the ones no analytics script sees. The vendors publish their user agents, and the names mean different things.
OpenAI's crawler documentation lists three relevant agents: GPTBot crawls content that may be used for training; OAI-SearchBot surfaces websites in ChatGPT's search features; and ChatGPT-User handles certain user actions in ChatGPT, where, because the fetch is initiated by a user, robots.txt rules may not apply. Perplexity documents PerplexityBot for its search index and Perplexity-User, which may visit a page when a user asks a question and which, in Perplexity's words, generally ignores robots.txt. Anthropic documents ClaudeBot (training), Claude-SearchBot (search quality) and Claude-User (fetches on behalf of a user), all of which it says honour robots.txt. Google uses ordinary Googlebot for AI features; Google-Extended is a robots.txt control token with no user agent string of its own, so it never appears in a log.
That gives a three-way split worth counting separately:
- Training crawlers (
GPTBot,ClaudeBot,CCBot). Volume tells you about training exposure, not about answers. - Search-index crawlers (
OAI-SearchBot,PerplexityBot,Claude-SearchBot). A fetch means the page is a retrieval candidate. - User-triggered fetchers (
ChatGPT-User,Perplexity-User,Claude-User). A fetch means the page was retrieved while a live question was being answered. This is the closest thing you have to a real-time citation signal.
A short pipeline over an Nginx or Apache combined log gives a daily count per agent and URL:
grep -E 'GPTBot|OAI-SearchBot|ChatGPT-User|PerplexityBot|Perplexity-User|ClaudeBot|Claude-SearchBot|Claude-User' access.log \
| awk '{
match($0, /GPTBot|OAI-SearchBot|ChatGPT-User|PerplexityBot|Perplexity-User|ClaudeBot|Claude-SearchBot|Claude-User/);
agent = substr($0, RSTART, RLENGTH);
split($4, d, ":");
print substr(d[1], 2), agent, $7
}' \
| sort | uniq -c | sort -rn | head -50User agent strings are trivially forged, so verify before trusting a spike. OpenAI publishes IP ranges per agent (openai.com/gptbot.json, openai.com/searchbot.json, openai.com/chatgpt-user.json), Perplexity publishes perplexity.com/perplexitybot.json and perplexity.com/perplexity-user.json, and Anthropic publishes claude.com/crawling/bots.json.
Prompt-based citation sampling
Referrals and logs are passive. The only way to learn which questions you are cited for, and who is cited instead, is to ask the engines yourself and record the answers.
Build the panel
Write twenty to fifty questions that your pages are meant to answer, phrased the way users phrase them rather than as keywords. Give each question a stable id, version the panel, and never silently edit a prompt: an edited prompt is a new prompt.
Run each prompt in a fresh, logged-out session on each engine, because answers vary with history, account and location. Generation is non-deterministic, so run each prompt three times and record every run.
Record the answers
One row per answer:
| Column | Meaning |
|---|---|
date | Day of the run |
engine | chatgpt, perplexity, copilot, claude, gemini, ai-overviews |
panel_version | Version of the prompt set, so old rows stay comparable |
prompt_id | Stable id of the question |
run | 1, 2 or 3 |
cited | 1 if your domain appears in the sources, otherwise 0 |
position | Order of your first citation among the sources; blank if not cited |
cited_url | The exact URL cited, to see which passage won |
all_domains | Every cited domain, in order, separated by semicolons |
notes | No sources shown, refusal, wrong entity |
Define the metrics
- Citation rate: answers in which your domain is cited, divided by all answers, per engine.
- Share of answer: your citations divided by all citations across the panel's answers, per engine. This is the answer-engine equivalent of share of voice, and the number that falls when a competitor starts winning.
- Mean citation position: average of
positionover cited answers. A rising mean with a stable citation rate means you are being pushed down the list. - Competitor share: share of answer computed for every domain in
all_domains. Keep the whole distribution. - Coverage: answers that showed any sources at all. A coverage drop is not a visibility drop.
The GEO paper by Aggarwal et al. formalises the same idea with two finer measures: Position-Adjusted Word Count, which weights the words attributed to a citation by an exponentially decaying function of its position, and Subjective Impression, which uses a model to rate how prominent a source looks in the answer. A weekly sheet with cited and position columns is a coarse approximation of both.
up to 40%
What Google Search Console can and cannot tell you
Search Console is the only first-party source for Google, and its limit is precise. Google's documentation on AI features and your website says that sites appearing in AI features such as AI Overviews and AI Mode "are included in the overall search traffic in Search Console" and are "reported on in the Performance report, within the 'Web' search type". As of this writing there is no filter that isolates them, so an AI Overview click and an ordinary click on the same query are indistinguishable in the export.
What you can still do:
- Export query-level impressions and clicks weekly for the topics in your panel, and watch click-through rate. Impressions holding steady while CTR falls is consistent with an AI Overview absorbing the click, but also with a new competitor or a changed layout.
- Record whether an AI Overview appeared for each query, from a rank tracker that detects it or from your own sampled searches, and whether your URL was among its sources.
- Google's documented controls for AI features (
nosnippet,data-nosnippet,max-snippet,noindex) are levers, not measurements, but they allow a before-and-after comparison on one section of the site.
Categories of commercial tools
The market is young and the products overlap. Four categories cover most of it, and none replaces the definitions above.
- Prompt-monitoring platforms automate the panel across engines on a schedule. Ask whether they query the consumer interface or an API (the two can cite differently), how many runs per prompt they take, how they handle regions, and whether raw answers can be exported.
- Bot analytics in CDNs and WAFs classify crawler traffic by user agent and, in the better cases, by verified IP range. Ask whether verification is done or only claimed.
- Analytics add-ons and dashboard templates package an AI channel group and a report. The regex above is most of the product; the value is presentation and alerting.
- Rank trackers with AI Overview detection record whether an AI Overview appeared for tracked keywords and whether your URL was cited in it. Google only, but it fills the Search Console gap.
Whatever you buy, keep the spreadsheet. The metric definitions should be yours, so that changing tools does not reset the series.
A minimal AI visibility measurement stack
- GA4 custom channel group for AI assistants, placed above Referral
- Weekly count of user-triggered fetches (ChatGPT-User, Perplexity-User, Claude-User) per URL from server logs
- Crawler user agents verified against the vendors' published IP ranges
- A versioned prompt panel of 20–50 questions, run three times per engine per week
- Citation rate and share of answer computed per engine, with competitor domains kept
- Search Console query-level impressions and CTR exported weekly for the same topics
- One dashboard row per topic that shows all four signals side by side
Frequently asked questions
Can I see which prompts led to a ChatGPT citation?
No. ChatGPT sends a referrer and a utm_source=chatgpt.com parameter, but not the conversation or the question. The only way to connect citations to questions is to ask the questions yourself: run a fixed prompt panel, record which URLs each engine cites, and treat the result as a sample rather than a census.
Why does my AI referral traffic look so small?
Three reasons. Answer engines resolve many questions without a click, so a citation often produces no visit. Native apps and in-app browsers frequently drop the referrer, which files the visit under direct traffic. And referrals count only clicked citations, not the far larger number of times a page was fetched by an engine or quoted without a click.
Does Google Search Console show AI Overview clicks?
Not as a separate line. Google's documentation states that traffic from AI Overviews and AI Mode is included in the Performance report under the Web search type, mixed with ordinary results. You can watch for impressions holding steady while clicks fall, but that pattern has other causes too, so treat it as a prompt to investigate rather than a measurement.
How many prompts do I need in a citation panel?
Enough to cover your real topics, and few enough to run consistently. Twenty to fifty questions, each run three times per engine per week, is a practical starting point for one site. Consistency matters more than size: change the panel rarely, version it when you do, and keep the old prompts so that trends stay comparable.
Is a crawler hit the same as a citation?
No. A training crawler such as GPTBot or ClaudeBot fetching a page says nothing about answers. A search-index crawler fetch means the page is a candidate. A user-triggered fetch by ChatGPT-User, Perplexity-User or Claude-User means the page was retrieved while a live question was being answered, which is the strongest log-based signal, but still not proof that it was cited.
Sources
- [1]Publishers and Developers – FAQ
OpenAI Help Center · 2025
- [2]Overview of OpenAI crawlers
OpenAI · 2025
- [3]AI features and your website
Google Search Central · 2025
- [4][GA4] Custom channel groups
Google Analytics Help · 2025
- [5]Perplexity crawlers
Perplexity · 2025
- [6]Does Anthropic crawl data from the web, and how can site owners block the crawler?
Anthropic Help Center · 2025
- [7]GEO: Generative Engine Optimization
Aggarwal et al., KDD 2024 (arXiv) · 2023
Terms used in this guide
- Citation
- A citation, in the context of answer engines, is the explicit link or reference that a generated answer attaches to the source passage it drew on — the numbered footnote in Perplexity, the linked sources beside a Google AI Overview, or the source list under a ChatGPT search answer. Citations are the unit of visibility that Answer Engine Optimization is measured by.
- AI Overviews
- AI Overviews is a Google Search feature that shows an AI-generated summary at the top of some results pages, with links to the web pages the summary drew on. It launched to all US users in May 2024 after a year as the Search Generative Experience (SGE) experiment in Search Labs, and is fed by the same crawling and indexing as ordinary Search.
- AI crawler
- An AI crawler is an automated agent that fetches web pages on behalf of an AI system and identifies itself with its user-agent string, such as GPTBot, ClaudeBot or PerplexityBot. Vendors separate crawlers by purpose — collecting training data, building a search index, or fetching a page a user asked about — so that training and search access can be allowed or blocked independently in robots.txt.
- Zero-click search
- A zero-click search is a query that ends on the results page without the searcher clicking through to any website, because the answer was shown directly — in a featured snippet, knowledge panel, AI Overview or a similar module. The term describes a measured outcome, not a feature: the searcher got what they needed, or gave up, and the source page received no visit.
- Answer engine
- An answer engine is a system that responds to a question with a synthesised answer rather than a ranked list of links. Modern answer engines — Google AI Overviews and AI Mode, Perplexity, ChatGPT search, Claude with web search and Microsoft Copilot — retrieve passages from the web and generate the answer with a large language model, usually with citations to the sources used.
Written by
Endrit Krasniqi
Front-end engineer & author of Citable
Endrit Krasniqi is a front-end engineer who builds content platforms with React, Next.js, Nuxt and headless CMSs such as Storyblok. He writes Citable to document, with working code, how websites can be structured so that search engines, answer engines and large language models quote them accurately.