Are third-party resources reachable from inside China?
It depends on where inside China you measure from, and the difference can be total. Measured fact: from a datacenter probe in mainland China (Alibaba Cloudcn-zhangjiakou), sampled every ten minutes for twelve hours on 2026-08-28 — 720 measurements — fonts.googleapis.com and www.googletagmanager.com both answered 100% of the time in about 110ms, and we recommended leaving them on a direct connection. On 2026-08-30 a volunteer ran the same code on a Beijing China Mobile residential line across 88 sites and 264 page loads: www.googletagmanager.com was requested 112 times and never answered once; fonts.googleapis.com was requested 54 times and never answered once. This was not a timeout artifact — in page loads that finished successfully, the tag manager still failed 14 out of 14 times. Across that run 102 hosts never returned a response and 101 of them were third parties, while every one of the 57 sites that failed to finish loading did return a first byte. The site is usually not what is broken; what it pulls in is. Deciding the route per resource is only meaningful on measurements taken from where your visitors actually are — and serving from inside the mainland to avoid the crossing is what brings the ICP filing requirement with it. Most published figures about third-party resources in China are single samples. We have argued before that a single sample is not a measurement — cross-border behaviour there varies by more than two orders of magnitude across a day, and a number taken at 2pm tells you very little about 9pm.
So we ran it properly: five third-party resource categories, sampled every ten minutes, from a probe inside mainland China, each one requested twice — once directly, once through our own delivery network. 720 measurements over twelve hours, covering the evening peak that operators plan around.
Then we did the thing that mattered more, and it cost us a recommendation.
Update, 30 August 2026. The twelve-hour study below was run from a commercial cloud line inside China — which is how almost every published China measurement is taken, including ours. We said at the time that we would repeat it from a consumer connection and publish the result even if it was unflattering. We have now done that, and the problem is bigger than a wrong recommendation: for one whole category of hosts, a mainland cloud probe and a mainland consumer line do not report the same country. Hosts that answered 100% of the time from the cloud answered 0% of the time from a Beijing home line. The original data stands — it faithfully describes that vantage. What it does not describe is a visitor. See what changed when we moved the probe.
What was measured
| Resource | Category | Why it is on the list |
|---|---|---|
fonts.googleapis.com | Web font stylesheet | On a large share of enterprise pages |
fonts.gstatic.com | Web font file | The actual font bytes |
cdn.jsdelivr.net | Public JS CDN | Common script host |
www.googletagmanager.com | Tag manager | Analytics and marketing tags |
www.google.com/recaptcha | Form verification | Gates whether a form can be submitted |
The list is not arbitrary. It comes from measuring real vendor websites from inside China and recording which third-party hosts actually stopped responding — these five categories are what showed up.
Method: probe inside mainland China (Alibaba Cloud cn-zhangjiakou); each resource requested directly and through our network in the same round; throughput calculated over the body transfer only, excluding time-to-first-byte, so that small files are not dominated by connection setup; 30-second timeout; timeouts counted as results rather than discarded. 72 samples per cell, 28 August 2026. Times below are China local time.
Results across twelve hours
| Resource | Route | Success | TTFB median | TTFB p95 | Throughput median |
|---|---|---|---|---|---|
| Font stylesheet | direct | 100% | 111ms | 137ms | 2.4 MB/s |
| our network | 100% | 278ms | 303ms | 5.0 MB/s | |
| Font file | direct | 100% | 102ms | 121ms | 4.9 MB/s |
| our network | 100% | 195ms | 208ms | 0.8 MB/s | |
| Public JS CDN | direct | 100% | 660ms | 1,757ms | 4.0 MB/s |
| our network | 100% | 103ms | 114ms | 16.1 MB/s | |
| Tag manager | direct | 100% | 118ms | 143ms | 13.5 MB/s |
| our network | 100% | 312ms | 327ms | 4.1 MB/s | |
| Form verification | direct | 0% | — | — | — |
| our network | 100% | 169ms | 263ms | 1.5 MB/s |
72 samples per cell.
What we concluded, and what we got wrong
On this data we wrote that Google Fonts and the tag manager should be left exactly where they are. Both were reachable in 100% of attempts, both answered in roughly 110 milliseconds direct against roughly 300 through an additional hop, and we argued — correctly, on those numbers — that routing an already-healthy host somewhere else is a latency tax you pay on every request for no benefit.
The reasoning was sound. The vantage was not. We had written, in the same article, that “is this host healthy from Shanghai at 9pm” is not a question you can answer from anywhere else — and then answered it from a datacenter.
Anyone who has actually operated a website in China will already be raising an eyebrow at that table, because Google-owned hosts are not generally usable from a Chinese consumer connection, and no one who works there needs a measurement to tell them so. That is precisely what makes the result worth publishing. We did not discover that those hosts fail for visitors. We discovered that our probe said otherwise, at 111 milliseconds, seventy-two times out of seventy-two.
A mainland cloud instance is not a neutral observation post. It is a commercial network with its own arrangements, and for at least one category of hosts those arrangements clearly do not extend to the person loading your page from home.
Anyone who builds software in China already knows the shape of this, because it is the daily experience of the toolchain. Upstream sources that the rest of the world takes for granted are not usable from the mainland, so the domestic clouds run their own substitutes: container registries, package registries, language runtimes. We rely on this ourselves — the measurement package the volunteer ran downloads its browser and its runtime from a domestic mirror, because the upstream sources are not reachable from where they were running it. An environment that quietly substitutes a working path for a broken one is a very convenient place to build. It is a very poor place to measure from.
We are not going to speculate about the specific mechanism for these particular hosts — we have not measured it, and an explanation we cannot support is worth less than the observation we can. The finding stands on the discrepancy itself, and the discrepancy is total: 72 out of 72 from the cloud, 0 out of 112 from a home line.
The generalisation is the useful part. If your China measurements come from a mainland cloud instance — and almost all published China measurements do — you cannot assume they describe what a visitor sees. That includes ours, until we check them the way we checked these.
What changed when we moved the probe
On 30 August 2026 a volunteer in Beijing ran our measurement stack on a China Mobile residential broadband line, using the same code, the same 60-second ceiling and the same three-runs-per-site design as our datacenter probe. That run loaded 88 real websites — 264 page loads — and recorded, per request, every host that never returned a response.
Here is what those same five hosts did:
| Host | Datacenter line (12h, 72 samples each) | Beijing home line (2026-08-30) |
|---|---|---|
www.googletagmanager.com | 100% success, 118ms | 112 requests, 112 never answered |
fonts.googleapis.com | 100% success, 111ms | 54 requests, 54 never answered |
fonts.gstatic.com | 100% success, 102ms | 6 requests, 6 never answered |
www.google.com (reCAPTCHA host) | 0% success | 18 requests, 18 never answered |
cdn.jsdelivr.net | 100% success, 660ms median | 36 requests, 0 failures |
The two hosts we told you to leave alone are the two that never answered once. Not slower. Not intermittent. Zero responses out of 112 and 54 respectively.
This is not an artifact of the timeout
The obvious objection is that these requests were still in flight when a 60-second page load was abandoned, and would have completed given longer. They would not have. The check is to look only at page loads that finished successfully and ask what those same hosts did inside them:
| Host | Appearances in page loads that completed | Never answered |
|---|---|---|
www.googletagmanager.com | 14 | 14 |
geolocation.onetrust.com | 12 | 12 |
www.google.com | 4 | 4 |
The page finished. The host still never answered. These are not requests that ran out of time; they are requests that were never going to be answered on that connection.
The hosts nobody warns you about
Across those 264 page loads, 102 distinct hosts never returned a response at all, and 101 of them — 99% — were third parties, not the site being requested. Only 13 of the 102 were Google-owned. Set those aside as already understood, and 89 hosts remain. This is the part that is not common knowledge, and it is the part worth acting on:
| Host | What it does | Requested | Never answered |
|---|---|---|---|
geolocation.onetrust.com | Consent banner geolocation | 50 | 50 |
c.go-mpulse.net | Real-user monitoring | 12 | 12 |
use.typekit.net | Web font delivery | 11 | 11 |
cdn.optimizely.com | Experimentation | 9 | 9 |
px.ads.linkedin.com | Advertising pixel | 9 | 9 |
d3e54v103j8qbb.cloudfront.net | Site-builder asset CDN | 9 | 9 |
static.hotjar.com | Session analytics | 6 | 6 |
epsilon.6sense.com | Account intelligence | 6 | 6 |
The consent-banner host is the one to look at twice. A consent script usually runs before anything else on the page and frequently blocks rendering until it resolves; a geolocation lookup that never returns is therefore not a missing cookie banner, it is a page that does not start.
The intermittent hosts are more interesting than the dead ones, because intermittent is the case nobody plans for:
| Host | Requested | Failed | Failure rate |
|---|---|---|---|
fast.wistia.com | 15 | 6 | 40% |
widget.trustpilot.com | 9 | 3 | 33% |
cdn.weglot.com | 9 | 3 | 33% |
challenges.cloudflare.com | 12 | 3 | 25% |
uhf.microsoft.com | 12 | 3 | 25% |
play.vidyard.com | 15 | 3 | 20% |
rum.hlx.page | 18 | 3 | 17% |
A host that fails one time in four cannot be diagnosed by loading the page once, which is how almost everyone checks. It also cannot be fixed by a rule of thumb, because the rule would have to be right about a host that is right most of the time.
Three quarters of all these failures were of one specific kind: the request was sent, nothing came back, and no error was ever raised. Not a refusal, not a reset — silence. Nothing in the page reports a problem, because from the browser’s point of view nothing has gone wrong yet.
And the sites themselves were mostly fine: of the 57 sites that failed to finish loading, every single one returned a first byte, and two thirds painted something on screen before stalling. Not one was unreachable. What breaks a page in China is usually not the page.
The result that decides whether a form works
www.google.com/recaptcha did not respond once. Zero successful requests out of 72 on the datacenter line, across every hour sampled, from mid-afternoon through the evening peak and past midnight. Through our network, 72 out of 72. On the Beijing home line the same host failed in all 18 requests that reached it.
This is not a latency finding, and it is not a gradient. Form verification is the gate on submission: if the widget never loads, the submit button never becomes active. A page in that state is not slow. It is a form that cannot receive a single lead, and nothing in the page reports an error, because the request is issued and simply never answered.
If your China site has a gated contact form and you have never measured this specific thing, it is the first thing worth checking.
The result that only shows up over time
The public JS CDN was reachable in 100% of attempts by both routes on the datacenter line, and failed in none of its 36 requests on the home line. Reachability told us nothing useful. The distribution did:
| China local time | Direct TTFB (median) | Our network | Ratio |
|---|---|---|---|
| 16:00 | 477ms | 103ms | 4.6× |
| 17:00 | 932ms | 99ms | 9.4× |
| 19:00 | 987ms | 104ms | 9.5× |
| 21:00 | 1,076ms | 102ms | 10.5× |
| 23:00 | 548ms | 103ms | 5.3× |
| 01:00 | 728ms | 110ms | 6.6× |
Direct time-to-first-byte more than doubled between the quietest hour sampled and the 21:00 peak. Across the same twelve hours the delivered route stayed between 99 and 110 milliseconds — a spread of eleven milliseconds.
The single number that captures it is the ratio of the 95th percentile to the median:
| Resource | Direct | Our network |
|---|---|---|
| Public JS CDN | 2.7× | 1.1× |
| Font file | 1.2× | 1.1× |
| Tag manager | 1.2× | 1.0× |
A p95 of 1,757ms against a median of 660ms means one request in twenty takes nearly two seconds — and on a page with a dozen such requests, one of them landing in that tail is enough to hold up rendering. This is why an average is the wrong summary statistic for China, and why a figure sampled once is worth very little.
What this adds up to
Four failure modes, and only one of them is what people usually mean by “slow in China”:
- Some hosts are genuinely fine — but you have to say from where. The public JS CDN held up on both vantages. That is a claim we can now make with two data points instead of one, and it is the only host on this list that earned it.
- Some hosts are reachable but unstable. The median looks tolerable; the tail is where the page actually breaks. You cannot see this without sampling across the day.
- Some hosts never answer at all. No error, no timeout event, no signal — and if that host is your form verification, the business consequence is total rather than degraded.
- Some hosts answer perfectly from one place inside China and never from another. This is the one we did not have before, and it is the one that overturned our own recommendation. A datacenter line and a consumer line in the same country are not the same network.
The practical consequence is narrower and more useful than “route everything” or “route nothing”. The route has to be decided per resource, on measurements taken from where your visitors actually are — and a host that passes from a cloud line has not been shown to pass from a home line. Leaving an already-fast host untouched is still the correct action when it is genuinely fast for your visitors. What changed is our confidence about which hosts those are, and how much evidence it takes to say so.
Why this is not only a delivery question
Everything above is about which requests complete, and that is a delivery problem. But the fix people reach for — serve from inside mainland China, so the request never has to cross a border at all — is not purely a technical decision. Serving to Chinese users from mainland infrastructure is what brings the ICP filing requirement into play: the filing is issued to a mainland legal entity and binds to your hosting arrangement, and an unfiled site cannot be lawfully carried by a mainland access provider.
So the same architecture decision answers two questions at once, and it is worth answering them together rather than discovering the second one late: which of your requests complete for a real visitor, and are you permitted to serve them from the place where they would complete.
Limits
- The consumer measurement is one volunteer, one ISP, one night. A China Mobile residential line in Beijing, run overnight on 30 August 2026. A second ISP and a second city would make it a finding rather than a data point. The per-host results are 100% and 0% rather than gradients, with 112 and 54 requests behind the two largest, which is why we are willing to publish it at this sample size — but a single vantage is a single vantage.
- The twelve-hour study is a datacenter line. International transit from a commercial cloud is materially better than from a consumer connection, so every direct-route figure in the first half of this article is optimistic. The second half is what that optimism costs.
- Different browser builds. The datacenter probe runs Debian’s Chromium 151.0.7922.173; the volunteer ran Chrome for Testing 151.0.7922.77. Completion and time-to-first-byte are insensitive to that difference; paint timings should be read as directional only.
- Five resources, 88 sites. Chosen because they are common and because they showed up in earlier failure data, not because they are exhaustive.
- Throughput excludes TTFB, which is the fair way to compare small files but means the throughput column and the TTFB column should be read separately.
- The twelve-hour test pushed every resource down both routes, which is what a comparison requires and is not how a site is delivered. The delivered route there is also a simplified configuration built for measurability, not the production arrangement.
What we are measuring next
A second consumer vantage on a different mainland ISP, which is the single thing that would move the Beijing result from a data point to a finding. We are also extending the consumer run past the 88 sites reported here.
We would rather publish a recommendation being overturned than leave it standing because it was ours. If you are making an architecture decision on the strength of the first half of this article, the second half is the part that should change your mind.
The method behind these numbers, including the eight ways we got it wrong first. The wider picture is in our 280-site census measured from inside China. And if you want to see which third-party hosts your own site depends on, our China firewall test reports them per resource from inside the mainland.
Frequently Asked Questions
Are third-party resources reachable from inside China?
cn-zhangjiakou, 720 measurements over twelve hours, 2026-08-28), fonts.googleapis.com, www.googletagmanager.com, fonts.gstatic.com and cdn.jsdelivr.net were all reachable 100% of the time, and only www.google.com/recaptcha failed. From a Beijing China Mobile residential line (88 sites, 264 page loads, 2026-08-30) the first three never answered a single request — 112, 54 and 6 attempts respectively — while cdn.jsdelivr.net failed none of its 36. A cloud line and a consumer line in the same country are not the same network, and a host that passes on one has not been shown to pass on the other.