Performance
Server response time, payload weight, image sizes, Core Web Vitals and the HTTP caching that decides what a re-crawl costs.
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
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
Low Lighthouse performance score
- Id
- LOW_PERFORMANCE_SCORE
- Fires at
- < 0.5 score
- Fix estimate
- 30 min per page
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
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
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
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
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
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
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
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
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
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
Large HTML payload
- Id
- LARGE_HTML_PAYLOAD
- Fires at
- > 500 KB
- Fix estimate
- 30 min per page
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
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
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
Images missing width/height
- Id
- MISSING_IMAGE_DIMENSIONS
- Fix estimate
- 3 min per page
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
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
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