Web performance is not just TTFB: a reply to “Showing off with a PageSpeed score of 100”

The founder of Iweblab claims that TTFB “says next to nothing” and that only green on CrUX matters. But his Edge network is slower than a site with no CDN, CrUX and lab data answer different questions, and performance doesn’t stop at the server.

Illustration: a server on the left and, on the right, the browser with the DOM tree, JavaScript and CSS; below, the LCP bar split into four phases, where TTFB is only the first, short segment

Dear Sean Giuseppe Semeraro, founder and sysadmin of Iweblab Srl, would you explain something to us? In the WordPress Italia Facebook group you published a post titled «A voler fare gli sboroni con il PageSpeed a 100» (roughly: “Showing off with a PageSpeed score of 100”), to tell everyone that nice TTFB numbers “say next to nothing” and that the only thing that matters is green on CrUX. Fine. Then explain to us why your site, which runs on your “Edge network”, the caching solution you sell to clients, answers in Europe with a TTFB 70% slower than ours, in Milan more than twice as slow, and 26% slower on the worldwide average?

A premise: our site, managedserver.it, uses no CDN at all, neither proprietary nor commercial.

Screenshot of Sean Giuseppe Semeraro’s post titled “A voler fare gli sboroni con il PageSpeed a 100” (Showing off with a PageSpeed score of 100) in the WordPress Italia Facebook group
The post published in the WordPress Italia group.

We’ll take up the provocation because, besides the numbers, that post contains a wrong idea that is widespread among sysadmins and developers: that a site’s performance is all decided on the server, and that looking at a single data source, CrUX, is enough to know whether a job was done well. We’ll get there. First, the numbers.

The numbers: same tool, same metric

The first report is the one the post itself attaches: SpeedVitals on iweblab.sm, 22 October. The second is managedserver.it, with the same tool, on 24 October.

TTFB (SpeedVitals)iweblab.sm, with “Edge network”managedserver.it, no CDN
Europe194 ms114 ms
Milan81 ms38 ms
Frankfurt86 ms71 ms
America620 ms534 ms
Worldwide average407 ms324 ms
Cache hit ratenot detected100%
GradeCB
Values read from the two reports below.
SpeedVitals report for iweblab.sm dated 22 October 2026: grade C, average TTFB 407 ms, Europe 194 ms with Milan 81 ms, America 620 ms with Northern Virginia 288 ms and São Paulo 1.3 seconds, cache hit rate not detected
iweblab.sm on SpeedVitals: average TTFB 407 ms, cache hit rate not detected (image attached to the post).
SpeedVitals multi-run report for managedserver.it dated 24 October 2026: grade B, average TTFB 324 ms, cache hit rate 100%, Europe 114 ms with Milan 38 ms, America 534 ms with Northern Virginia 322 ms
managedserver.it on SpeedVitals, no CDN: average TTFB 324 ms, cache hit rate 100%.

A site with no CDN that answers in Europe almost twice as fast as a site served by a network that, on your site, “keeps pages cached on its nodes and delivers them from nearby”. Something doesn’t add up. And it’s not the lab’s fault.

An “Edge network” that doesn’t deliver from nearby

Perhaps the reason is that your home-made CDN routes traffic with GeoDNS instead of anycast, and doesn’t work the way it should. You can see it in the Uptrends test: depending on the location, iweblab.sm resolves to different IP addresses. 95.110.225.107, an Aruba network, from Milan, Rome, Palermo and even Lille. 81.31.156.7, a network registered to Iweblab, from Frankfurt, Salzburg, Prague, Amsterdam, Leipzig and Eindhoven. 40.160.20.191, an OVH network in the United States, from Montreal and New York. With anycast the address would be the same everywhere and the network would pick the nearest node. Here DNS decides, with all the limits that implies.

Uptrends test on iweblab.sm: the resolved IP address changes with the location, 95.110.225.107 from Milan, Rome, Palermo and Lille, 81.31.156.7 from Frankfurt, Salzburg, Prague, Amsterdam, Leipzig and Eindhoven, 40.160.20.191 from Montreal and New York; ping between 0 and 23 ms
Uptrends on iweblab.sm: a different address depending on the location, ping between 0 and 23 ms.

There is an even more telling detail. The ping to those nodes is very low: 13 ms from Frankfurt, 18 from Prague, 21 from New York. Yet the TTFB measured from Frankfurt is 86 ms and from Northern Virginia 288 ms. If the network takes about twenty milliseconds to reach the node, the rest of the time isn’t lost in the cables: it’s lost in the node, or behind the node, when the page isn’t cached and has to be requested from the origin.

Confirmation comes from your own “Googlebot Map” dashboard (the «Mappa Googlebot» in the screenshot). 90% of Googlebot’s requests go through the Vint Hill POP, in Virginia, the same OVH data center that Montreal and New York point to. Cache hit rate: 58.7%. Average TTFB: 241 ms. In the post you attribute them “only to the ocean in between”. But between Googlebot, which arrives from the United States, and a POP in Virginia there is no ocean. It shows up when the POP doesn’t have the page and has to ask for it in Europe: judging by that dashboard, about four times out of ten. The ocean isn’t a geographic fatality: it’s the symptom. The cause is the cache.

