How Much Traffic Is Your GA4 Actually Missing? I Built a Dashboard to Find Out | Papercrane Blog
All postsHow Much Traffic Is Your GA4 Actually Missing? I Built a Dashboard to Find Out<br>July 22, 2026<br>Tim Liu
Cloudflare says the site served 5,080 requests last week. GA4 says 2,461 pageviews. Same seven days, same ten pages, and the two most trusted tools in the stack disagree by more than double.
Everyone who works with analytics knows GA4 doesn’t capture everything. Ad blockers, bots, consent banners, and Safari’s tracking protections all take their bite. What almost nobody has seen is their own number, because the data that would reveal it doesn’t live in your analytics tool. It lives in your CDN, and most teams never put the two side by side.
I’ve spent countless hours trying to coax GA4 into telling me more about who it isn’t tracking. This isn’t an academic itch. Attribution runs on this data, and whether a lead gets counted as an MQL or an SQL can literally be the difference in whether someone gets paid. If a meaningful slice of your visitors never makes it into the funnel data at all, you’re making those calls with a partial picture and no idea how partial it is.
So I finally measured it. I connected Cloudflare and GA4 to the same dashboard and compared them page by page. The build took about ten minutes using Claude Code and Papercrane. This post walks through the exact steps and prompts so you can run the same comparison on your own site. I recorded the whole thing too, so if you’d rather watch than read, the video is below.
One disclosure before we get into it: the site in this post isn’t mine. It belongs to a friend who gave me permission to wire up its analytics, and I’ve blanked out identifying details in the screenshots.
Why GA4 can’t see everything
GA4 counts a pageview when a piece of JavaScript executes in a visitor’s browser and successfully phones home to Google. Cloudflare counts a request when it passes through the edge on its way to your server. That difference sounds small. It isn’t.
Anything that prevents the JavaScript from running, or from reporting back, vanishes from GA4 entirely: browsers with ad blockers, visitors who bounce before the tag loads, clients with JavaScript disabled, and every bot and crawler that fetches your pages without rendering them. Cloudflare sees all of it, because you can’t request a page without going through the edge. Cloudflare’s own documentation is upfront about this, and their community forums regularly see reports of 3x to 4x discrepancies between the two.
The scale of the invisible traffic is bigger than most people assume. The 2025 Bad Bot Report found that bots made up 53% of all web traffic, the second year in a row that automated traffic outnumbered humans. On the human side, ad blockers hide GA4 from roughly 5 to 15% of general audiences, and Plausible measured blocking rates as high as 58% on tech-savvy audiences. The blocked segment skews technical and higher income, which for a lot of businesses means the most valuable visitors are the least visible ones.
None of this makes GA4 wrong. It makes GA4 one witness with one vantage point. The interesting question is how far its testimony diverges from the raw record, and that ratio is knowable if you look.
The setup
My tool for this was Papercrane, which builds live dashboards through Claude Code. Setup is a single prompt:
Read https://papercrane.ai/get-started and install and login<br>Claude reads the page, installs the CLI, and opens the login flow in the browser. From there I connected the two data sources by asking for them. "Connect google analytics" pops a standard Google OAuth window. "Now connect cloudflare" starts the Cloudflare flow, which needs one manual step: creating an API token in the Cloudflare dashboard.
The custom API token: Read access for Account Analytics, Zone, and Zone Analytics, scoped to the right account and zone.<br>The token needs Read access for three permission scopes: Account: Account Analytics, Zone: Zone, and Zone: Analytics. Make sure it also includes the right account and zone under Account Resources and Zone Resources, or the queries will come back empty. Claude verified the connection worked by listing the zones it could see before moving on.
The build
Here’s the full dashboard prompt, with the site details swapped for placeholders so you can reuse it:
Build a dashboard to compare Cloudflare requests vs GA4 pageviews for the<br>top 10 landing pages (exclude "/"), last 7 days, grouped by<br>America/New_York days.
- Cloudflare: zone . Query httpRequestsAdaptiveGroups via<br>cloudflare.schema.query with filters: requestSource "eyeball",<br>edgeResponseStatus 200, method GET, exact clientRequestPath. This plan<br>caps queries at a 1-day range, so query per day.
- GA4: the property is named "Your GA4 Property "
Once built show me the dashboard in the preview window<br>The details in that prompt are doing real work, and they’re worth understanding before you run it...