WriteMySEO / Blog / Why Crawl Stats and Your Server Logs Never Match
SEO data

Why Crawl Stats and Your Server Logs Never Match

Search Console's Crawl Stats report and your origin access logs count different events. Here's where each one is blind, and how to reconcile the two.

Most people open the Crawl Stats report expecting a sampled, slightly lossy version of their server logs. It isn't. It's a different dataset, produced by a different system, measuring a different set of events. When the two disagree — and they always do — the gap is usually information, not error.

The practical consequence: if you diff total requests and the numbers are off by 30%, that does not mean one source is broken. It usually means you have a CDN, or unverified bot traffic in your logs, or both. Knowing which direction the skew runs tells you what's actually happening at your edge.

What is Crawl Stats actually counting?

Crawl Stats is Google's own outbound request log, aggregated and filtered down to your hosts. It records the request from the client side, which means it includes events that never produced a line in your access log:

Google also classifies each request by purpose — discovery (first fetch of a new URL) and refresh (recrawl of a known URL) — and by response code and file type. The purpose split is the single most valuable field in the report, because you cannot derive it from logs. Nothing in an HTTP request tells you whether Google thought this URL was new.

The report is limited to roughly the last 90 days, and it's reported at host level. A URL-prefix property for example.com/blog/ shows crawl data for the whole host, not just that directory. You cannot scope Crawl Stats to a path.

What are your origin logs actually counting?

Whatever reached the process doing the logging. That's a narrower set than you think:

Which direction does the gap run?

EventCrawl StatsOrigin access log
CDN cache hitCountedMissing
DNS / connection failureCounted (as failed)Missing
robots.txt fetchCountedPresent (if it reaches origin)
Each redirect hopCounted separatelyPresent
URL Inspection live testCountedPresent
Spoofed Googlebot UANot countedCounted unless verified
Requests to other hosts on the domainCounted (domain property)Depends on which hosts you log

So: a site behind a CDN with unverified logs has two errors pointing in opposite directions, which occasionally cancel out and make you think everything matches. Verify Googlebot first, then compare.

Why is Crawl Stats' average response time higher than yours?

Because it's measured from Google's side of the network. Google's figure reflects the time to retrieve the page content including DNS, connection setup, and transit; your origin's request_time typically starts when the request arrives and stops when the last byte is handed to the socket. The Google number will essentially always be larger, and the delta is your network path plus any edge processing.

That makes Crawl Stats the right source for the question "is Google experiencing my site as slow?" and the wrong source for "is my application slow?" If Crawl Stats response time climbs while origin timings are flat, look at TLS termination, edge config, or a geographic routing change — not your database.

The host status section works the same way. It tracks three independent checks: robots.txt fetch, DNS resolution, and server connectivity. Failures in the first two produce zero origin log lines by definition. If host status shows problems and your logs look clean, that's consistent, not contradictory.

How do you reconcile them properly?

  1. Verify before you count. Filter log lines to requests whose IP reverse-resolves into Google's crawler domains, or that match Google's published crawler IP ranges. Everything downstream depends on this.
  2. Add edge logs. Pull CDN logs and union them with origin logs. Without this step, cached hits are permanently missing and no reconciliation is possible.
  3. Align time zones. Search Console buckets days in Pacific Time. UTC log days are offset by seven or eight hours, which produces spurious day-over-day wobble on any chart you overlay.
  4. Strip Google's non-crawl fetchers from the log side — or keep them and compare against the matching Googlebot-type filter in Crawl Stats. Don't mix.
  5. Compare shapes, not totals. Response-code mix, file-type mix, and week-over-week trend lines should agree closely once steps 1–4 are done. Absolute request counts rarely will, and chasing the last 5% is not a good use of a day.

Use each dataset for what it can answer

Use Crawl Stats for host-level health (robots.txt availability, DNS, connectivity), for Google-side latency, for the discovery-versus-refresh split, and for confirming that a crawl-rate change is global rather than an artifact of your logging.

Use verified logs for anything URL-level: which templates consume crawl budget, which parameter combinations are being fetched, whether your new section is getting hit at all, how deep Googlebot goes into pagination. Crawl Stats shows only example URLs per bucket; logs show all of them.

When the two disagree, work the list above in order. The reconciliation almost always terminates at a CDN cache layer nobody added to the log pipeline.

crawl statslog filesSearch Consolecrawling

WriteMySEO produces marketing content, not legal, medical, financial, or compliance advice. Figures cited reflect publicly reported industry data at time of writing and shift over time.

Get started

We write this well about your industry, every month.

AI-drafted, human-reviewed SEO content on a flat subscription. Blog posts, metadata, schema, and internal links, shipped on a monthly rhythm.

See plans

More from the blog