---
title: "Measuring AI visibility: how to track citations in ChatGPT, Perplexity and AI Overviews"
subtitle: "What you can actually measure about answer-engine citations — referrals, crawler hits, sampled answers and Search Console — and how to define the metrics."
canonical: https://citable.wiki/guides/measuring-ai-visibility-and-citations
category: measurement
author: "Endrit Krasniqi"
date_published: 2026-04-13
date_modified: 2026-04-13
license: CC BY 4.0
---

# 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

- No answer engine publishes a citation report, so AI visibility is triangulated from referrals, crawler logs, sampled prompts and Search Console.
- ChatGPT appends utm_source=chatgpt.com to cited links; other engines are identified by referrer host, and app traffic often arrives with no referrer.
- User-triggered fetchers such as ChatGPT-User, Perplexity-User and Claude-User in your logs are the closest thing to a real-time citation signal.
- A fixed panel of prompts, run weekly with repeated samples, turns citations into two trackable numbers: citation rate and share of answer.
- Google Search Console counts AI Overview and AI Mode clicks inside the Web search type, so they cannot be separated there.
- Commercial tools automate prompt sampling at scale; judge them on panel size, cadence, repeat runs and raw data export.

## 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 older `chat.openai.com`) for ChatGPT
- `perplexity.ai` for Perplexity
- `copilot.microsoft.com` for Microsoft Copilot
- `claude.ai` for Claude
- `gemini.google.com` for 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:

```text
^(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:

1. **Training crawlers** (`GPTBot`, `ClaudeBot`, `CCBot`). Volume tells you about training exposure, not about answers.
2. **Search-index crawlers** (`OAI-SearchBot`, `PerplexityBot`, `Claude-SearchBot`). A fetch means the page is a retrieval candidate.
3. **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:

```bash
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 -50
```

User 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`.

> **Warning: Blocking removes the signal**
>
> If you disallow a fetcher in robots.txt or challenge it at the CDN, its hits disappear from your logs along with the citations it would have produced. Decide on access first, using [Controlling AI crawlers with robots.txt](/guides/controlling-ai-crawlers-with-robots-txt), then measure what you allowed.

## 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 `position` over 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%** — increase in visibility in generative engine responses reported for passages that added citations, quotations and statistics (Source: [GEO: Generative Engine Optimization (arXiv)](https://arxiv.org/abs/2311.09735))

> **Example: A weekly readout**
>
> Panel v2, 40 prompts, 3 runs each on Perplexity: 120 answers. Your domain cited in 27 of them, so citation rate is 22.5%. Those 120 answers contained 96 citations in total, 31 of them yours, so share of answer is 32.3%. Mean citation position 1.9. Two competitor domains hold 28% and 17%. Coverage 118 of 120.

## 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.

1. **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.
2. **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.
3. **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.
4. **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

> **Tip: Where to go next**
>
> Measurement only tells you where to work. [Controlling AI crawlers with robots.txt](/guides/controlling-ai-crawlers-with-robots-txt) covers the access decisions that determine which fetchers can reach you at all, and [What is Answer Engine Optimization?](/guides/what-is-answer-engine-optimization) explains what to change on a page once the panel shows where you are losing citations.

## 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](https://help.openai.com/en/articles/12627856-publishers-and-developers-faq) — OpenAI Help Center (2025)
2. [Overview of OpenAI crawlers](https://developers.openai.com/api/docs/bots) — OpenAI (2025)
3. [AI features and your website](https://developers.google.com/search/docs/appearance/ai-features) — Google Search Central (2025)
4. [[GA4] Custom channel groups](https://support.google.com/analytics/answer/13051316) — Google Analytics Help (2025)
5. [Perplexity crawlers](https://docs.perplexity.ai/guides/bots) — Perplexity (2025)
6. [Does Anthropic crawl data from the web, and how can site owners block the crawler?](https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler) — Anthropic Help Center (2025)
7. [GEO: Generative Engine Optimization](https://arxiv.org/abs/2311.09735) — Aggarwal et al., KDD 2024 (arXiv) (2023)

## Related guides

- [What is Answer Engine Optimization (AEO)?](https://citable.wiki/guides/what-is-answer-engine-optimization)
- [Controlling AI crawlers with robots.txt: GPTBot, ClaudeBot, PerplexityBot and friends](https://citable.wiki/guides/controlling-ai-crawlers-with-robots-txt)
- [GEO vs SEO vs AEO: what actually changed](https://citable.wiki/guides/geo-vs-seo-vs-aeo)

---

Source: https://citable.wiki/guides/measuring-ai-visibility-and-citations
Author: Endrit Krasniqi
More: https://citable.wiki/llms.txt
