Skip to main content
PandaCodeGen
Back to Insights

Performance engineering

How to Reach 90+ PageSpeed Without Chasing a Screenshot

A Lighthouse score is one lab test on one day, not a permanent property of your site. Fix the actual page, write down the conditions you tested under, run it more than once, and check what real visitors experience. Do not promise that every page will always show 100, because nobody can hold that.

Every threshold and metric definition here was re-checked against Chrome's primary Lighthouse documentation on August 3, 2026. Where a claim can be verified in your own browser, this page tells you how to verify it rather than asking you to take a citation on trust.

Hassan Jamal·February 17, 2026·7 min read

First understand the number

A Lighthouse score is a weighted summary of one simulated test, under one device profile, at one moment. It is not a property your site owns and not a threshold Google publishes. Read it as a diagnostic that points at work, then verify the work against what real visitors experienced. Five things follow from that.

  • Lighthouse labels 90 to 100 as good, 50 to 89 as needing improvement, and below 50 as poor. That band is Lighthouse's own verdict on its own weighted diagnostic, and that is the whole of what it means. Google does not publish 70, 90 or 100 as a direct ranking requirement.
  • The score is a weighted lab calculation and can vary with tool version, device, network, CPU, cache, content, consent and third parties.
  • Core Web Vitals are field metrics: LCP, INP and CLS, evaluated at the 75th percentile where eligible data exists.
  • A 100 lab score does not guarantee a Core Web Vitals pass, ranking, traffic, conversion or revenue.
  • A 90+ target should name pages, profiles, runs, environment, exclusions and remedy in writing.

Baseline

Preserve field and lab evidence before changing the page.

Diagnose

Fix the measured resource, main-thread, layout or server constraint.

Verify

Repeat comparable runs, then monitor real-user distributions.

The field metrics behind those thresholds are set out in our guide to Core Web Vitals, and the relationship between performance and search in how website speed affects SEO. This page is about the work itself.

Run the test before you read the rest

PageSpeed Insights is free and needs no account. Open pagespeed.web.dev, enter the exact public URL of the page you care about, and press Analyze. Read the Mobile tab first, because that is the profile most reporting is based on. Two numbers come back and they are not the same thing: the field data at the top, drawn from real Chrome visitors over a trailing window, and the Lighthouse lab result below it, simulated on one throttled device in one moment. A page with no eligible field data shows the lab result only. Note which of the two you are looking at before you quote a score to anyone.

Step 1: define representative pages and journeys

Group the site by template and behavior: homepage, long service page, article, location, product, collection, cart, form, calendar and authenticated state. Pick pages that represent the accepted scope and important visitor journeys. The homepage alone does not prove the rest of the site. If you are still working out which routes hurt, our walkthrough of why a website loads slowly narrows the list first.

"A Lighthouse score is one lab test on one day. It is not a permanent property of your site.

Step 2: record field and lab baselines

A mobile cold-cache run with consent accepted is not comparable to a desktop warm-cache run before tags load. Keep profiles separate and report variation instead of selecting the best run. Four things go in the baseline, and the run count is the one that makes a later comparison mean anything.

  • Save PageSpeed Insights field origin and URL data where available, including assessment date.
  • Record exact URL, release, device profile, network, CPU, location, cache, consent and login state.
  • Run each agreed lab profile at least three times and retain the raw reports.
  • Capture server timing, request waterfalls, performance traces, coverage and the rendered page.
Do not average unlike tests

A mobile cold-cache run with consent accepted is not comparable to a desktop warm-cache run before tags load. Keep profiles separate and report variation instead of selecting the best run.

Step 3: reduce document and server delay

Follow redirects, inspect DNS, connection, CDN, cache and origin timing, and profile the backend when the document is slow. Cache only where content, identity and invalidation rules permit it. A faster host can help an origin bottleneck; it cannot remove client-side media, script or layout work. The wider sequence for that work is laid out in our guide to speeding up a website.

