Skip to content
← All documentation
21 checks

Performance

Server response time, payload weight, image sizes, Core Web Vitals and the HTTP caching that decides what a re-crawl costs.

MediumNeeds JS render

An image the browser cannot decode

The file arrived and the browser drew nothing: it is corrupt, or a format the browser does not know (a WebP or AVIF with the wrong extension, a PDF named .jpg); re-export it.

Id
IMAGE_DOES_NOT_DECODE
Fix estimate
10 min per page
Medium

The first image on the page is lazy-loaded

Remove loading="lazy" from the first image (the likely largest paint) and give it fetchpriority="high"; lazy-loading it delays the moment the page looks ready.

The page's main image, the one at the very top, is set to "load lazily", that is, only when someone scrolls to it. Except it sits on the first screen, so the browser first waits, then finds it is needed after all, and only then fetches it. The image that should come first comes last. This is a common side effect of an image optimisation plugin adding lazy loading to everything. Remove it from the image above the first screen and keep it for the ones below.

Id
LCP_IMAGE_LAZY_LOADED
Fix estimate
5 min per page
MediumNeeds PageSpeed

Low Lighthouse performance score

Id
LOW_PERFORMANCE_SCORE
Fires at
< 0.5 score
Fix estimate
30 min per page
MediumNeeds PageSpeed

Cumulative Layout Shift above the recommended threshold

Elements of the page move while it loads: the text jumps down because an image appears above it, a button slips from under the finger because a banner came in. The reader clicks something other than what they meant. Google measures these jumps on real users and penalises them in the page's rating. Usually the culprits are images without stated dimensions, ads and banners without reserved space, and fonts that swap after loading. Give every image a width and height, and every banner a fixed place.

Id
POOR_CLS
Fix estimate
30 min per page
MediumNeeds PageSpeed

Interaction to Next Paint above the recommended threshold

The page responds to a tap with a delay. The reader taps a button and for a moment nothing happens, so they tap again. Google measures the time from touch to response on real users and counts it in the page's rating. Usually the culprits are heavy scripts blocking the browser: a tag manager with dozens of tags, chat, recommendations, tracking, all at once. Start with the list of third-party scripts and the question which of them really earn their place.

Id
POOR_INP
Fires at
> 200 ms
Fix estimate
30 min per page
MediumNeeds PageSpeed

Largest Contentful Paint above the recommended threshold

The largest element on the screen, usually the main photo or the heading, appears too late. For a few seconds the reader looks at an empty or half-empty page, and some leave before they see anything. Google measures that time on real users and counts it in the page's rating. Usually the culprit is a main photo that is too large, a photo loaded "lazily" though it sits at the top, fonts loaded before the content, or a slow server. Start with the image above the first screen: size, format, no lazy loading.

Id
POOR_LCP
Fires at
> 2,500 ms
Fix estimate
30 min per page
MediumEstimate

Slow server response

Ask your host or developer about caching or a faster plan — the server itself is slow to answer.

Id
SLOW_RESPONSE
Fires at
> 1,500 ms
Fix estimate
30 min per page
MediumEstimate

Slow time to first byte

Reduce server think-time with caching or a faster backend — TTFB delays every other loading metric.

Time to first byte is how long the server thinks before it starts sending anything. Images and scripts play no part in it; it is the time spent deciding what to answer. When that time grows, everything after it is late too: the reader stares at a blank screen, and Googlebot waits and eventually takes fewer pages. Usually the database, missing page caching or a plugin that calls an outside service on every visit is at fault. If the page is slow even in an empty browser, start here; image compression can wait.

Id
SLOW_TTFB
Fires at
> 1,800 ms
Fix estimate
30 min per page
Medium

Unoptimized images

Compress the image and serve a modern format such as WebP or AVIF.

Id
UNOPTIMIZED_IMAGE
Fires at
> 500 KB
Fix estimate
5 min per page
LowEstimate

Very large DOM

Simplify the markup — thousands of DOM nodes slow rendering and hurt interaction responsiveness.

Id
EXCESSIVE_DOM_SIZE
Fires at
> 1,500 DOM nodes
Fix estimate
30 min per page
Low

A font preloaded without crossorigin

Fonts are fetched in anonymous mode, so a preload without crossorigin does not match and the browser downloads the font twice; add crossorigin to the preload link.

Id
FONT_PRELOAD_WITHOUT_CROSSORIGIN
Fix estimate
5 min per page
LowEstimate

Images below the fold load eagerly

Add loading="lazy" to images far down the page so they are fetched only if the reader scrolls to them.

Id
IMAGES_WITHOUT_LAZY_LOAD
Fix estimate
10 min per page
Low

A srcset the browser cannot use

Write each candidate as a URL and one descriptor, all w or all x, and add sizes when using widths; a browser that cannot read the list picks an image on its own.

Id
INVALID_SRCSET
Fix estimate
5 min per page
Low

Large HTML payload

Id
LARGE_HTML_PAYLOAD
Fires at
> 500 KB
Fix estimate
30 min per page
Low

No Cache-Control header

Send a Cache-Control header so browsers and proxies know how long the answer stays fresh.

Id
MISSING_CACHE_CONTROL
Fix estimate
20 min per page
LowCrawl budget

No ETag or Last-Modified header

Send an ETag or Last-Modified header so unchanged pages can answer with a cheap 304 instead of the full body.

Id
MISSING_CACHE_VALIDATORS
Fix estimate
20 min per page
Low

HTML served without compression

Enable gzip or Brotli compression on the server — HTML typically shrinks by 70–80%.

Id
MISSING_CONTENT_COMPRESSION
Fires at
> 10 KB
Fix estimate
15 min per page
Low

Images missing width/height

Id
MISSING_IMAGE_DIMENSIONS
Fix estimate
3 min per page
LowEstimate

Third-party origins without a connection hint

Add link rel="preconnect" (or dns-prefetch) for the third-party origins the page loads from, so the DNS and TLS handshake starts before the first resource is found.

Id
MISSING_PRECONNECT_HINTS
Fix estimate
10 min per page
Low

Many render-blocking scripts or stylesheets

Add defer/async to non-critical scripts and inline or split critical CSS so the page paints sooner.

Id
RENDER_BLOCKING_RESOURCES
Fires at
≥ 6 blocking resources
Fix estimate
25 min per page
LowNeeds JS render

A third-party script that no longer loads

The page asks another host for a script and gets an error or no host at all (a service shut down, a CDN path gone); remove the tag, every visitor waits on it for nothing.

Id
THIRD_PARTY_SCRIPT_DEAD
Fix estimate
10 min per page
See it on your own site

Which of these would your site trip?

Read your site, free