▲ Pillar article
SEO

Core Web Vitals: the complete guide to optimising your site's performance

· · Updated · 14 min read · 2,667 words
Dashboard showing Core Web Vitals metrics LCP INP CLS on a dark background with values in the green

Core Web Vitals are the performance metrics Google uses to assess the user experience on your site. LCP, INP and CLS affect your rankings: here's how to measure them and get them all into the green.

Core Web Vitals are a set of metrics Google introduced in 2020 that became an official ranking factor in 2021 with the Page Experience Update. They measure three fundamental dimensions of user experience: how quickly the page's main content loads, how quickly it responds to interactions and how stable the layout stays while loading. If your site scores poorly on these metrics, Google penalises it in the SERPs compared with sites that have similar content but better performance. In this guide you'll find everything you need to understand, measure and optimise Core Web Vitals — with precise target values, free tools and concrete techniques you can apply even without a developer.

75°
percentile: to pass, at least 75% of the page's real visits must meet the threshold
2.5s
is the "good" threshold for LCP (Largest Contentful Paint)
0.1
is the "good" threshold for CLS (Cumulative Layout Shift)

Sources: Google, web.dev/vitals

Core Web Vitals thresholds
MetricGoodNeeds improvementPoor
LCP (loading)≤ 2.5 s2.5–4 s> 4 s
INP (responsiveness)≤ 200 ms200–500 ms> 500 ms
CLS (visual stability)≤ 0.10.1–0.25> 0.25

Values at the 75th percentile of real visits. Source: Google, web.dev/vitals

What Core Web Vitals are and why Google uses them for ranking

Core Web Vitals are one part of page experience: Google does not use a single "page experience signal", but its ranking systems take several aspects of experience into account, including HTTPS, the absence of intrusive interstitials and mobile-friendliness. However, the three core metrics — LCP, INP and CLS — carry the most weight in rankings. Google collects them from real Chrome user data (the Chrome User Experience Report, CrUX for short) and compares them with lab data from PageSpeed tests. This means a good lab PageSpeed score is not enough: what counts is the experience of your real visitors, with their connections, their devices and their conditions of use. A site that loads in 1.2 seconds in a lab test but serves unoptimised images over mobile networks can easily have a 4–5 second LCP in the field. To access CrUX data for your site, your domain needs enough traffic to be included in the dataset — if the site is new or gets very few visits, Google Search Console will show an "insufficient data" message and you'll have to rely solely on lab data until traffic grows.

The way Core Web Vitals influence rankings isn't as simple as a numerical score. Google applies a threshold system: each metric has three zones — Good (green), Needs improvement (orange) and Poor (red). A page passes the Core Web Vitals assessment (the one shown in Search Console and PageSpeed Insights) when the 75th percentile of real sessions falls within the green zone for all three metrics. The 75th percentile means 75% of sessions must be below the green threshold — not the average, not the median. This matters because the average can be skewed by a small number of very fast sessions, while the 75th percentile ensures that users in worse conditions also get an acceptable experience. If even one of the three metrics is red for 25% of users, the whole Page Experience signal turns negative.

LCP — Largest Contentful Paint: perceived loading speed

LCP measures the time it takes for the largest visible element in the viewport to be fully rendered. In most cases this is the hero image, the main banner or the first large block of text above the fold. Google's target is clear: under 2.5 seconds is good, between 2.5 and 4 seconds needs improvement, over 4 seconds is poor. LCP depends on four main factors that add up: server response time (TTFB), render-blocking time caused by CSS and JavaScript, download time of the main resource and rendering time in the browser. Optimising LCP means working on all four factors together — compressing images isn't enough if the server takes 800ms to respond.

