Hybrid human-agent sessions are the measurement problem nobody budgeted for. On August 7, 2026, Cloudflare published telemetry from Precursor — its session-scoped behavioural detection system — and reported something that quietly invalidates a core assumption in every analytics stack: inside a single session, behaviour often shifts from human to agentic and back again. Not two visits. One visit, two kinds of visitor.
The example Cloudflare gives is mundane enough to be uncomfortable: a person browses a store, then hands the checkout process to an automated shopping assistant. Under the rules your stack runs today, that session gets one classification, assigned once, and keeps it. Either the whole thing is a human — in which case your conversion metrics now include work a machine did — or the whole thing is a bot, and you have just filtered out a real customer with real intent.
This piece covers what Cloudflare actually reported and how far it can be trusted, why point-in-time detection structurally cannot see a mid-session handoff, exactly where each layer of a typical stack goes blind, and a concrete alternative: treat agent-touched sessions as their own reported segment rather than folding them into human traffic or throwing them away.
- 01The number is one day, from one vendor.Cloudflare recorded 206 million Precursor evaluation events across 73,438 zones in a single 24-hour window at the time of writing. It is a snapshot, self-measured on Cloudflare's own network, not a running total, a daily average, or a measurement of the whole web.
- 02Sessions are no longer one visitor type.Cloudflare states that behaviour often shifts from human to agentic and back over a session, and that suspicious behaviour often happens mid-session where point-in-time detection would not catch it. Both claims are Cloudflare's characterisation of its own telemetry.
- 03GA4's bot filter reads a string, not a session.The default exclude-known-bots filter matches the request user-agent against Google's known-bot list. It is structurally incapable of catching an agent that declines to self-identify, or a handoff that happens twenty seconds into a visit.
- 04Allow-or-block is the wrong shape for the problem.A binary decision taken once per request cannot express a session that changes character. Cloudflare's own framing shifts from static rules to Risk, judged per request, versus Trust, built over time — and it sells the product that benefits from that framing.
- 05The fix is a third segment, not a better filter.Report agent-touched sessions separately, tagged at the point of behaviour shift rather than assigned at session start. It is the only option that keeps human behavioural averages clean and still counts revenue an agent completed.
01 — The TelemetryWhat Cloudflare actually reported — and how far it goes.
The source is a Cloudflare blog post titled Unveiling good and bad behaviors on the Agentic Internet, published August 7, 2026 and credited to the company's Web Integrity & Trust team rather than a named author. Its headline data point: in a single 24-hour window at the time of writing, Cloudflare recorded 206 million Precursor evaluation events across 73,438 zones on its network.
Precursor itself was introduced on July 13, 2026 as a client-side, session-based verification system that uses dynamically injected JavaScript to continuously collect behavioural signals as visitors interact with an application. It sits inside Enterprise Bot Management as an optional complement to Turnstile — which Cloudflare says runs nearly 3 billion times per day, but only on high-sensitivity endpoints such as login, signup and checkout, leaving the rest of the session unobserved.
Evaluation events
Cloudflare's stated count of Precursor evaluation events in a single 24-hour window at the time of its August 7, 2026 post. Self-measured, single-source, and explicitly a one-day snapshot rather than a cumulative or steady-state figure.
Zones generating them
The number of Cloudflare-fronted zones producing those events in the same window. Cloudflare says its network handles over a trillion requests per day and fronts more than 20% of the web — a large but partial slice, not the internet.
Events per zone
206,000,000 ÷ 73,438 zones ≈ 2,805 evaluation events per zone across the window. This is a flat average over wildly unequal properties — a global retailer and a brochure site are one row each — so read it as scale, not as a per-site expectation.
Events per second
206,000,000 ÷ 86,400 seconds ≈ 2,384 evaluations per second sustained across the window. Useful only as a sense of throughput: it tells you continuous behavioural scoring is running at production scale, not at pilot scale.
02 — Hybrid TrafficThe session that changes species halfway through.
Cloudflare says the volume above let it validate two things at scale. The first is that suspicious behaviour often happens mid-session, which point-in-time detection would not catch. The second is the one with the wider blast radius, because it is not really about security at all.
Behavior often shifts from human to agentic and back over a session.— Cloudflare Web Integrity & Trust team, August 7, 2026
Take that seriously for a moment and a lot of standard measurement practice stops making sense. A session is the unit almost every report is built on. Bounce rate, pages per session, average engagement time, session conversion rate, assisted conversions, channel attribution — all of them assume the thing being measured has one nature for its duration. If a person browses six product pages and then delegates the checkout, the engagement metrics describe a human and the conversion describes a machine, and they are averaged into the same row.
It is worth being precise about whose claim this is. The human-to-agentic-and-back framing is Cloudflare's characterisation of Cloudflare's telemetry, published by a company whose bot management business benefits directly from operators believing that only continuous, session-level detection can see the problem. That does not make it wrong. It does mean the honest posture is to treat it as a well-evidenced vendor observation worth designing against — not as an independently established fact about the web.
03 — Detection PhysicsWhy a single check at the door cannot work.
The reason a challenge at the door fails is not that the challenge is weak. It is that the question it asks — is this visitor a bot right now? — has a different answer at minute one and minute nine. Cloudflare's stated design response is to scope evaluation to the session rather than the request, specifically so that, in its framing, a bot cannot reset its behavioural signature by refreshing the page or starting over with a new challenge.
What Precursor collects is narrower than people assume: pointer movement, keyboard activity described as timing and rhythm rather than the keys pressed, focus changes and visibility events. Those are buffered client-side and sent to Cloudflare's edge for evaluation. Cloudflare states the resulting signals are consumed internally by its bot-detection systems and are not exposed to customer dashboards or tied to user accounts, login identities or persistent profiles — which, as we will come back to, is precisely why this does not solve your analytics problem for you.
The company names three behavioural tells it treats as hard to fake over time. Read them as a description of the detection thesis, not as published accuracy figures — Cloudflare has not shipped false-positive rates for any of them.
Wrist-pivot arcs
Human cursor paths curve because a hand pivots at the wrist. Automated pointers tend toward linear interpolation or mathematically ideal Bézier curves — smooth in a way anatomy is not.
Cognitive-load delay
A person needs a measurable pause between a control appearing and acting on it. Scripted interaction collapses that gap, or reproduces it too consistently to look like a decision.
Physiological tremor
Hands shake slightly. Cloudflare points to unnaturally consistent click precision as the counterpart signal — the absence of noise is itself the anomaly it looks for.
Notice what these tells are good at and what they are not. They distinguish genuine human input from simulated human input. They do not, on their own, tell you whether an agent acting openly on a person's behalf should be welcome — which is a policy question, and one we worked through separately in our decision matrix for deciding which agents get access at all. Detection and permission are different problems, and conflating them is how sites end up blocking the assistants their customers actually use.
04 — Blind SpotsWhat each layer of your stack actually sees.
Vendor coverage of this stays inside vendor framing. The more useful exercise is to lay your own stack out and ask, layer by layer, what signal it evaluates, how often it evaluates it, whether it could detect a handoff in principle, and what it drops on the floor without telling you. The table below does that for the five layers most marketing and engineering teams actually run.
| Layer | Signal evaluated | How often | Sees a mid-session handoff? | What it silently misses |
|---|---|---|---|---|
| Client-side analytics — what your reports are built on | ||||
| GA4 tag with the default known-bot filter | The request user-agent string, matched against Google's maintained known-bot list, plus the events the JavaScript tag manages to fire. | Once per hit, at hit time. | No. The filter reads a string, never behaviour over time. | Any agent that declines to self-identify in its user-agent. A visit that begins human and ends agentic keeps whatever classification it was given at the door. |
| GA4 AI Assistant acquisition channel | The referrer header, when an AI chat or search surface sends one. | Once, when the session is assigned a channel. | No. Channel assignment is a session-open decision. | Reportedly, sessions where the referring tool strips or rewrites the referrer fall back to Direct or Referral. Described in trade coverage rather than confirmed against a Google primary — treat it as a plausible limitation to test, not a documented behaviour. |
| Edge and infrastructure — what sits in front of the origin | ||||
| Raw server and CDN logs | Every request line — method, path, status, user-agent, IP — regardless of whether JavaScript ever executed. | Continuously, one entry per request. | Partially. You can see the request pattern change shape mid-visit; nothing in the log labels it as a handoff. | Intent and identity. Logs record what was fetched, not what was driving the browser, so the interpretation work is entirely yours. |
| Bot management scored per request | Per-request scores, heuristics and fingerprints evaluated at the edge before the origin sees the request. | Once per request, then a decision: allow, challenge or block. | Not by design. Each request is judged on its own, and the verdict is binary. | By Cloudflare's own argument, suspicious behaviour that happens mid-session — because, in its words, point-in-time detection would not catch it. |
| Cloudflare Precursor, session-scoped (pre-GA) | Pointer movement, keyboard timing and rhythm rather than the keys pressed, focus changes and visibility events, collected by injected JavaScript. | Continuously, across the whole session. | This is the stated design goal — Cloudflare positions it explicitly against static, point-in-time checks. | Your analytics stack. Cloudflare states the signals are consumed internally by its bot-detection systems and are not exposed to customer dashboards or tied to user accounts, login identities or persistent profiles. |
Read down the fourth column and the shape of the gap is obvious. The only layer designed to see a handoff is the one whose output is deliberately not exposed to you. Cloudflare built session-scoped behavioural evaluation to make a security decision, and it keeps the signals inside its own detection systems. Nothing in that pipeline arrives in your reporting as a dimension you can segment on.
The pragmatic consequence: if you want agent-touched sessions in your reports, you are going to build that yourself, and raw request logs are the most honest starting material you have. That is the premise behind our work on server-log analysis that sees what GA4's tag never fires for and a 30-day site-log study of agentic crawler behaviour. Neither of those solves the handoff problem on its own, but both give you the one thing the tag cannot: a complete record of what was requested, in order, with timestamps.
05 — The Analytics GapGA4 is not broken. It is answering an older question.
Every GA4 property ships with an exclude-all-hits-from-known-bots filter, on by default, that matches the request's user-agent string against Google's maintained known-bot list and drops matching hits before they reach reports. It is a good filter for the problem it was designed for: declared crawlers that identify themselves politely and consistently, which is most of the classic search and SEO crawler population.
It is a string match. That single fact bounds what it can ever do. It cannot see an agent that declines to self-identify, because there is nothing in the string to match. And it cannot see a session that starts human and later hands off, because the string does not change when the driver does — the browser is the same browser, the user-agent is the same user-agent, and by the time behaviour shifts, the classification has already been made and applied to the whole session.
The second-order problem is the session model itself. GA4 buckets a continuous engagement into one session with one set of dimensions — a single default channel grouping, a single device category, a single source and medium. There is no dimension in the model whose value is allowed to change mid-session because the nature of the visitor changed. That is not a bug being fixed in the next release; it is the shape of the data model.
Cloudflare has also started reporting on the other side of this — whether AI assistants can see and cite your content at all — in the dashboard we covered in our look at Cloudflare's Agent Readiness dashboard.
06 — Trust Over TimeRisk is per request. Trust is built.
The organising frame behind both Precursor and BotBase is a split Cloudflare draws between Risk — the ephemeral, per-request likelihood that something causes harm — and Trust, which accumulates over time and behaves like reputation. Its argument is that a static allow-or-block rule of the form reject anyone who does X cannot hold context the way a trust-over-time model can. Whatever you think of the commercial motivation, the underlying observation matches what the hybrid-session data implies: a verdict that is correct at request one can be wrong at request forty.
BotBase is where that shows up as a product. It started as a directory of known good bots and has been expanded into a catalogue that also tracks less-than-good and unverified bots and agents — Cloudflare's reasoning being that once its systems validate behaviour for known-good actors, they can also detect when expectations are not met. The Verified standard now reduces to two tests, which the company states as: declare yourself honestly, and do not abuse the trust you have earned. BotBase itself is an Enterprise Bot Management feature, though every tracked bot plus select metadata is mirrored publicly in Cloudflare Radar's bots and agents directory.
One detail in BotBase is worth flagging for anyone about to build reporting on it. Its Requests column tracks Successful versus Unsuccessful over the trailing 24 hours per bot, where Successful means a 2xx or 3xx edge HTTP status. That is a response-outcome metric, not a mitigation-outcome metric — a bot can be recorded as successful while having been served a decoy or a challenge. If you report that column as blocked versus allowed, you will be reporting the wrong thing.
07 — What To DoStop classifying at the door. Tag at the shift.
There are only three things you can do with a session that changed character halfway through, and two of them are wrong in opposite directions. Laying them out side by side makes the choice uncomfortable enough to actually get made, rather than inherited from whatever your tag defaulted to three years ago.
Filter it out
Treat any session with agentic behaviour as bot traffic and drop it. Your human behavioural averages stay clean, and you delete revenue. Worse, you delete the evidence: the fastest-growing traffic class on your site becomes the one class you have no historical data for, right when you need to make decisions about it.
Count it as human
Do nothing, which is what most stacks do today. Agent-completed checkouts land in your conversion rate; agent-paced page views land in your engagement time. Every behavioural average quietly drifts, and you cannot tell whether a change in bounce rate is a UX problem or a change in the human-to-agent mix.
Segment it
Report agent-touched sessions as their own class alongside human and automated. Human averages are computed on human-only sessions; agent-assisted revenue is counted and attributed; and the ratio between the two becomes a metric you can actually watch over time. It costs implementation work and it is the only version that keeps both numbers honest.
The implementation principle that matters is the one Cloudflare arrived at from the security side: classify continuously, not once. In analytics terms, that means an agent-touched flag should be written at the moment behaviour shifts and should apply forward from that event — not be back-stamped onto the session's opening classification, and not overwrite it. You want to be able to ask how many sessions began human and ended agentic, which is a different question from how many sessions were agentic, and a completely different question from how many were bots.
Practically, that lands as three artefacts. A session-scoped custom dimension with three values rather than two. An event fired at the handoff, carrying a timestamp so you can measure where in the funnel delegation happens. And a reporting convention that every behavioural average in your dashboards is explicitly computed on human-only sessions, stated in the dashboard rather than assumed. If your reporting layer cannot express a mid-session dimension change, that constraint is itself the finding, and it belongs in the measurement plan — not in a footnote.
Our own view is that this becomes routine reporting hygiene within a year or two rather than an advanced technique, for a simple reason: the number of interfaces that can complete a purchase on a person's behalf is going up, and none of the parties adding them have any incentive to make that visible to your analytics. Teams that start keeping the three-way split now will have a trend line when the question gets asked in a board meeting. Teams that do not will have an averages problem they cannot decompose, and no history to reconstruct it from. If you want help wiring that into an existing stack, that is the kind of work our analytics and measurement practice does, alongside the agentic SEO work that deals with the other half of this shift.
08 — Announced, Not ShippedWhat Cloudflare says is coming — and is not here yet.
A large share of the August 7 post is forward-looking, and it is worth separating cleanly from what exists. Precursor was free to use pre-GA at launch in July 2026, rolling out from the Cloudflare dashboard, with general availability promised later this year. No GA date has been announced, and the August follow-up post does not give one. Everything below is announced intent, not a live feature you can plan a Q4 rollout around.
Adaptive Intelligence
Cloudflare describes a detection model that will continue to learn and self-adjust from traffic patterns, rather than shipping as the discrete, numbered model versions prior Bots ML updates used. Framed as coming soon to all Bot Management customers; no date given.
AI Labyrinth, three modes
Site owners would choose between an endless linked page maze, an LLM-generated summary useless as training data, or deliberately fake content such as fake prices and inventory. Cloudflare frames this for rollout closer towards the end of the year.
Queuing and unpredictability
Two ideas in the same lane: randomising block, challenge and allow responses to break automated retry and fingerprinting logic, and queuing legitimate automated traffic such as user-directed shopping agents instead of blocking it outright.
The queuing idea is the one worth watching, because it is the first of these that treats a user-directed shopping agent as a customer with a scheduling problem rather than as an attacker. That is the same conceptual move this whole piece argues for on the measurement side: stop asking whether the traffic is human, start asking what it is trying to do and on whose behalf. Cloudflare also shipped a public interactive demo alongside the August post that shows how Precursor would assess a visitor's own cursor movements — a useful intuition-builder, though it is a vendor simulation of the vendor's own logic, not independent evidence of accuracy.
Our forecast, stated as a forecast: the block-or-allow binary has perhaps a year left as the default mental model, and what replaces it is a graded response — verified agents queued, unverified agents rate-limited, simulated humans challenged — with an identity layer like Web Bot Auth carrying the declaration. The measurement stack will lag that by longer, because analytics vendors move slowly and because the signals that would inform a three-way split currently live inside security products that do not export them. The gap between what the edge knows and what your reports say is likely to widen before it narrows.
09 — ConclusionOne number, one day, and a structural problem.
A session is no longer a reliable unit of anything.
Cloudflare's 206 million evaluation events across 73,438 zones is a single-vendor, single-day snapshot, and it should be quoted that way. What makes it matter is not the size of the number but the finding attached to it: that behaviour inside one session shifts from human to agentic and back, which is a structural problem for a data model that assigns one classification per session and never revisits it.
Nothing in your current stack was built to express that. GA4's default bot filter reads a user-agent string once. Request-level bot scoring returns a binary verdict per request. Server logs see everything and label nothing. The one layer designed for continuous session-level behavioural evaluation deliberately keeps its output inside the vendor's own detection systems. There is no configuration change that closes this — the gap is in the shape of the models, not in their settings.
So the work is yours, and it is smaller than it sounds: a third segment, tagged at the moment behaviour shifts rather than at the door, and a stated convention that human behavioural averages are computed on human-only sessions. Do that now, while agent-touched sessions are still a minority of your traffic, and you will have a trend line instead of a discontinuity. Wait, and the first time someone asks how much of last quarter's conversion rate a machine was responsible for, the honest answer will be that you cannot tell.