PricingSearch articles
Book a strategy call
Link Building

A Server Log Missed 37% of Crawler Fetches Behind Cloudflare

For 14 days we counted crawler visits in our server log and at Cloudflare. The log missed 37% of genuine page fetches and counted thousands of fakes.

Request pills all reach an edge cache card and only two connectors continue to a server log card
Jordan Ellis October 12, 2026 7 min read 1,339 words

For 14 days we counted crawler visits twice, in our server log and at Cloudflare. The server log missed 37% of genuine crawler page fetches, and it counted thousands of requests that only borrowed a crawler’s name.

A server log sits behind the CDN, the network that delivers a site’s pages. When the CDN answers a request from its own stored copy, the server never hears about it.

Here’s what each source saw, which crawlers the log undercounted, how often a name was borrowed, and how to check your own site.

What We Measured

Fourteen full days, 22 September to 5 October 2026, on this site, from two sources at once.

  • At the server: the access log, every request that reached our web server.
  • At the CDN: Cloudflare’s analytics, including requests it answered itself.
  • Page fetch: a successful request for a page, not an image or a script.
  • Genuine: verified by Cloudflare, or sent from the operator’s published addresses.

The user agent is the name a visitor’s software gives itself. Behind a CDN, our server log has nothing else to identify a crawler. Cloudflare also sees the sending address.

A same requests badge feeding a tall edge record panel and a shorter server log panel

The two sources agreed on what reached the server

Before comparing them, we checked that both describe the same traffic. Across nine crawler names, the log held 2,539 page fetches and Cloudflare counted 2,532 that it passed to the server.

That’s 0.3% apart, so the gaps below aren’t a counting error.

What the Server Log Never Saw

Cloudflare answered 2,794 of 7,526 genuine crawler page fetches from its cache. That’s 37% of them, and none reached the server log.

A cache hit is a request the CDN answers from a stored copy of the page. We checked one day of ChatGPT-User fetches line by line. All 17 that Cloudflare passed on matched a log line within three seconds, and none of the 9 cache hits did.

Crawler Cached Genuine page fetches Answered from cache
meta-externalagent 62% 1,583 983
ChatGPT-User 43% 361 156
Bingbot 32% 737 235
ClaudeBot 32% 138 44
PerplexityBot 31% 440 135
OAI-SearchBot 27% 281 75
Googlebot 23% 325 75
Amazonbot 22% 696 153
GPTBot 11% 121 13
All Cloudflare-verified crawlers 37% 7,526 2,794

ChatGPT-User is the fetcher OpenAI sends when a person’s chat reads a page. The log missed 43% of its fetches, and 62% of Meta’s.

PerplexityBot’s row uses Perplexity’s own address list, because Cloudflare doesn’t label that crawler.

The busiest pages lost the most

Genuine crawlers fetched the homepage 435 times, and 67% of those fetches came from cache. On eight of the ten most-fetched other pages, more than half did.

Search Console demand pointed the same way. Among the third of pages with the fewest impressions, 34% of fetches came from cache, and among the tenth with the most, 44% did.

A crawler fetch splits into answered from cache and passed to the server, and only the second is logged

What the Server Log Counted That Wasn’t Real

A log takes the user agent at its word, and a user agent can be copied. Cloudflare checks the sending address, so it can tell a crawler from a request using its name.

Name in the user agent Share genuine Requests Genuine
Bingbot 100% 3,073 3,073
meta-externalagent 98% 8,159 8,014
GPTBot 87% 1,700 1,485
OAI-SearchBot 83% 1,136 943
ClaudeBot 78% 1,165 914
PerplexityBot 75% 708 529
ChatGPT-User 62% 590 366
CCBot 44% 387 170
Bytespider 30% 3,813 1,128
Claude-User 17% 290 49
Googlebot 10% 13,225 1,263
Perplexity-User 0% 153 0

Bingbot was always what it said it was, and Meta’s crawler nearly always. One request in ten using Googlebot’s name was Google’s.

Two checks gave one answer

We tested Cloudflare’s label against the address lists that Google, Microsoft, OpenAI and Perplexity publish for their own crawlers. Of more than 13,000 requests using Googlebot’s name, the two checks disagreed on 2.

Cloudflare doesn’t label PerplexityBot, Perplexity-User or CCBot, so for those three we used the operator’s list alone.

The fake Googlebot hit four pages

The 11,962 impostor requests came from 3,259 addresses, at about 850 a day, around the clock. In the 30 days we could see, they didn’t miss a day.

Four pages took 98% of them. One page alone took 8,670 fetches in the 14 days, and Search Console shows it earned 80 impressions in 90 days and no clicks.