The most common causes of a slow LCP are unoptimised hero images, web fonts that block rendering, unoptimised critical CSS and JavaScript, and slow hosting. For images, the most effective solution is to use WebP or AVIF at the right size for each breakpoint, combined with loading="eager" and fetchpriority="high" on the element that will become the LCP. Many developers make the mistake of applying loading="lazy" to every image, including the hero: this delays the LCP element even further because the browser doesn't start the download until the image is close to the viewport. Another key optimisation is preload: adding <link rel="preload" as="image"> in the <head> tells the browser to download the LCP image immediately, before it has even parsed the whole DOM. For fonts, using font-display: swap or font-display: optional prevents render blocking. font-display: optional is the most aggressive choice: if the font isn't available within about 100ms, the browser uses the fallback and never switches — it completely eliminates the flash of invisible text (FOIT) but can lead to inconsistent fonts across pages.

Google's official LCP thresholds

Good: ≤ 2.5 seconds — positive ranking signal
Needs improvement: between 2.5s and 4s — neutral, worth optimising
Poor: > 4 seconds — negative signal, high priority
The value is measured at the 75th percentile of real user sessions.

INP — Interaction to Next Paint: responsiveness to interactions

INP (Interaction to Next Paint) replaced FID (First Input Delay) as the interactivity metric in March 2024. While FID only measured the delay of the first input, INP measures the latency of every interaction the user has with the page — clicks, taps and key presses — and reports the 98th percentile of those latencies as the final score. In practice, it measures how responsive your site is when the user actively interacts with it. The targets are: under 200ms is good, between 200ms and 500ms needs improvement, over 500ms is poor. INP is especially problematic on JavaScript-heavy sites: every click event has to wait for the browser's main thread to be free before it is processed. If heavy scripts are running in the background, a click on a button can feel "stuck" for half a second or more, even though the browser technically registered the event.