Googlebot Map dashboard (Mappa Googlebot) dated 22 October 2026: 86.5 thousand events, hit rate 58.7%, average TTFB 241 ms, 90% of requests served by the Vint Hill POP in the United States
Hit rate 58.7% and average TTFB 241 ms for Googlebot, with 90% of requests on the POP in Virginia (image attached to the post).

And this isn’t a cosmetic detail: in the crawl budget documentation Google explains that if a site’s response times get longer, the crawl limit goes down and Googlebot crawls less. Googlebot is not a Chrome user: here CrUX saves nobody.

The tempura shrimp

Let’s be clear: we admire anyone who tries to do things, whatever they are. A couple of months ago we decided to make tempura shrimp. We bought the best ingredients, watched and read dozens of videos and guides, full dedication and passion. The result? Inedible. Or rather: fine for us to eat at home, but certainly not to serve in any restaurant, not even the lowliest All You Can Eat.

The problem isn’t trying. The problem is that, faced with numbers like these, you don’t say “OK, actually I’m not ready, there’s work to do, I’m withdrawing the public offer, I’ll keep my head down for a year and come back”. No: you publish a post on WordPress Italia that tries to play it down, distorting even what Google recommends. Let’s see how.

1. “Lighthouse/PageSpeed fails above 600 ms”

Correct. But you’re using a diagnostic threshold to justify performance that can be improved considerably.

Google, in the official PageSpeed Insights documentation, wrote it in black and white: “You should reduce server response time to below 200 ms”. That page belongs to version 4 of PageSpeed Insights, now deprecated, and we say so for fairness. But it shows that Google has always pointed to targets far more ambitious than 600 ms. The 100 ms that the post attributes to Google, on the other hand, appear neither there nor in the Lighthouse documentation.

Google page “Improve server response time” («Migliora tempo di risposta del server»), marked as deprecated, with the sentence “You should reduce server response time to below 200 ms” highlighted
Google’s guide on server response time: target under 200 ms.

Today Lighthouse flags the problem above 600 ms, while real-user data classifies a TTFB of up to 800 ms as good. But these are three different concepts: optimization recommendations, diagnostic thresholds and statistical classifications of real experience. Confusing them means missing the difference between getting a passing grade and building infrastructure that is truly fast. Especially when we’re talking about broadband connections, geographically close servers and WordPress pages served entirely from cache.

That Google doesn’t flag a problem under 600 ms doesn’t mean at all that a 500 ms TTFB is an excellent result. It only means it didn’t cross that specific diagnostic threshold. And the speed.host.it screenshot attached to the post is the proof by contrast: a single lab test, an empty INP, and the verdict “Core Web Vitals within the norm”.

speed.host.it report based on Lighthouse for iweblab.sm: performance 99, TTFB 4 ms with a scale of excellent up to 200 ms, slow up to 600 ms, critical beyond; FCP 1.4 s, LCP 1.7 s, CLS 0, INP empty; verdict “Core Web Vitals within the norm” («Core Web Vitals nella norma»)
“Core Web Vitals within the norm” («Core Web Vitals nella norma»), with the INP empty (image attached to the post).

2. “TTFB isn’t even a Core Web Vital”

It’s perhaps the most worrying claim. Not because it’s false, but because of what it implies.

TTFB is not one of the three official Core Web Vitals, which are LCP, INP and CLS. But it is a fundamental metric that comes before FCP and LCP: every millisecond lost before receiving the first byte is a millisecond less to finish rendering the page. Google itself explains it in its TTFB guide: TTFB precedes the other loading metrics, and the time that accumulates there carries over into all the following ones. Using the fact that it isn’t a Core Web Vital to downplay its importance means not having understood the relationship between the metrics.

The underlying problem is that the post uses statistical thresholds, designed to classify users’ experience, as if they were certifications of the technical quality of a job. They are two profoundly different things. A doctor doesn’t tell you you’re an athlete because your values fall within the normal ranges. In the same way, a sysadmin shouldn’t claim that an infrastructure is particularly fast just because PageSpeed Insights shows a green indicator. And above all, if you publicly sell performance optimization services, you should know this difference perfectly.

CrUX and LABS: two tools, two different questions

The post’s conclusion is that PageSpeed and Lighthouse are for “figuring out what to fix”, but that “the real grade” is CrUX: “100 is nice to show off. Green on CrUX is what counts”. It sounds balanced. In reality it ranks the two data sources, as if one were the grade and the other a hobby for techies. It isn’t so: CrUX and lab data don’t measure the same thing and don’t serve the same purpose. We explain it at length in Why you need both CrUX and LABS; here is the essential.