Cloudflare answered 93% of those requests from cache, so the server log saw 7% of them.

Three cards in a row: name claimed, address checked, sender verified

What It Did to Our Own Numbers

Three of our earlier studies read the server log alone, so we re-checked each one.

Our ChatGPT-User visits study counted 270 page fetches. Cloudflare shows 361 genuine ones. The log saw 205 of them, and about 60 of its 270 weren’t OpenAI’s.

We re-ran that study on the verified fetches. Its conclusion held: page demand still predicted visits and rank still didn’t. Its counts changed.

Our study of new page crawl times dated PerplexityBot’s first visit to a new post at a median of 63 hours. Its first fetch was a cache hit on six of eight posts, and the real median was about 10 hours.

Googlebot’s times didn’t move. Its first fetch of all eight posts was genuine and reached the server.

Our fake AI crawlers study judged secret-hunting requests by their behaviour. Cloudflare backs it. We matched 574 of those requests to its records, and they came from six addresses, none of them a verified crawler’s.

Nine Sites, the Same Impostors

We ran the same 14 days on nine sites we manage, 2.56 million requests in all. The borrowed names showed up on every one.

  • Googlebot: 36% genuine, of 35,355 requests using the name.
  • ChatGPT-User: 71% genuine, of 6,551.
  • GPTBot: 90% genuine, of 15,724.
  • ClaudeBot: 93% genuine, of 19,559.
  • Bingbot: 99.7% genuine, of 41,024.

By site, Googlebot’s genuine share ran from 10% to 99%.

The cache gap is different, because it depends on setup. Three of the nine sites store pages at the CDN, and there the cache answered 37% of genuine crawler page fetches. On five others the server log saw every fetch.

Cloudflare only stores pages when it’s set to, and a caching plugin may have set it for you. That’s why the first check below is a single response header.

What the Numbers Don’t Prove

Four limits, and the first two matter most.

  • Estimates, not counts: Cloudflare samples its analytics when traffic spikes.
  • One setup: the gap exists only where the CDN stores pages.
  • Labels have gaps: some crawlers can’t be verified by either check.
  • Fourteen days: cache purges and crawl bursts move the shares.

For the impostor Googlebot count, Cloudflare’s own 95% range is 11,896 to 12,028. Counts of genuine crawlers were rarely sampled at all.

We also purged the cache while editing pages in the window. Each purge sends the next fetch of every page back to the server, so a site that edits less would lose more.

An unverified request isn’t always a fake, because an operator can add addresses before a list catches up. Where two checks agreed, as with Googlebot, we’re confident.

How to Check Your Own Site

You need your CDN’s analytics and your server log for the same days.

  • Look at one page: check its cf-cache-status response header for HIT.
  • Count at the CDN: group requests by user agent and cache status.
  • Verify the name: use the verified-bot label or the operator’s address list.
  • Add both back: report genuine fetches, cache hits included.
  • Keep the log: it’s complete for what reaches your server.

To see which crawlers reach you at all, start with which AI bots reach your site.

Frequently Asked Questions

Does a CDN hide crawler visits from a server log

Yes, when it stores pages. A request the CDN answers from its cache never reaches the server, so the log has no line for it. On our site that was 37% of genuine crawler page fetches.

How do I know if my pages are cached at the CDN

You can check the response headers of any page. On Cloudflare, a cf-cache-status of HIT means the CDN answered from its stored copy.

What share of Googlebot requests are fake

On our site, nine in ten requests using Googlebot’s name weren’t Google’s. Across nine sites it was 64%, and it ran from 1% to 90% by site.

Can I trust the user agent in a server log

No. It’s text the sender chooses. Check the sending address against the operator’s published list, or use your CDN’s verified-bot label.

Is a server log still worth keeping

Yes. It’s complete for every request that reaches your server, and CDN analytics are sampled. You need both to count crawlers.

Count at the CDN, Then at the Server

Our server log told us less than it seemed to. It missed a third of genuine crawler fetches and took thousands of borrowed names at their word.

Pull the same 14 days from your CDN before your next crawler report.

Jordan Ellis
Written by

Jordan Ellis

Jordan Ellis is an AI search visibility specialist and content strategist with over 8 years of experience in B2B digital marketing. Focused on the intersection of content strategy and large language model optimization, Jordan writes about how brands can build lasting presence in AI-generated recommendations. Before specializing in AI visibility, Jordan led SEO and content programs for SaaS and FinTech companies across the US and Europe.

Leave a Reply

See where AI answers put your brand today.

Twenty minutes with a senior strategist: where the major engines point buyers in your category, who gets named instead of you, and a straight read on what a programme would change. No pitch deck.

Book a strategy call

A senior strategist replies within one business day.