AI crawlers and bots

How to count visits from ChatGPT, Claude, Perplexity, Copilot and Gemini

By Nora Blake 路 Oct 6, 2026 路 8 min read

You suspect people are arriving from an assistant. Your referrer list probably shows it already, mixed in with Google, social sites and a long tail of hostnames you have never heard of. This post shows how to pull the five big assistants out of that list, how much to expect, and which visits you will never be able to attribute.

What counts as a visit from an assistant

A person asks an assistant a question. The answer cites your page. The person clicks the link and your page loads. That page view arrives with a Referer header, and the header names the site the click came from. If the click came from the ChatGPT web app, the host is chatgpt.com. That is the whole mechanism. No crawler is involved, and nothing is read from the question.

These are the hostnames to match for the five assistants in this post:

AssistantReferrer hostname
ChatGPTchatgpt.com
Claudeclaude.ai
Perplexityperplexity.ai
Copilotcopilot.microsoft.com
Geminigemini.google.com

Semrush publishes a pattern for tracking AI referrals that includes all five of these hosts, plus openai.com, bard.google.com, you.com and search.brave.com. Two details matter when you write your own rule.

First, match the host and its subdomains, not a substring. A link can arrive from www.perplexity.ai, and a substring match on google.com would pull in every Google search visit. Second, never match the bare domain google.com or microsoft.com for Gemini or Copilot. Gemini lives on one subdomain and Copilot on another, and the parent domains carry ordinary search traffic you want to keep separate.

How much to expect

Do not expect a lot. The best public numbers describe averages, and the average site is small in this channel. In a study of 3,000 sites published on Feb 6, 2025, Ahrefs found that 0.17% of a site's visitors came from AI chatbots, and that 63% of the sites received at least one such visit. Ahrefs states that the figure covers only visible traffic, the visits that carry a referrer. Smaller sites did better in relative terms: sites under 999 monthly visitors got 0.56% of their visitors from AI, against 0.13% for sites above 10,000.

The split between assistants is lopsided. The chart below does not show clicks sent to your site. It shows visits to each assistant's own website in July 2025, measured by Semrush Traffic Analytics, which tells you how large each audience is. A larger audience sends more clicks, but the click rate is not in this data, so treat the chart as a guide to which rows in your referrer list will be fat and which will be nearly empty.

85.79%4.7%2.84%2.5%2.23%1.6%0.27%0.05%0%0%chatgpt.comgemini.google.comperplexity.aigrok.comclaude.aicopilot.microsoft.commeta.aiyiyan.baidu.comdeepseek.aibrave.com/leo/

Source: Semrush, How to Track, Measure, and Boost AI Referral Traffic, 2025-07. Retrieved Oct 6, 2026.

ChatGPT held 85.79% of the visits across the ten assistants Semrush listed, and Gemini was next at 4.70%. Claude, Perplexity and Copilot each sat between 1.60% and 2.84%. The data is from July 2025, so it is more than a year old, and the order of the smaller assistants moves from month to month. For a small site, the practical reading is simple: if you see 100 visits from assistants in a month, most will come from one hostname, and the other four will be single digits. Do not draw conclusions from a row with three visits in it.

Count them yourself

You can do this in any tool that lets you read the referrer. The rule is the same everywhere: take the hostname from the referrer URL, compare it to the five domains, and accept an exact match or a subdomain. Here is that rule as a complete Node script. Save it as classify.mjs:

const ASSISTANTS = [
  ["ChatGPT", "chatgpt.com"],
  ["Claude", "claude.ai"],
  ["Perplexity", "perplexity.ai"],
  ["Copilot", "copilot.microsoft.com"],
  ["Gemini", "gemini.google.com"],
];

export function assistantFor(referrer) {
  let host;
  try {
    host = new URL(referrer).hostname;
  } catch {
    return null;
  }
  for (const [name, domain] of ASSISTANTS) {
    if (host === domain || host.endsWith("." + domain)) return name;
  }
  return null;
}

const samples = [
  "https://chatgpt.com/",
  "https://www.perplexity.ai/search/abc",
  "https://gemini.google.com/app",
  "https://www.google.com/search?q=peeko",
  "",
];
for (const s of samples) console.log(JSON.stringify(s), "->", assistantFor(s));

Run it with node classify.mjs. The first three samples return ChatGPT, Perplexity and Gemini. The Google search URL returns null, and so does the empty string, which is what a visit with no referrer looks like. Paste the function into whatever job reads your logs or exports, and feed it the referrer column.

