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

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.

ChatGPT Dots

ChatGPT lab page. Launched September 29, 2026. Tested, 1 run: signs its requests, beacons included.

Claude Duet

Claude lab page. Research preview since October 21, 2026. Tested, 1 run: names itself.

Gemini Agent (Google-Agent)

Gemini lab page. Since May 2026. Tested, 2 runs: names itself.

Grok Bot

Grok lab page. Beta since August 2026. Tested, 1 run: looks like a person.

Manus

Manus lab page. Since March 2025. Tested, 1 run: names itself and signs.

Instinct

Instinct lab page. Invite only. Untested.

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:

  1. Signature. A Signature-Agent header 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.
  2. Name in the user agent. Claude-Agent for Duet, Google-Agent for Gemini Agent, Manus-User for Manus. Declared, not proven, unless the network matches, as Google's published ranges allow.
  3. 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.
  4. 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',
});

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:

6. What we ask of the labs

Two small changes would make personal agent visits measurable for every site:

We will add agent tests to our test catalog and report each agent's status on the scorecard, as we do for links.