Skip to content
Tech News
← Back to articles

Bot Detection Without JavaScript: What My Blog Measured

read original get High Performance Browser Networking (O'Reilly, Ilya Grigorik) → more articles
Why This Matters

A blogger's hands-on experiment shows that most traffic claiming to be a browser isn't a human reader: server-side network and header rules reclassified 74.5% of browser-User-Agent requests, and even the remainder didn't match JavaScript-based analytics. It's a concrete reminder that web traffic numbers publishers and advertisers rely on are shaky, especially as AI agents and cloud-based crawlers spoof browser identities.

Key Takeaways
Worth a Look

High Performance Browser Networking (O'Reilly, Ilya Grigorik) — If you're digging into request headers, navigation semantics and what actually happens between a client and your edge worker, this O'Reilly book is the classic deep dive into HTTP and browser networking behavior. It's exactly the background that makes header-based bot classification rules feel less like guesswork and more like engineering.

See High Performance Browser Networking (O'Reilly, Ilya Grigorik) on Amazon → Affiliate link — we may earn a commission on purchases, at no extra cost to you. Product picked by AI based on this article; it is not a tested recommendation.

Bot Detection Without JavaScript: What My Blog Measured

On my blog, network and request-header rules moved 277 of 372 browser-User-Agent requests out of the Browsers category: 74.5%. That gives me a much more useful account of the traffic arriving at my Cloudflare Worker. It has not established how many people read the site. Over the same two complete UTC days, the remaining 95 Browser HTML observations still differ from 14 Cloudflare Web Analytics page loads. The useful result is knowing which requests the rules separate, why they separate them, and where the evidence stops.

Network evidence catches requests that pass the header checks. In that window, 60 cloud-classified requests carried the navigation headers the browser rule requires.

In that window, 60 cloud-classified requests carried the navigation headers the browser rule requires. A reason for each classification makes the counter explainable. It also exposed mistakes: our HTML-acceptance check mishandled valid headers, and new rows were missing their network-provenance marker. Both have since been repaired.

It also exposed mistakes: our HTML-acceptance check mishandled valid headers, and new rows were missing their network-provenance marker. Both have since been repaired. Client identity and readership need different evidence. Nine stored signature verifications identify signers, including crawlers and deliberate tests. They do not count people asking an assistant to read.

Nine stored signature verifications identify signers, including crawlers and deliberate tests. They do not count people asking an assistant to read. The remaining disagreement is a measured problem. Neither a smaller Browser count nor agreement with a script counter establishes audience accuracy.

Comparing edge page views with a script counter

Comparing two counters exposed the problem with my first-party analytics: I had treated browser User-Agents as evidence of readers. The counters measure different events, so their disagreement is a starting point for investigation. It cannot, by itself, tell me which requests were automation.

The initial alarm came from this comparison, saved on September 3:

Source Page events / loads Client or visit metric D1 browser-UA class, seven UTC days ending September 2 1,209 578 daily client identifiers Cloudflare Web Analytics, its rolling seven-day dashboard window 113 52 visits

... continue reading