The number of different pages AI engines cite depends on how you count a page. In the Machine Relations Index answer ledger, 201,266 cited-URL events point at 79,206 distinct address strings. Remove the utm_source=openai tag ChatGPT adds, the click identifiers, the scheme, www., fragments and trailing slashes, and they point at 75,656 pages. The raw count overstates the page count by 4.7 percent. The popular shortcut of dropping every query string gives 73,838, and it is wrong in the other direction: it turns the 1,245 YouTube videos engines cited into 2 pages.
The rule changes conclusions, not only totals. Counted as raw strings, ChatGPT shares not one page with any other engine, because every ChatGPT address ends in a tag. Counted as pages, 2,838 of its 15,259 pages (18.6 percent) were also cited by another engine. Across all five engines, 10.4 percent of pages look cited by two or more engines on raw strings and 13.3 percent after the rule.
This page is the counting rule the Index uses for "distinct pages", with the size of every step. It measures how addresses are written. It does not fetch a page, so it cannot show that two merged addresses return the same content.
What was counted #
- Population. Successful runs in the Index's buying-question panel, 2026-07-06 to 2026-11-09, on its 1,008 buying questions. Runs flagged as naming a brand in the prompt are excluded. The ledger export is dated 2026-11-10 08:10 UTC. It is the same 201,266 cited-URL events as the PDFs, Markdown and llms.txt study, and its first 197,384 events (to 2026-11-07) are the population of the tracking-tag study.
- Engines. ChatGPT, Claude, Gemini, Google AI Mode and Perplexity, through their APIs. Google AI Overviews are left out. These are API answers, not the consumer apps.
- Unit. One cited address in one answer run, counted once however often the run repeated it: 201,266 events from 23,729 runs.
- Address string. The cited address exactly as the engine returned it. A page is what remains after the rule below.
Five counts of the same events #
Each row applies one more step to the row above it.
| Rule | Different pages | Change from step | Pages cited by 2+ engines | Share |
|---|---|---|---|---|
| 1. Raw string | 79,206 | 8,214 | 10.4% | |
2. Lowercase host; drop scheme, www., port, fragment, trailing slash, /index.html |
78,779 | −427 | 8,265 | 10.5% |
3. Also drop utm_* parameters |
75,953 | −2,826 | 10,028 | 13.2% |
| 4. Also drop click and tracking identifiers (Index rule v1) | 75,656 | −297 | 10,071 | 13.3% |
| 5. Also drop every query string | 73,838 | −1,818 | 10,000 | 13.5% |
Two of the steps do almost all the work. The utm_* step removes 2,826 of the 3,550 addresses that rule v1 merges (80 percent), and 2,824 of the 2,826 are groups that include a utm_source=openai form, ChatGPT's tag. Structure (scheme, www., slashes) is another 427. Click identifiers such as Google's srsltid are the last 297.
Step 5 is the shortcut, and it removes 1,818 more addresses. Of those, 1,337 (74 percent) are youtube.com links. A YouTube address is youtube.com/watch?v=<video id>; the query string is the page. The ledger holds 2,937 watch-link events for 1,245 distinct video ids. Rule v1 keeps 1,339 watch addresses: the 94 extra are the same video written with a start time (t=), a language (vl=), another parameter or, for 2 videos, the m. host. That small overcount is deliberate. Rule 5 keeps 2.
The same rule, engine by engine #
| Engine | Cited-URL events | Raw strings | Pages (rule v1) | Raw overstates by | Drop every query |
|---|---|---|---|---|---|
| Perplexity | 107,152 | 42,923 | 42,694 | 0.5% | 41,774 |
| ChatGPT | 36,286 | 15,475 | 15,259 | 1.4% | 15,020 |
| Claude | 34,070 | 15,175 | 15,146 | 0.2% | 15,131 |
| Gemini | 17,580 | 11,234 | 11,231 | 0.03% | 10,828 |
| Google AI Mode | 6,178 | 4,493 | 4,383 | 2.5% | 4,077 |
Inside one engine the rule hardly matters: raw strings overstate Perplexity, Claude and Gemini by half a percent or less. The 4.7 percent overall comes from engines writing the same page differently. ChatGPT tags every address, and Google AI Mode carries shopping identifiers. So the error is largest exactly where engines are compared.
What the rule does to overlap #
The question "which pages do several engines cite?" cannot be answered on raw strings.
- ChatGPT. Raw strings: 0 of 15,475 ChatGPT addresses appear in any other engine. Rule v1: 2,838 of 15,259 pages (18.6 percent) are also cited by at least one other engine.
- Three or more engines. 1,650 pages on raw strings, 2,426 under rule v1 (+47 percent).
- Across all five. 10.4 percent of pages were cited by two or more engines on raw strings, 13.3 percent under rule v1, 13.5 percent when every query string is dropped. Dropping the remaining query strings adds little to overlap.
These shares are over the whole four-month ledger and every question together. They are not the per-question figures on the same-sources study, where 0.5 percent of address-question pairs were cited by ChatGPT, Claude and Perplexity together. A page cited by two engines on different questions counts here and not there.
How often one answer lists the same page twice #
Under rule v1, 42 of 23,729 runs (0.18 percent) cited the same page under two different strings. Duplicate listing inside one answer is rare. The distortion sits between engines and across days, not within an answer.
Across the ledger, 3,330 pages were cited in more than one written form, 6,880 address strings in all.
What the 481 other merges look like #
Outside YouTube, dropping every query string merges a further 481 addresses. The first fourteen groups listed by the script were the same article with a campaign or navigation parameter, for example a CNBC Select roundup with a ?doc= identifier, a Yahoo Finance article with ?fr=sycsrp_catchall, a Wall Street Journal Buyside page with ?eafs_enabled=false, and a Capital One page with a banner parameter. None was checked by fetching the page, and the 481 were not read one by one, so the page does not claim all of them are duplicates. That is the reason rule v1 stops at named tracking parameters: an unlisted parameter is left alone, and the cost is a small overcount instead of a silent merge.
What this changes #
- Say what you counted. "Distinct URLs", "distinct addresses", "distinct pages" and "domains" are four numbers. Here they are 79,206, 78,779, 75,656 and a domain count that no query string touches.
- Strip tracking, not queries. Drop
utm_*and named click identifiers. Do not drop all parameters while YouTube, search pages and filtered listings are in the data. - Normalize before comparing engines. ChatGPT's API tags every address, so any cross-engine match on raw strings reports zero overlap for it.
- Keep the rule in the method note. A page count is checkable only if the rule is written down with the export date.
- Domain counts are unaffected. The root domain is recorded once per event, so a domain count does not depend on the query string. Per-domain page counts do.
What this page does not show #
- That merged addresses are the same page. Nothing was fetched. Two addresses with the same path and different tracking parameters usually return one page; the ledger does not test it.
- Redirects and canonical tags. A page reachable at two paths counts twice here. Only a fetch could merge them.
- Letter case in paths. Paths are compared as written.
- The consumer apps. The Index collects through APIs. A consumer product may write addresses differently.
- Google AI Overviews. Not included.
- The level. The totals hold only these five engines in this panel and window. Another panel or window gives other totals; the gap between raw and rule v1 is the finding.
Method note #
Source: the Index answer ledger's citation-events table, daily export of 2026-11-10 08:10 UTC, read with DuckDB and joined to the run table. Filters: the buying-question panel, runs not flagged as brand-prompted, successful runs, a cited URL beginning with http, engines ChatGPT, Claude, Gemini, Google AI Mode and Perplexity, run dates 2026-07-06 to 2026-11-09. Unit: distinct (answer run, cited URL) pairs on the cited URL as recorded (201,266). Rule v1, in order: the host is lowercased; a leading www. and a port of 80 or 443 are removed; the scheme and fragment are removed; a trailing /index.html and trailing slashes are removed from the path; query parameters whose name starts with utm_ are removed, as are srsltid, gclid, fbclid, msclkid, msockid, mc_cid, mc_eid, hs_amp, amp, ref, ref_src, trk, cmpid, cid, campaign, source, ved and usg; the remaining parameters are kept in the order written. Rule 5 removes the whole query string. Overlap counts the number of distinct engines whose events fall on each page. The YouTube row counts youtube.com and m.youtube.com watch links and reads the v parameter. No interval is given: these are counts of one fixed population, not an estimate from a sample.
Frequently asked questions #
How many different pages do AI engines cite? #
In the Machine Relations Index ledger, 201,266 cited-URL events from 2026-07-06 to 2026-11-09 pointed at 75,656 different pages under the Index's counting rule, against 79,206 distinct raw address strings. The ledger covers ChatGPT, Claude, Gemini, Google AI Mode and Perplexity answers to 1,008 buying questions.
Should I remove query strings when I count cited URLs? #
Not all of them. Remove tracking parameters (utm_*, srsltid, gclid and similar) and keep the rest. Removing every query string turned 1,339 YouTube watch addresses, for 1,245 different videos, into 2 pages, and merged 481 other addresses that were not checked one by one.
Why does ChatGPT appear to share no cited pages with other engines? #
Because every address the ChatGPT API returned ends in utm_source=openai (see the tracking-tag study), so no raw string matches another engine's. After the tag is removed, 18.6 percent of ChatGPT's pages (2,838 of 15,259) were also cited by another engine.
Does the counting rule change domain counts? #
No. A domain count uses the root domain recorded for each event, which does not depend on the query string. It changes any count of pages or addresses, and any comparison of those between engines.
How much does it matter inside a single engine? #
Little. Raw address strings overstate pages by 0.03 percent on Gemini, 0.2 on Claude, 0.5 on Perplexity, 1.4 on ChatGPT and 2.5 on Google AI Mode. The error is concentrated in comparisons across engines.