performance

Lighthouse performance score

MetricSpot pulls the PageSpeed Insights performance score for the page. Combines lab metrics for paint, interactivity, and layout stability into a 0–100.

What this check does

Calls the PageSpeed Insights API for the page URL and reports the overall performance score (0–100). The score is a weighted average of five lab metrics: First Contentful Paint, Largest Contentful Paint, Total Blocking Time, Cumulative Layout Shift, and Speed Index.

Why it matters

Performance is a confirmed ranking factor through Core Web Vitals and a confirmed conversion factor through every conversion study ever published. The Lighthouse score is the easiest single number to track — Google itself groups it into three bands:

  • 90–100 (green) — fast. Target this.
  • 50–89 (orange) — needs work.
  • 0–49 (red) — slow. Likely losing rankings and conversions.

A page at 30 isn’t slightly worse than one at 80; it’s losing visitors before they see anything.

How to fix it

Performance work is a layered effort. Tackle the biggest contributors first:

1. Optimize the largest images (LCP).

Most slow pages are slow because of one hero image weighing 2–5 MB. Compress it, serve in AVIF/WebP, set explicit width and height:

<img
  src="/hero.avif"
  width="1200"
  height="630"
  alt="…"
  fetchpriority="high"
  loading="eager">

fetchpriority="high" tells the browser to download this image before non-critical assets — directly improves LCP.

2. Defer non-critical JavaScript (TBT and INP).

Every analytics, chat widget, and A/B testing script runs on the main thread before users can interact. Defer or async them:

<script src="/analytics.js" defer></script>
<script src="https://plausible.io/js/plausible.js" defer></script>

For React/Next.js: code-split heavy components, use dynamic(() => import(...), { ssr: false }) for below-the-fold widgets, and audit third-party scripts in DevTools’ Performance tab.

3. Inline critical CSS, defer the rest.

<style>/* critical CSS — visible above the fold */</style>
<link rel="preload" href="/main.css" as="style" onload="this.rel='stylesheet'">

Critical CSS extractors (Critters, Beasties for Next.js, astro:assets for Astro) automate this.

4. Reserve space for dynamic content (CLS).

Every image needs width and height. Every embed needs an explicit container. Every web font needs font-display: swap and a fallback that matches metrics.

5. Cache, compress, CDN.

Serve static assets from a CDN (Cloudflare, Bunny, Fastly). Enable Brotli compression on HTML/CSS/JS. Set Cache-Control: public, max-age=31536000, immutable on fingerprinted assets.

Tools to use:

  • PageSpeed Insights — same engine MetricSpot calls. Shows specific audit failures.
  • Chrome DevTools → Performance panel — find the actual slow frame.
  • npx unlighthouse https://yourdomain.com — Lighthouse against every page, not just the homepage.
  • WebPageTest — for testing from specific geographies and connection types.

Related checks: LCP, INP, CLS.

Frequently asked questions

Why does my local Lighthouse score differ from PSI?

Local Lighthouse uses your CPU and network; PSI uses a throttled mid-tier Android device on a 4G connection. PSI is what Google uses for the real signal — always tune against that, not your M3 MacBook’s score.

Does the score affect ranking directly?

Indirectly. Google ranks on the three Core Web Vitals (LCP, INP, CLS) — not on the composite score. But a low Lighthouse score almost always means the underlying CWV metrics are also bad. Fix the metrics; the score follows.

My score swings between visits — why?

Field data (what PSI shows when the URL has enough Chrome user traffic) is stable. Lab data (single Lighthouse run) is variable — server warm/cold, ad networks loading different creatives, third-party scripts. Run PSI three times and take the median, or rely on the 28-day field data when available.

Sources

Last updated 2026-05-11