Detect personal agent traffic
A new kind of assistant works for one person in the background: it books, compares, fills forms and buys, in a browser of its own in the lab's cloud. Meta Muse, ChatGPT Dots, Claude Duet, Gemini Agent, Grok Bot, Manus and Instinct all work this way. Their visits run your pages and your analytics tag like a person would, so they count as people, usually in Direct. They carry real intent, so filtering them out as bots is wrong too. This guide shows how each one shows up today, how to label it, and how to report it. It reflects our tests as of November 4, 2026.
1. Who is driving the browser
Attribution so far asks one question: which assistant sent this visit? The referrer and utm_source answer it. Personal agents add a second question: who made the visit? Keep the two apart. A visit can come from ChatGPT (the source) and be made by a Dot (the actor).
- Crawler. Indexes pages or collects training data, never for one person. Example: GPTBot, ClaudeBot. It doesn't run your analytics tag.
- Fetcher. Reads one page to answer one person's question, without a browser. Example: ChatGPT-User, Claude-User. It doesn't run your analytics tag either, so it only shows up in server and CDN logs.
- Person. Clicks a link in an answer. The referrer and the UTM tag say which assistant sent them. Estimate your hidden AI traffic covers these visits.
- Personal agent. Drives a real browser in the lab's cloud for one person. It runs your analytics tag and looks like a person. This guide is about them.
Some agents can also drive the person's own browser, such as Claude in Chrome. They send that browser's headers, so nothing in the request sets them apart. We leave them out here.
2. The seven personal agents
We send each agent to our test pages and log what arrives, without IP addresses. So far we gave each agent our URL directly, so whether an agent tags the visits it makes from a link is still to test. Where we haven't run a test yet, we say so and mark what others report. Each agent's lab page has the dated evidence.
Meta Muse
Meta AI lab page. Launched September 8, 2026. Tested, 13 runs: recognizable by inference only.
- No name in the user agent and no signature. Meta hasn't said how Muse identifies itself.
- Claims Linux x86_64 and sends only the "Chromium" brand in
Sec-CH-UA, where Chrome also sends "Google Chrome". - Comes from Cloudflare's network and renders with a software GPU on an ARM processor.
- When it found our agent card, it introduced itself as an AI browser agent acting for a researcher.
ChatGPT Dots
ChatGPT lab page. Launched September 29, 2026. Tested, 1 run: signs its requests, beacons included.
- Each Dot browses from its own cloud computer. It sends a plain Chrome on Linux user agent with only the "Chromium" brand in
Sec-CH-UA, so nothing in the user agent names it. Cloudflare reports the network as OpenAI. - It signs with Web Bot Auth, naming
https://chatgpt.cominSignature-Agent. In our run the page load and all 11 analytics beacons were signed, unlike Manus, which signed only its page load. - The key id matches the one in OpenAI's key directory. We didn't verify the signature itself.
- It ran our analytics tag and didn't open our agent card.
- Dots and Manus are the agents you can verify instead of guess. Other OpenAI agents may sign the same way, so the signature proves OpenAI, not a Dot.
Claude Duet
Claude lab page. Research preview since October 21, 2026. Tested, 1 run: names itself.
- Sends a full Chrome user agent with
Claude-Agent/1.0added, and the regular "Google Chrome" brands. No signature. - Comes from Google Cloud's network, reports UTC as its time zone and has no WebGL.
- It ran our analytics tag and read our agent card, but didn't send a message.
- A name in the user agent is easy to read but anyone can copy it, so treat it as declared, not proven.
Gemini Agent (Google-Agent)
Gemini lab page. Since May 2026. Tested, 2 runs: names itself.
- Sends a Linux or Android Chrome user agent with
compatible; Google-Agentand a link to Google's docs added. NoSec-CH-UAbrands. - Comes from the IP ranges Google publishes for user-triggered agents, so you can check the name against the network.
- No signature in our runs. Google says it is experimenting with Web Bot Auth under
https://agent.bot.goog. - It ran our analytics tag and read our agent card, but didn't send a message.
Grok Bot
Grok lab page. Beta since August 2026. Tested, 1 run: looks like a person.
- Each Bot works on a persistent cloud computer with a browser. SpaceXSI (formerly xAI) documents no user agent or signature for it.
- In our run it sent a plain Chrome on Linux user agent with the regular "Google Chrome" brands, from Cloudflare's network, with no signature. It ran our analytics tag.
- It read our agent card through Exa's fetcher instead of its browser. Those requests name themselves
ExaUserand are signed. - The Grok Bot FAQ says that when a site blocks cloud computers, the person can route the Bot's traffic through their own computer. Those visits then look like the person.
Manus
Manus lab page. Since March 2025. Tested, 1 run: names itself and signs.
- Adds
Manus-User/1.0to a normal Chrome user agent, with noSec-CH-UAbrands. - Signs its page loads with Web Bot Auth, naming
https://api.manus.iminSignature-Agent. The key matched the one in its key directory. - Comes from Google Cloud's network. It ran our analytics tag and read our agent card, but didn't send a message.
Instinct
Instinct lab page. Invite only. Untested.
- A personal agent people reach by text message. Reports describe it browsing in a leased cloud browser and not naming itself to websites.
3. Label the visit at the edge
Your CDN or edge sees request headers. Your analytics tag in the page doesn't. So decide there, in this order, and stop at the first match:
- Signature. A
Signature-Agentheader with a valid Web Bot Auth signature is the only signal nobody can fake. Verify it against the key directory the agent publishes. Some CDNs do this for you. Seen for Manus and Dots. - Name in the user agent.
Claude-Agentfor Duet,Google-Agentfor Gemini Agent,Manus-Userfor Manus. Declared, not proven, unless the network matches, as Google's published ranges allow. - Hosted browser hints. A Linux x86_64 user agent with only the "Chromium" brand points to a hosted browser, as with Muse. Real Chromium users on Linux exist, so treat it as likely, not certain.
- Everything else counts as a person. Grok Bot and Instinct land here today.
Our classifier follows these rules, and we use it on our own logs. It returns the actor, the assistant when it's known, and how sure it is: verified, signed, declared or inferred. A minimal edge version:
// Cloudflare Worker (any edge works the same way): label the visit, then hand
// the label to the page so your analytics tag can read it.
import { classify } from './actor.mjs'; // copy from github.com/keepthebyte/attribution-now
export default {
async fetch(request) {
const h = request.headers;
const who = classify({
user_agent: h.get('user-agent'),
sec_ch_ua: h.get('sec-ch-ua'),
signature_agent: h.get('signature-agent'),
signed: h.has('signature') ? 1 : 0,
});
const response = await fetch(request);
if (!response.headers.get('content-type')?.includes('text/html')) return response;
return new HTMLRewriter().on('head', {
element(head) {
head.append(`<meta name="visit-actor" content="${who.actor}">`, { html: true });
},
}).transform(response);
},
};
Keep the label coarse, such as agent-hosted or human. Don't pass raw headers or fingerprints to the page.
In the browser you can add one more hint: hosted browsers often run on ARM processors with a software GPU while claiming to be x86. Our cloud browser check tests for that, and it catches Muse.
4. Pass the label to analytics
Read the label in the page and send it with the page view:
// Before your analytics tag: read the label and send it with the page view.
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
visit_actor: document.querySelector('meta[name="visit-actor"]')?.content || 'human',
});
- Google Analytics 4. In Google Tag Manager, read
visit_actorwith a Data Layer Variable, send it as an event parameter, and register it as an event-scoped custom dimension. See Track AI assistant traffic in Google Analytics for the source side. - Adobe Analytics and Customer Journey Analytics. Map
visit_actorto an eVar or an XDM field. See the Adobe Analytics and Customer Journey Analytics guides.
Check your bot filters too. Some drop visits from data centers or headless browsers, and would quietly remove the agents you want to see.
5. Report agents as a segment
Agents don't read like people. They load fewer pages, scroll little and finish fast, so in your normal reports they lower engagement and skew conversion rates. Report them next to people, not mixed in and not filtered out:
- Agent visits by agent, next to people from the same assistant.
- Task completion: how often an agent reaches the cart, the form or the booking step.
- Handoffs: where an agent stops and asks its person, such as login, CAPTCHA or payment. Duet asks before it pays or signs, and Grok Bot hands CAPTCHAs back. Those pages need to work for both.
- Conversions with agent help: the person's later visit or purchase after an agent prepared it.
6. What we ask of the labs
Two small changes would make personal agent visits measurable for every site:
- Sign agent requests with Web Bot Auth and publish the key directory, so sites can verify the agent instead of guessing.
- Say where the visit came from. Add the same
utm_sourcea person's click would carry to the agent's first page, so the visit has a source as well as an actor.
We will add agent tests to our test catalog and report each agent's status on the scorecard, as we do for links.