If your analytics tool takes a regular expression instead, this one matches the five hostnames and their subdomains when applied to a hostname:

(^|\.)(chatgpt\.com|claude\.ai|perplexity\.ai|copilot\.microsoft\.com|gemini\.google\.com)$

Apply it to the referrer hostname, not the full URL, or the end anchor will never match.

An abstract illustration of five labeled paths converging on one small house, with a sixth path arriving through fog with no label.

Where Peeko fits

Peeko is one script tag with a site key. It sets no cookie and needs no configuration once it is on the page. It counts visits from ChatGPT, Claude, Perplexity, Copilot and Gemini from ordinary page views by their referrer, with no middleware involved. You do not install anything beyond the tag you already have, and you do not write the rule above.

The privacy model is the same for these visits as for any other. No IP address is ever stored. A visitor is the first part of a one way keyed hash of their address and browser string, and the address itself is never written to a database or a log. The hash behind the People number mixes in the date and is re-salted every day, so nobody can be followed from one day to the next. A second hash without the date is what tells a returning visitor from a new one, and it is the identity behind goals, funnels and revenue. That matters for this question: a goal is a definition rather than a counter, so a goal you write today counts over months before it was written. You can ask whether people who arrived from an assistant did the thing you care about, including on days that came before you thought to ask.

What the count misses

A referrer match gives you a floor. Three things keep it from being a total.

Missing referrers. Semrush states the problem directly: many AI clicks show up as Direct in Google Analytics 4 because AI platforms do not always pass referrer information. Ahrefs says the same about its own 0.17% figure: it covers only visible traffic, and some tools may not pass a referrer, so their visits are classified as Direct. A person who copies a link out of an answer and pastes it into a new tab, or taps a link inside a mobile app that strips the header, arrives as Direct. Nothing in your page views can recover that visit after the fact.

Hosts you did not list. The five hostnames cover the five assistants named here. Others exist, and Semrush's pattern includes you.com and search.brave.com on top of them. Look at the top 50 referrers on your site once and see whether an assistant appears that your rule does not catch. This is a ten minute check, and you only need to do it when your referrer list changes.

Small numbers. At 0.17% of visitors on average, a site with 2,000 monthly visitors would see a handful of visits from assistants. A week with 4 visits and a week with 9 are not a trend. Count by month, and watch the five rows separately only once the total passes a few dozen.

Fetches are not visits

There is a second way an assistant touches your site, and it is easy to confuse with the first. When someone asks ChatGPT a question, OpenAI's documentation says it may visit a web page with the ChatGPT-User agent. That is a fetch. A server asked for your page while an assistant was replying to somebody. No person opened your page, and no referrer exists.

Peeko treats the two as separate measurements, and you should too. A click from an answer is a visit, and you count it from page views by referrer. A fetch for an answer says a page was read while an assistant was replying to somebody, and the question itself never reaches your server, so nobody can report it. If you add the two together you get a number that means nothing: a fetch with no click is a page that was used and a click with no fetch is a link that was followed.

Fetches are counted on a different path. AI crawler tracking is a separate server side path, because crawlers do not run JavaScript. The @usepeeko/bot-track middleware is ESM only, needs Node 20 or newer, has zero runtime dependencies and weighs under 3 KB gzipped. Peeko matches a crawler user agent against a curated list of 55 agents from 21 companies, and files every recognized hit under AI answers, Search indexing, AI training or Other AI bots. No address and no visitor hash exist on the crawler path at all, and the raw user agent is kept up to 512 characters so old hits can be reclassified as the crawler list grows. AI crawler hits are never billed.

You do not need the middleware to count the visits in this post. You need it only if you also want to know which pages assistants read.

A routine that takes five minutes a month

  1. Open your referrer list for the last full calendar month and sort it by visits.
  2. Add up the rows whose host matches the five hostnames. That is your floor.
  3. Compare it to your Direct total. If Direct is large and you have a known source of untagged links, such as an app or a newsletter, the true assistant number is higher than your floor, and you cannot say by how much.
  4. Check that no other assistant host shows up in the top 50 referrers.
  5. Pick one page that gets assistant visits and read what it says. People arrive with a question already answered above the link, so the first screen of that page should confirm the answer instead of restarting the pitch.

The floor is enough to answer the question you started with: yes or no, and roughly how big. If it is zero for three months on a site with real traffic, your pages are not being linked from answers, or the links are not passing a referrer. If it is above zero and growing, you now have a number you can watch, and a goal you can attach to it.