Step 4: make the LCP resource discoverable and efficient

Identify the actual LCP element in the trace instead of assuming it is the hero image. Once you know what it is, the work is making it discoverable early and delivering it efficiently: right size, modern format, never lazy-loaded when it is above the fold, and nothing render-blocking sitting in front of it.

  • Identify the actual LCP element in the trace instead of assuming it is the hero image.
  • Serve an appropriately sized, compressed asset in a modern format such as AVIF or WebP, and preserve visual quality.
  • Avoid lazy-loading the above-the-fold LCP image and ensure the browser can discover it promptly.
  • Reduce render-blocking work that delays the element and verify responsive candidates.

Render-blocking is worth measuring rather than guessing at. Open the Coverage panel in devtools, record a reload, and read the unused-bytes column for each stylesheet and script. That gives you your own number for your own page, which is more useful than any published average: it tells you whether the win is splitting a stylesheet, inlining what the first screen actually needs, or deleting a file nobody has referenced in a year. Re-record after the change and compare against the figure you wrote down.

On WordPress the LCP element is usually decided by the theme or the page builder, which is where fixing a slow WordPress site and the Divi theme performance diagnostic pick the work up.

Step 5: reduce long tasks and interaction delay

Profile JavaScript execution, event handlers, hydration, layout work and third-party tasks. Remove unused code, split non-critical work, yield during long processing and keep interaction handlers small. Test the real menu, form, filter, cart and modal, not only initial load.

  • Code splitting: ship the JavaScript this route needs, not the bundle every route needs.
  • Tree shaking: drop library exports the build can prove are never reached.
  • Dynamic imports: load a modal, editor, map or carousel when it is opened, not on first paint.
  • Server rendering: send HTML for anything that does not need to be interactive on the client.

Each of these is checkable in your own build output rather than on someone's word. Print the per-route bundle sizes your framework reports at build time, note them, make one change, and print them again. If the number did not move, the technique was not applied where you thought it was.

Step 6: stabilize layout

Layout shifts come from space that was not reserved and content that arrived late. Reserve dimensions for images, video, embeds and dynamic components, never insert banners or consent UI above existing content without reserved space, and exercise the late states deliberately while recording CLS.

  • Reserve dimensions or aspect ratio for images, video, embeds and dynamic components.
  • Do not insert banners, consent UI or errors above existing content without reserved space.
  • Use stable font-loading behavior and verify fallback-to-final font changes.
  • Exercise late content, validation, loading, success and error states while recording CLS.

Fonts are worth checking yourself rather than taking on trust. Open the Network panel, filter to Font, and reload. If the request goes to an origin you do not control, the browser has to resolve and connect to that host before a single glyph arrives, and it cannot start until the stylesheet referencing the font has parsed. Self-hosting the file removes that dependency chain and lets you preload it. Then watch the text on a throttled reload: if it is invisible until the font lands you have a flash of invisible text, and if it appears in a fallback and then reflows you have a layout shift. Which of the two you get is decided by font-display, and the second is usually the better trade, provided the fallback is metric-matched.

Step 7: govern third parties and consent

Inventory analytics, pixels, chat, heatmaps, video, maps, reviews, calendars, tag managers and experiments. Record owner, purpose, consent category, load condition, transfer, performance cost and failure behavior. Defer or remove only when business and compliance requirements permit it. On a WordPress build the same inventory usually starts with the plugin and script audit.

Step 8: repeat, regress and release

Re-run the unchanged acceptance profiles three times per named page before anything ships, then check that the score work did not break functionality, accessibility, analytics or consent. Record the release version, the tool version, the reports, the exclusions and the known variance, because a number without those is not reproducible.

  • Run the unchanged acceptance profiles three times for every named page and profile.
  • Test functionality, accessibility, analytics and consent so score work did not break the journey.
  • Record release SHA or version, tool version, reports, exclusions and known variance.
  • Add budget or regression checks appropriate to the project and monitor field data after release.

