← All resources

How to get a 100 PageSpeed score, and what it actually means.

A 100 is a lab score you can chase to a literal maximum — it does not by itself mean real visitors are having a fast experience. Here is exactly what the number is built from, what moves each part of it, and what to check once you have it.

A 100 in PageSpeed Insights is one of the few numbers in web development you can chase to an actual, literal maximum, which is exactly why teams chase it — it is a score, not a feeling. It is also, on its own, a lab score: one simulated page load, on a fixed device and network profile, run once. Getting it is a genuinely useful discipline that forces real fixes. Treating it as the finish line is the mistake almost everyone who chases it makes. Here is what the number is actually built from, what moves each part of it, and what is still worth checking once the lab score says 100.

The five metrics behind the number

MetricWeightWhat it measuresThe fix that moves it most
Total Blocking Time (TBT)30%How long the main thread is too busy to respond to inputDefer or split up render-blocking JavaScript
Largest Contentful Paint (LCP)25%How long the biggest visible element takes to renderCompress and preload the hero image or heading font
Cumulative Layout Shift (CLS)25%How much visible content jumps as the page loadsReserve space for images, embeds and ads before they load
First Contentful Paint (FCP)10%How long until anything renders at allCut render-blocking CSS above the fold
Speed Index (SI)10%How quickly the page visually fills in, frame by frameThe same fixes as LCP — it rewards the same behaviour twice

TBT and LCP together are 55% of the score. Teams that fix hero images first and JavaScript second, because images feel like the obvious culprit, often see a smaller jump than they expected — the bigger number was waiting behind the script tag.

What the score is actually made of

The 0–100 score is a weighted average of five metrics, each scored on its own curve and then combined: Total Blocking Time at 30%, Largest Contentful Paint at 25%, Cumulative Layout Shift at 25%, First Contentful Paint at 10% and Speed Index at 10%. TBT alone carries three times the weight of FCP, which is why two sites with an identical "feels fast" first impression can land 20 points apart — one has a script blocking the main thread for two seconds after that first paint, and the score punishes exactly that.

Each metric is not scored linearly. Chrome’s own documentation places the curve on a log-normal distribution built from real HTTP Archive data, with two fixed points: the 25th percentile of real sites scores 50, and the 8th percentile scores 90. Between roughly 50 and 92 the relationship is close to linear — shaving time off a slow metric buys a predictable number of points. Above 96 it is not: the same time saved buys a fraction of a point, which is the mathematical reason the last few points of a 100 take disproportionately more work than the first sixty.

Why the main thread does the most damage

TBT measures every stretch of time the main thread is blocked for more than 50 milliseconds between First Contentful Paint and the page becoming interactive, added together. It is rarely one slow thing — it is usually a dozen small ones: a bundle that parses and executes before anything else can run, a chat widget or analytics tag that loads eagerly, a carousel library doing DOM work nobody has scrolled far enough to see yet. Each one alone looks harmless in a code review. Stacked, they are what a visitor experiences as a page that looks ready and does not respond when tapped.

The fix is rarely "write faster code" — it is mostly sequencing. Defer anything not needed for the first paint, split large bundles so the browser is not forced to parse code for features nobody has scrolled to yet, and load third-party scripts — chat, ads, marketing pixels — after first interaction rather than on page load, since none of them are the reason someone came to the page. A focused performance pass is usually this exact list, done once, properly, rather than a rebuild.

Why the score moves between runs, even on the same page

A single Lighthouse run is a sample, not a measurement — Chrome’s own scoring documentation lists A/B tests, ad-serving changes, shifting internet routing, device load, browser extensions and antivirus software as normal sources of run-to-run variance, on top of whatever your own deploys changed. A score of 94 one minute and 88 the next is not usually a regression; it is the same page measured under slightly different conditions. Judge a trend across several runs, not a single number screenshotted for a report.

Desktop and mobile are also not the same test with a different label. Since Lighthouse v6 they run on separate scoring curves calibrated to different real-world data, and mobile is throttled to a slower, more constrained profile on purpose — it is meant to represent a mid-range phone on a real network, not the fibre connection the test happens to run on. A page that scores 100 on desktop and 74 on mobile is not a bug in the tool; it is the tool doing the one thing it is actually for.

The gap between 100 in the lab and "good" for real visitors

PageSpeed Insights shows lab and field data side by side, and Google is explicit that it does not combine them: the 0–100 score is based entirely on the lab run, and field data — real visits, aggregated from the Chrome UX Report — is reported separately without touching that number. Their own documentation states it plainly: having good lab data does not necessarily mean real-user experiences will also be good. A 100 tells you the simulated load on the tested device and network was excellent. It does not tell you what happened on a three-year-old Android phone on patchy 4G, which is where a meaningful share of real traffic actually sits.

This is also where Core Web Vitals come in as a separate, and in some ways more important, number — field data judged at the 75th percentile of real visits over a rolling window, which is what Google’s ranking systems actually look at. A site can hold 100 in the lab and still fail Core Web Vitals in the field if its real audience skews toward older devices or slower connections than the lab test simulates. Check both. They are answering different questions.

When chasing the literal 100 is worth it, and when it is not

The log-normal curve means the last few points are the most expensive ones on the page, by a wide margin — which makes 100 the right target for a small set of pages and a genuinely wasteful one for most of the site. The pages worth the last mile are the ones carrying commercial weight: the homepage, the primary landing pages advertising traffic lands on, anything a paid campaign points at. A blog post two clicks deep is very unlikely to earn back the hours spent closing a 94-to-100 gap.

Ninety is where the practical return usually stops, and Chrome’s own colour banding agrees — 90 and above is graded "good", full stop, with no distinction drawn between 90 and 100. Spend the marginal hour on the page nobody has fixed yet instead of the page that is already green.

How we scope this in practice

A Technical Audit is where this starts — it tells you which of the five metrics is actually costing you points on your commercially important pages, rather than guessing from a single Lighthouse run. From there, a focused performance pass fixes the specific list rather than a generic one.

On a new build, this is not a separate line item — a Business Website engagement is built on a modern stack precisely so the score sits close to this range on day one, rather than something to retrofit a year later once the templates and the third-party script list have both grown past the point where fixing it is cheap.

Sources

The scoring weights, methodology and lab/field distinctions above come from these, checked August 2026.

Frequently asked questions

Curious what is actually capping your score?

We run a fixed-price technical audit that shows exactly which metric is costing you points, and whether closing the gap is worth it.