Your CDN can serve Googlebot a different page than your visitors
A site looks perfect in a browser and is broken for crawlers when something between the origin and the crawler changes the response. The mechanisms, and how to check for a split between what Googlebot gets and what a visitor gets.
A page can look perfect in your browser and be broken for Google. The origin serves the right HTML, and something between the origin and the crawler changes the response. This post lists the mechanisms that cause it, then shows you the check that finds it.
The short version. Bot management can challenge or block datacenter IPs. Geo routing can serve a different variant to the crawler’s location. Edge rules can inject or strip headers on some paths only. A cache can serve an old version to one audience and a current version to another. The failure is invisible from your laptop and invisible from your origin logs. The only way to see it is to request the URL the way the crawler does, from outside your network.
Bot management and WAF rules
A WAF or bot management product decides how good a request looks. A residential browser arrives from a residential IP with a full browser fingerprint. A crawler arrives from a datacenter IP with a minimal user agent. The rule can challenge the datacenter IP, return a 403, or send a challenge page that asks for a JavaScript proof.
The visitor gets the page. The crawler gets the challenge. To the crawler, the response is a failure, and the page is not indexed. The rule was designed to stop scrapers, and it stops the crawler the same way.
Geo and country routing
Routing rules pick a variant of the site by location. The author tests from one country and sees the home variant. Googlebot fetches from a datacenter in another country, or from several countries, and gets a different variant: a country redirect, a local splash page, or a block for regions the site does not serve.
The crawler is not exempt from routing. If the rule routes by IP location, the crawler is routed by its location. The page Google indexes is the variant Googlebot was served, wherever that fetch happened.
Edge rules and workers that rewrite headers
A CDN edge rule or worker can add, strip, or replace headers on matching requests. A rule that adds an X-Robots-Tag noindex to one path pattern, or strips a header on another, changes the response the crawler sees without touching the origin.
The header is the dangerous one to get wrong, because a noindex header applies to the response it rides on. A page can carry no meta robots in its HTML and still be blocked, with the instruction visible only in the headers.
Cache variance and Vary mistakes
A cache serves a stored entry until it decides the entry is stale or the key is wrong. A mis-keyed cache can serve one audience a version that no longer exists, while the other audience gets the current version. The two audiences see different pages for the same URL.
The Vary header is the mechanism that keeps this from happening. Vary tells the cache which request properties produce different responses, such as Accept-Encoding or User-Agent. When Vary is wrong or missing, the cache can serve the wrong variant to the wrong audience.
Origin-vs-edge divergence
The origin can be serving the correct page while the edge is serving something else. The origin has no way to know, because the edge answered the request. The failure is invisible from the server logs. The only signal is the difference between what the browser receives and what the crawler receives.
Server-side render fallbacks
A page that renders on the server for a normal client can fall back to an empty shell or an error page for a client that does not run JavaScript. The crawler is that client. The fallback serves a page with no content and no title, and the page is indexed as empty, while the browser sees the full page.
How to check: the crawler’s user agent, from outside your network
Request the URL with the crawler’s user agent and from outside your own network, then compare the response with a browser request. Both parts matter.
The user agent matters because rules key on it: bot management, edge rules, and rendering fallbacks all branch on who is asking.
The network matters because rules key on IP reputation and location. Your laptop has residential IP reputation and your own cache locality. The crawler has a datacenter IP and a different cache entry. A request from your laptop proves only what your laptop receives, not what the crawler receives.
Checking from your own laptop is not enough because the failure is invisible from inside the network. The rule that blocks a datacenter IP will not fire for you. The cache entry your region receives may be the correct one while the crawler’s region receives a stale one. You have to stand where the crawler stands.
What to compare
Compare the status code, the X-Robots-Tag header, the meta robots tag, the canonical, the title, and the body.
Status code: a 200 for the browser and a 403 for the crawler is a split. X-Robots-Tag: a header injected for one path only. Meta robots: a tag the edge adds or strips. Canonical and title: are they the same in both responses, or does the crawler get a different canonical or an empty title. Body: is the crawler’s response a challenge page, an error page, or an empty shell.
One request with the crawler’s user agent from a datacenter, and one from a browser, and the two responses compared field by field, is the whole check.
This is not cloaking, and the damage does not depend on that
Cloaking has a specific meaning, and Google’s spam policies define it with intent built in: “presenting different content to users and search engines with the intent to manipulate search rankings and mislead users.” A WAF rule that challenges datacenter traffic was not written to deceive anyone. By Google’s own definition it is not cloaking, and you are not at risk of a spam penalty for a misconfigured edge rule.
That is worth saying plainly, because the fear of a penalty sends people looking for the wrong problem. The real damage has nothing to do with policy and needs no adjudication to hurt you.
If Googlebot receives a challenge page, that is the page available for indexing. If it receives a 403, the URL cannot be crawled and the existing entry goes stale. If the edge adds an X-Robots-Tag on one path, the pages on that path drop out. None of that requires anyone at Google to make a judgement about you. The response is not to plead intent, it is to find the rule that creates the split and remove it.
Where intent does start to matter is if you leave it in place deliberately once you know: serving crawlers a version you would not serve a person, on purpose, is the thing the policy is about. Fixing it is straightforward, so it rarely gets that far.
A URL that looks fine to you and different to a crawler is exactly what the crawler diff checker measures: it fetches a URL as Googlebot, Bingbot, GPTBot and a browser from our own egress IP and reports where the responses differ, at /tools/crawler-diff-checker.
Where these facts come from
Google’s cloaking definition is quoted from its spam policies, which state the intent condition explicitly. Everything else here is mechanism rather than policy: it describes how caches, edge rules and bot management behave, which you can confirm against your own CDN’s documentation and your own edge logs.
Questions
- How can Googlebot see a different page than my visitors?
- Something between your origin and the crawler changes the response. A bot management or WAF rule can challenge or block the crawler's datacenter IP, geo routing can serve a different variant to the crawler's location, an edge rule can inject or strip headers, and a mis-keyed cache can serve an old version to one audience. The origin is correct; the edge is not.
- Why is checking from my own laptop not enough?
- Your laptop has residential IP reputation and its own cache locality, so it is not treated the way a crawler is. The rules that break a crawler usually target datacenter IPs or specific locations. You must request the URL with the crawler's user agent and from outside your own network to see what the crawler sees.
- What should I compare between a browser request and a crawler request?
- The HTTP status code, the X-Robots-Tag header, the meta robots tag, the canonical, the title, and whether the body is a challenge page, an error page, or an empty shell. Those are the fields that decide what gets indexed and what does not.
- Is serving a crawler a different page the same as cloaking?
- No. Google's spam policies define cloaking as presenting different content to users and search engines "with the intent to manipulate search rankings and mislead users". A CDN or WAF misconfiguration has no such intent, so it is not cloaking and it does not put you at risk of a spam penalty. The harm is separate and more direct: whatever the crawler received is what is available to index, so a challenge page or a 403 costs you the page regardless of why it happened.
- What causes a cache to serve different versions of the same page?
- A cache key that does not include the headers that should vary it, or a Vary header that is wrong or missing. When two audiences get different versions of the same URL and the cache does not separate them, one audience can be served a stale or wrong entry. Vary is the header that tells the cache which request properties change the response.
- Why is a server-side render fallback invisible from the origin?
- The origin can be serving the correct full HTML while the edge serves a fallback, because the fallback is generated for a client that does not run JavaScript. Logs at the origin do not show it, because the edge answered the request. The divergence is only visible when you compare the two responses directly.