Is 70 good enough? And is the tool even reliable?

There is no score you are required to reach. The band is Lighthouse grading its own weighted diagnostic, and Google publishes no number as a ranking requirement, so “is 70 good enough” cannot be answered from the score alone. The question that can be answered is whether your real visitors are having a good experience, and that is a different measurement: field Core Web Vitals at the 75th percentile, not a lab run.

The two can disagree in both directions, which is the part that confuses people. A page can sit at 70 in the lab and pass its field vitals, because the simulated device and network in the test are harsher than what your actual audience uses. A page can also score in the nineties and fail in the field, because the lab run never met your cookie banner, your logged in state, your third-party chat widget or your slowest market. If you have to choose which number to act on, act on the field data and use the lab score to find out why.

That also answers the reliability question. The tool is reliable at what it does, which is running one simulated test and telling you what it found. It is not measuring your visitors, and it will move between runs on the same unchanged page, which is why this guide asks for three runs per profile and reports the variation rather than the best result. A single score screenshot, yours or a vendor's, is one sample of a distribution presented as a fact.

Why 100 is not the right universal promise

Lighthouse weights and implementations evolve. Third-party response, experiments, visitor state and content change. A stable 96 can provide the same useful experience as a selected 100 run, while a 100 tested page can still have accessibility, security, content or business defects. Optimize the bottleneck until the accepted requirement is met, then spend effort where users and the business need it most.

How automated browsing agents encounter a page is a separate question, covered in our note on agentic browsing and the PageSpeed score, alongside the answer-engine playbook we build into a site.

PandaCodeGen's 90+ acceptance method

When accepted project terms include the target, PandaCodeGen tests the named representative pages under named mobile and desktop profiles and requires three passing runs per page and profile. The terms record environment, exclusions and remedy. No target applies to unspecified routes, changing third-party behavior or a different test profile unless the scope says so.

The target does not guarantee rankings, traffic, conversions or revenue. Those outcomes require separate property-level measurement, and search engines and users control them.

Scope tiers are listed on the pricing page, delivery sits under custom engineering, and finished builds are on the work page.

Where the constraint is the platform rather than the page, a WordPress migration is scoped separately, and what migrating does to search visibility is covered on its own page.

Get your performance migration plan

We will baseline representative pages, identify controllable constraints and define a written test and remedy before recommending optimization or migration.

Frequently Asked Questions

What is a good PageSpeed score?

Lighthouse currently labels 90 to 100 as good, but the lab score varies with test and page conditions and is not the same as field Core Web Vitals. Define representative pages and preserve at least three runs for each agreed mobile or desktop profile.

How do I check my PageSpeed score?

Run PageSpeed Insights for the exact public URL, then distinguish eligible Chrome field data from the Lighthouse lab result. Record date, URL, device, network, cache, consent and page state and retain multiple comparable reports.

Can WordPress get a 90+ PageSpeed score?

Yes, some WordPress pages can score 90 or higher. Results depend on hosting, cache, theme, plugins, content, media, fonts, third parties and test conditions. WordPress does not have one universal ceiling or score.

How long does it take to improve PageSpeed score?

Chasing a score is open-ended, which is why it is the wrong target. Measuring a route, fixing its largest constraint and re-measuring is a day. Confirming the change held takes weeks, because field data accumulates over a rolling window and a single lab run on your own laptop proves nothing about your visitors.

Does PageSpeed score affect SEO?

Google uses Core Web Vitals in its broader ranking systems but says good scores do not guarantee top rankings and relevance remains fundamental. A Lighthouse score is a lab diagnostic, not a direct ranking cutoff.

Can PandaCodeGen guarantee a 100 PageSpeed score?

No universal 100 is promised. A 90+ Lighthouse target applies only when accepted terms name representative pages, mobile and desktop profiles, the environment, three passing runs per page and profile, exclusions and remedy. It does not guarantee rankings or business outcomes.