The most common causes of a high INP are long JavaScript tasks (tasks that block the main thread for more than 50ms), heavy event listeners, massive re-layouts caused by alternating DOM reads and writes, and unoptimised third-party libraries such as chat widgets, heavy analytics and A/B testing. To improve INP you need to split long tasks into smaller chunks using scheduler.yield() or setTimeout, move heavy logic into Web Workers (separate threads that don't block the UI thread), and reduce or defer the loading of third-party scripts. Google recommends using the Chrome DevTools Performance Insights panel to identify long tasks: every red bar in the flame chart marks a task that exceeds 50ms. The most effective approach is to profile the application during a real interaction — for example, recording what happens when the user clicks the navigation menu or an add-to-cart button — and then optimise the longest tasks one at a time.

CLS — Cumulative Layout Shift: the page's visual stability

CLS measures how much the page layout shifts unexpectedly during loading and use. Every time an element moves without the user having done anything, it adds to the CLS score. The score is a unitless value calculated as the fraction of the impacted area multiplied by the distance moved. A CLS of 0.1 or less is considered good, between 0.1 and 0.25 needs improvement, above 0.25 is poor. The classic case of high CLS is the button you're about to click that moves because an ad banner or an image that finishes loading appears above it. This is particularly frustrating on mobile and can lead users to accidentally click the wrong link.

The most common causes of CLS are images without explicit dimensions (the browser doesn't know how much space to reserve until the image has loaded), ads of variable size, web fonts that replace the fallback and change the size of the text, and content injected dynamically by JavaScript above existing content. The main fix for images is to always specify the width and height attributes in the HTML tag: this lets the browser calculate the aspect ratio in advance and reserve the right space. For ads, use containers with fixed minimum dimensions. For fonts, use size-adjust and ascent-override in your @font-face declarations to reduce the layout shift caused by font swapping. Another effective technique is skeleton loading: showing grey placeholders the same size as the incoming content drastically reduces CLS because the space is already reserved in the layout.

Field data (CrUX)
  • Based on real Chrome users
  • Reflect real network and device conditions
  • Available in Search Console and PageSpeed
  • Updated on a rolling 28-day basis
  • Used by Google for actual ranking
Lab data (Lighthouse)
  • Controlled, reproducible environment
  • Available immediately after every change
  • Useful for debugging and local development
  • Not used directly for ranking
  • Can differ widely from real-world data

Tools to measure Core Web Vitals

Google PageSpeed Insights is the starting point: enter the URL and you get both field data (if available in CrUX) and Lighthouse lab data. The most important section is the field data, because it shows the real values at the 75th percentile for LCP, INP and CLS. The lab section is useful for debugging but doesn't necessarily reflect what Google sees. For an aggregated view of every page on the site, use Google Search Console: the "Page experience" report shows how many URLs on your site are green, orange and red for each metric, with details for groups of similar URLs. It's the most important tool because it uses the same data Google uses for ranking. The third essential tool is Chrome DevTools: the Performance panel lets you record and analyse exactly what happens during loading and interactions, pinpointing long tasks, blocking resources and layout shifts with surgical precision.

For continuous monitoring, consider installing Google's web-vitals JavaScript library directly on your site: it collects real user metrics and sends them to your analytics system, letting you see real values segmented by page, device and connection type. This is far more useful than running a PageSpeed test once a month: it lets you spot regressions immediately after a site update and understand which pages have problems that never show up in lab tests. Tools such as Vercel Speed Insights, Sentry Performance and Datadog RUM already offer this built in if you use those platforms.

How to optimise LCP: practical techniques for developers and non-developers

Step 1 — Optimise the LCP image

Convert to WebP or AVIF, resize to the actual display size, add fetchpriority="high", remove loading="lazy" if present, and add a preload in the <head>. Typical saving: 0.5–1.5 seconds of LCP.

Step 2 — Reduce server response time (TTFB)

Use a CDN to serve static content from the location geographically closest to the user. Enable HTTP/2 and Brotli compression. If you use WordPress, install a caching plugin such as WP Rocket or W3 Total Cache. Typical saving: 0.2–0.8 seconds of TTFB.

Step 3 — Eliminate render-blocking resources

Add defer or async to all non-critical scripts. Extract the critical (above-the-fold) CSS and inline it in the <head>, loading the rest of the CSS asynchronously. Tools such as Critical or Penthouse automate this. Typical saving: 0.3–1.0 seconds.

Step 4 — Optimise web fonts

Use font-display: swap in your @font-face declarations. Preload critical fonts with <link rel="preload" as="font">. Consider using system fonts as the primary fallback if the visual difference is minimal. Typical saving: 0.1–0.5 seconds.

Common mistakes that wreck Core Web Vitals

Mistake #1 — Lazy loading the hero image. Applying loading="lazy" to the page's main image is one of the most frequent and damaging mistakes. The browser delays downloading the image until it's close to the viewport — but the hero image IS already in the viewport on load. The result: LCP gets significantly worse. The hero image should always have loading="eager" (or no loading attribute) and fetchpriority="high".
Mistake #2 — Images without width and height attributes. Adding images without specifying width and height in the HTML tag is the main cause of high CLS. The browser doesn't know how much space to reserve, and every image that finishes loading pushes all the content below it. Always specify both attributes even if you then use CSS for sizing — the browser uses the w/h ratio to calculate the aspect ratio in advance.
Mistake #3 — Third-party scripts loaded synchronously. Chat widgets, tracking pixels and A/B testing scripts loaded with a normal <script> tag block DOM parsing. Every kilobyte of synchronous JavaScript in the <head> delays both LCP and INP. Always use defer or async for non-critical scripts, and consider deferring them further with a 3–5 second timeout after the load event for non-essential scripts such as chats.
Mistake #4 — Cheap shared hosting without a CDN. A shared server that responds in 600–800ms means that even with perfect images and optimised JavaScript, LCP will hardly get under 2.5 seconds. A TTFB (Time To First Byte) above 200ms is already a warning sign. The solution isn't necessarily an expensive dedicated server: a CDN such as Cloudflare (free) in front of your hosting can cut TTFB by 50–70% for most users by serving static resources from the geographically closest cache.

Core Web Vitals for WordPress sites

WordPress is the most widely used platform in the world and also the one with the most widespread performance problems, often caused by heavy themes, poorly optimised plugins and inadequate hosting. The main problem is that by default WordPress loads dozens of scripts and styles even when they aren't needed for the page being viewed — every plugin adds its resources indiscriminately. The first optimisation is to stop unused resources from loading: plugins such as Asset CleanUp or Perfmatters let you selectively disable scripts and styles on specific pages. The second priority is caching: a plugin such as WP Rocket or LiteSpeed Cache (if your host runs a LiteSpeed server) drastically cuts server response times by generating static HTML versions of dynamic pages. For images, Imagify or ShortPixel automatically convert to WebP and compress images on upload. Finally, consider managed WordPress hosting such as Kinsta, WP Engine or Cloudways: they cost more than shared hosting but already include a CDN, advanced caching and servers optimised for PHP, and they are often the difference between a 4-second LCP and a 1.8-second one.

Practical tip for non-developers: install Google's "Web Vitals" Chrome extension. It shows LCP, INP and CLS in real time for every page you visit, including your own site. You can browse the site like a normal user and immediately see whether any pages are problematic, without having to open PageSpeed every time.

The impact of Core Web Vitals on rankings: how much do they really matter?

Ever since Google confirmed Core Web Vitals as a ranking factor, many SEOs have wondered how much they really weigh compared with other signals. The honest answer is: less than content relevance and backlinks, but enough to make a difference in competitive markets. Google has stated that Core Web Vitals are a tiebreaker — with equal content and authority, the site with better performance has an advantage. In practice, this means that if your site is poor on all three CWV and your main competitors are in the green, you're leaving rankings on the table. Conversely, optimising CWV won't work miracles if your content doesn't match the user's search intent or if you don't have authoritative links. The right strategy is to treat Core Web Vitals as a quality prerequisite: they need to be green so you aren't penalised, then you build rankings with content and link building. Correlation studies show that sites in the top positions tend to have better CWV than sites further down — but causation isn't easy to isolate. What is certain is that a better user experience leads to more time on site, fewer bounces and more conversions — benefits that go well beyond the ranking factor alone.

Want to improve your site's Core Web Vitals?

Optimising Core Web Vitals requires a careful technical analysis and targeted work: there's no universal recipe, every site has its own specific issues. If you'd like a professional analysis of your site's performance with a concrete action plan, explore the SEO service or contact me directly for a consultation.

From theory to practice

If you want to apply this to your own project, take a look at my SEO and online visibility service: clear prices from €200/month, a free quote and a reply within 24 hours.

Frequently asked questions

Answers to the most common questions on this topic.

Core Web Vitals are three performance metrics defined by Google to measure user experience: LCP (how fast the main content loads), INP (responsiveness to interactions) and CLS (visual stability of the layout). They became official ranking factors in 2021.
LCP must be under 2.5 seconds, INP under 200 milliseconds and CLS under 0.1. These values must be met at the 75th percentile of real user sessions — good averages are not enough, 75% of users must fall within the green zone.
The main tools are Google PageSpeed Insights (lab data + CrUX field data), Google Search Console (the Page Experience report with aggregated data for the whole site) and Chrome DevTools (detailed technical analysis). Google's 'Web Vitals' Chrome extension is useful for real-time monitoring.
Yes, but they are a secondary factor compared with content and backlinks. They work as a tiebreaker: when content quality is equal, the site with better Core Web Vitals has an advantage. They matter most in competitive markets where the gap between well-optimised sites is minimal.
The most frequent causes are unoptimised hero images (too heavy or in the wrong format), a missing fetchpriority="high" attribute on the LCP image, slow hosting with a high TTFB, and render-blocking JavaScript or CSS that delays loading of the main content.
PageSpeed's lab test simulates ideal conditions with a simulated connection and a virtual device. Search Console shows real user data at the 75th percentile — including users on slow connections or older devices. A significant gap between the two is normal; for rankings, only the real-world data counts.
If you use WordPress, plugins such as WP Rocket or ShortPixel automatically add dimensions to images. You can also adjust the theme by explicitly setting width and height on image tags. For ad banners, use containers with a fixed min-height in the CSS. Avoid injecting dynamic content above the fold with JavaScript.
The main change is that FID (First Input Delay) was replaced by INP (Interaction to Next Paint) from March 2024. INP is more comprehensive because it measures every user interaction throughout the session, not just the first one. This has made the interactivity signal far more representative of real experience.

Need help?

I can help you put what you've read in this article into practice.

Explore the service →

Latest articles

See all →

My services

All services →