CrUX answers the question “what happened?”. It collects the real experiences of eligible Chrome users and evaluates the 75th percentile: a metric is good if at least three visits out of four fall within the threshold. But it covers a rolling 28-day window, so it reacts to changes with weeks of delay; it doesn’t include Chrome on iPhone or other browsers; and for many pages, or for low-traffic sites, the data simply isn’t there. Above all, it describes the audience you have today. If nine visitors out of ten browse on fiber with recent smartphones, a page can get excellent values even if, in absolute terms, it’s anything but light.

Lab data answers the question “what could happen, and why?”. It loads the page with a simulated device, network and processor, in controlled and repeatable conditions, and breaks it down: render-blocking resources, excessive JavaScript, long tasks on the main thread, oversized images, request chains that delay the LCP element. And it’s the only one that lets you compare before and after a change in a few minutes, instead of waiting a month. Saying that lab data doesn’t count because it’s synthetic is like saying a crash test is useless because it doesn’t reproduce every possible accident.

Putting the two together shows what neither shows alone: the headroom. Two sites with the same 2-second LCP in real-user data can be one well built and the other fast only because its audience has recent phones and very fast networks. For CrUX they are identical. As soon as a campaign, a spike in mobile traffic or a new market arrives, the first stays within the thresholds, the second doesn’t. A green CrUX with weak lab data isn’t a promotion: it’s a site with little headroom.

It works the other way around too, and this is where the post stumbles. It claims that INP is empty because “no lab test can measure it”. Google’s INP documentation says that INP can be measured in some lab tools, with a value that depends on the interactions performed during the measurement. In Lighthouse it’s empty because, in navigation mode, it loads the page and clicks nothing; that’s why Google points to Total Blocking Time as the lab reference. And in your own PageSpeed Insights screenshot, among the audits, there is the entry “INP breakdown” («Suddivisione INP»).

PageSpeed Insights passed audits: the server responds quickly with 21 ms detected; among the audits there is also INP breakdown (Suddivisione INP)
Server at 21 ms and, further down, the “INP breakdown” audit («Suddivisione INP») (image attached to the post).

CrUX tells you there’s a problem. The lab tells you which one, and immediately verifies whether the fix works. Asking which of the two is “the real grade” is the wrong question: replacing the cult of 100 on PageSpeed with the cult of green on CrUX means changing idol, not method.

A sysadmin lecturing on web performance

And now to the point that, in our view, explains everything else. In the whole post there isn’t a word about JavaScript, CSS, the DOM, images or fonts. It talks about TTFB, thresholds and POPs. It’s the natural perimeter of a sysadmin: Brotli and zstd compression, HTTP/2 and HTTP/3, TLS, caching, server response times. Important things, which we do every day too. But they are a part of performance, not performance.

Core Web Vitals are largely decided in the browser. TTFB is only the first of the four phases into which Google breaks down LCP; after it come the load delay and load duration of the main resource and the render delay, which depend on how the HTML, CSS and images are built. INP depends on the JavaScript occupying the main thread when the user taps the screen. CLS depends on layout, fonts and content inserted late. A 4 ms TTFB doesn’t shorten by a millisecond the execution of 700 KB of JavaScript, doesn’t shrink a DOM of ten thousand nodes and doesn’t stop a banner from shifting the page.

That’s why talking about web performance purely from the sysadmin’s point of view, stopping at zstd, Brotli and TTFB and leaving out all the application-level optimization of DOM, JavaScript and CSS, is limiting. And when it’s done to teach others which data really counts, it’s a clear overstepping of competence. A site’s speed comes from the whole: a fast server is the starting point, an efficient application finishes the job. Anyone who knows only half the chain inevitably ends up saying the other half doesn’t matter.

A difficult subject, even for those who sell it

This affair proves one thing only: web performance is a difficult subject even for insiders, sysadmins and developers included. Diagnostic thresholds mistaken for targets, statistics mistaken for certifications, an ocean blamed where there are cache misses, the lab dismissed as a hobby and the application forgotten altogether. Anyone who has to choose who to trust with their site should demand data from multiple locations, thresholds quoted from the source, an intervention that goes from the server to the browser and an honest before-and-after comparison. That’s what we do. No shortcuts, and no cheating.

Sources: Google, Improve server response time (PageSpeed Insights v4, deprecated); web.dev, Time to First Byte (TTFB); Chrome for Developers, Lighthouse: server response time; web.dev, Optimize Largest Contentful Paint; web.dev, Interaction to Next Paint (INP); Google Search Central, Managing your crawl budget; iWebLab, iWebLab Cache. IP address ownership verified via whois. The iweblab.sm images are the screenshots attached to the original post and to the public tests cited, reproduced for the purpose of commentary.

THE NEXT STEP

Let’s start
with your site.

Tell us about the project, the problems you are seeing and your goals. Together we will define tailored work.

Request an analysis

Takes you to the form on the Contact page.

MANAGED SERVER S.R.L.info@corewebvitals.eu +39 02 5656 9681

Monday – Friday · 9:30 am – 7:30 pm (CET)

Prefer an online form?
Contact us on managedserver.it ↗