Agent traffic
People now tell AI "book me a plumber for Thursday", and it goes to a website and tries. This is the reference for the instrument that counts those visits.
The tracker answers one question nobody has an honest number for: how much AI traffic does an ordinary service business get, and how often does the AI try something and fail?
It only watches and sorts. It never carries out an action, never writes to your site, and cannot touch a form.
Four verdicts
| Verdict | Meaning |
|---|---|
human | A person, behaving like a person. This is the default. |
agent | Software acting on the site for a person, because it says so, shows a signed identity, or has strong evidence. |
suspected-agent | Real but ambiguous evidence. Deliberately not rounded up to agent. |
bot-other | A bot that is not an agent: search crawlers, SEO tools, monitors and AI training crawlers. |
Five kinds of evidence
| Evidence | What fires | Verdict |
|---|---|---|
| 1. Known AI agents | ChatGPT-User, Claude-User, Perplexity-User, Operator, NotebookLM: AI acting for a person. | agent, confidence 0.90 |
| 1b. AI crawlers | GPTBot, ClaudeBot, PerplexityBot, CCBot, Bytespider, Google-Extended. | bot-other, platform recorded |
| 2. Signed identity | The Signature, Signature-Input and Signature-Agent headers. | agent, confidence 0.95–0.97 |
| 3. AI referrers | A visitor arriving from chatgpt.com, perplexity.ai, claude.ai, gemini.google.com or copilot.microsoft.com. | Stays human, recorded as its own signal |
| 4. Automated-browser signs | A headless browser, an automation flag, no mouse, scroll or key activity, a mobile browser at a desktop window size, or form fills too fast for a person. | agent at two or more signs, otherwise suspected-agent |
| 5. Failed forms | Which form, which field, and how it died: rejected, blocked by a CAPTCHA, never submitted, or abandoned. | No effect on the verdict, kept as evidence |
Why it takes two
1.00agentThe line, and at least two independent signals. The heaviest single weight is 0.70, so one signal never reaches it.0.45suspected-agentReal evidence, carried as ambiguity. Below this line the verdict stays human and the signal is still written down.
- One weak signal0.20No plugins on desktop Chrome0.20humanShort of the first line. The default holds and the signal is recorded, changing nothing.
- The heaviest signal, alone0.70Headless user-agent0.70suspected-agentRead from the request itself, and still short of the agent line by construction. Counted as suspected, never as agent.
- The same signal, and one more0.70Headless user-agent0.35No pointer, scroll or key events1.05agentTwo independent signals, over the line: an agent. With confidence, not certainty, nothing reaches 1.0.
The default is human. Real evidence is needed to say agent, and ambiguity is carried rather than rounded up. What the request itself says, such as the user-agent, is trusted. What the browser says about itself is not, so on its own it can never add more than 0.75 confidence. Nothing is verified cryptographically, so confidence stops at 0.97.
The tracker therefore under-counts agent traffic rather than over-counting it. If a report says agents are visiting, they are. If it says they are not, read that as a floor.
It notices a signed identity but does not check the signature. The report says "presented (unverified)", never "verified agent".
Three ways this could quietly lie, and what stops each
- Counting AI crawlers as agents. They visit nearly every site, so all would show agent traffic on day one. They are
bot-otherand get their own report line. The headline counts only AI acting for a person. - Counting AI referrals as agents. A referral means a person followed an AI answer here. It is not an agent acting on the site, so it never moves a visit off
human. - Counting failed forms as agent evidence. People fail forms constantly. A failure only becomes a failed agent action once the verdict independently says agent or suspected-agent.
What it collects
- Your site’s domain, and a shortened page path: only the first segment, and only when it does not look like an identifier, so
/patients/jane-smith-0412345678/appointmentbecomes/patients/*. The query string is never seen. - The site that sent the visitor, as a domain only.
- The browser’s user-agent, which every web server already receives.
- Signs that tell a person from software: whether the browser says it is automated, how many languages and plugins it lists, the window size, and counts of mouse, scroll and key events. None of these identify a person.
- If a form is used: field names and types, time to fill, keystroke counts, and whether it succeeded, was rejected, hit a CAPTCHA or was abandoned. A rejection is one word from a fixed list, never the message itself.
What it never collects
- No cookies, and nothing else stored on the visitor’s device.
- No visitor ID, no fingerprint hash, no cross-site tracking.
- No IP addresses. Not logged, not stored.
- No form contents: no names, phone numbers, emails or message text. The only question asked of a text field is whether it is empty.
- No password, hidden or file fields, not even their shape. A keystroke count on a password field approximates the password’s length, so those fields are excluded, and the collector drops any such record a forged beacon supplies.
- No tick-box answers. For a checkbox or radio button the ticked state is the answer, so only the fact that it was touched is kept.
- No error-message wording, because a site can put a customer’s name in its own messages.
Privacy limits
Three limits apply. If you forward the privacy summary to a client, forward these with it.
A one-word top-level path such as /jane-smith is stored as written, because it looks the same as /hot-water-repair. A site with person-named top-level pages should wait to install the tracker.
The page-wide keystroke count includes keys typed into fields the tracker does not observe. On a page whose only input is a password box, it approximates the password’s length. It stays because dropping it would make a person who only typed a password look like a bot.
Rows in a small single-site data file are weakly linkable: each holds the user-agent, window size and a timestamp. No identifier is created or stored, but that is not the same as linking being impossible.
Do Not Track and Global Privacy Control are honoured
If the browser sets navigator.globalPrivacyControl or reports doNotTrack === "1", the snippet does nothing: no listeners, no beacon, no request.
People who set the signal are not counted and agents rarely set it, so the agent share is biased slightly upward, the only bias here that points that way. An automated browser can also hide by setting it, which under-counts agents.
Retention: 60 days, enforced by the store
Events older than 60 days are deleted outright, on by default. No aggregate, counter or rollup survives, so "then deleted" is literally true. The cost is that a report cannot show a trend older than 60 days.
Deletion cannot be undone, so it is cautious: a row with an unreadable timestamp is kept, an unreadable file is left alone, and a bad retention setting is refused. Turning retention off has to be typed out as "off".
The collector treats every beacon as hostile
A beacon is a message a stranger can send, from a fuzzer to a competitor trying to skew your numbers. So the collector trusts nothing in it:
- Only known fields are copied. Every string is shortened and cleaned, every number is checked and capped, and every fixed-choice value must be on its list or becomes a safe default.
- The verdict is worked out on the server from the real request. A verdict, user-agent or signal list in the message is ignored.
- The site is taken from the
OriginorRefererheader in preference to the message, so a beacon cannot credit its traffic to someone else’s domain. - The response is always
204, so a stranger’s browser learns nothing.
Size caps, beacon format and run commands are in the tracker’s README.
The one list that goes stale
New AI products ship constantly, so the list of known agent user-agents ages. Adding one is a single-line edit. The field that matters is uaClass: assistant means acting for a person and counts as agent traffic, ai-crawler means training or indexing and does not.
The list was last reviewed on 25 August 2026 and the next review is due 25 September 2026. It was compiled by a model whose training data ends in May 2026, so anything newer is missing until a human re-checks. A stale list undercounts.
What this instrument has measured so far
4
of our five own sites are sending events (read 14 October 2026), frontlatch.com among them. The 60-day clock has run since 25 August. No customer site has installed it.
The tracker is free. You get the answer for your site, and Frontlatch gets the answer across all the sites.
The snippet has no default collector address, because a default could point at a host someone else registers and send a business’s visitor data to a stranger.