How to Improve Core Web Vitals: Practical Fixes for LCP, INP, and CLS

How to Improve Core Web Vitals: Practical Fixes for LCP, INP, and CLS

Core Web Vitals can feel like one of those topics that’s “technical” until it suddenly isn’t—because rankings dip, conversions slide, or users start bouncing before your page even finishes loading. The good news is that you don’t need to guess. Core Web Vitals boil down to a few measurable experiences: how fast the main content shows up (LCP), how quickly the site reacts when someone taps or clicks (INP), and how stable the layout feels as it loads (CLS).

This guide is built for practical action. You’ll learn what actually moves the needle for LCP, INP, and CLS, how to diagnose what’s happening on your pages, and which fixes tend to deliver the biggest wins without rewriting your entire site. Whether you’re working with an in-house team, a freelancer, or a web design company, the ideas below will help you speak the same language and prioritize the right tasks.

One important note: Core Web Vitals are field metrics. That means Google cares about how real users experience your site on real devices and networks—not just how a single lab test performs on a fast laptop. We’ll use lab tools for debugging, but we’ll always circle back to what matters in the field.

Core Web Vitals, in plain language (and why they’re connected)

It’s tempting to treat LCP, INP, and CLS as three separate checkboxes. In reality, they’re tightly linked because they’re all influenced by the same underlying things: how you load assets, how you run JavaScript, and how you build layouts.

For example, you might improve LCP by adding a big hero image preload—but if you also load a heavy slider script that blocks the main thread, INP can suffer. Or you might reduce CLS by reserving space for images—but if you choose extremely large images, LCP can slow down. The best improvements come from a balanced approach.

Here’s the quick definition of each metric:

  • LCP (Largest Contentful Paint): How long it takes for the biggest visible content element (often a hero image or headline block) to render.
  • INP (Interaction to Next Paint): How responsive the page feels when a user interacts (click, tap, keypress) and the UI updates.
  • CLS (Cumulative Layout Shift): How much the page layout unexpectedly shifts while loading.

If you’re aiming for targets, common thresholds are: LCP under 2.5s, INP under 200ms, and CLS under 0.1 for “good” experiences. But the real goal is consistency: you want most users to have a good experience most of the time, not just on your best pages.

Getting measurements you can trust before you change anything

Use field data first: Search Console and CrUX

Before you start optimizing, figure out whether you have a site-wide issue or a template-specific issue. In Google Search Console, the “Core Web Vitals” report groups URLs by similar performance patterns. That grouping is valuable because it often points to a shared cause—like a slow hero image across a landing page template.

If you need more detail, Chrome UX Report (CrUX) data can help you see how real users experience your pages across devices and network conditions. Field data is the truth serum: it tells you whether your improvements are actually helping people, not just improving a score in a tool.

When you’re reviewing field data, pay attention to the distribution (75th percentile is commonly used) and the device split. Mobile performance issues are far more common, and fixes that help mobile usually help desktop too.

Use lab tools to pinpoint the cause: Lighthouse and DevTools

Lab tools are your microscope. Lighthouse (in Chrome DevTools) can show you what’s delaying LCP, which scripts block the main thread, and where layout shifts occur. PageSpeed Insights combines lab and field data, which is handy for seeing the “why” behind the “what.”

In Chrome DevTools, the Performance panel is especially useful for INP work. You can record an interaction (like opening a menu) and see long tasks, event handlers, and rendering steps that delay the next paint.

The key is to avoid optimizing blindly. If you don’t know what element is your LCP candidate, or which scripts cause long tasks, you’ll waste time on changes that don’t move the metric.

Fixing LCP: make the main content appear faster

Identify your LCP element (it’s not always the hero image)

LCP measures the render time of the largest visible element in the viewport. On many pages, that’s a hero image. But it can also be a big block of text, a featured image, or even a background image applied via CSS.

In Lighthouse, look for the “Largest Contentful Paint element” diagnostic. It will show you the exact element and a breakdown of what’s taking time (server response, render delay, resource load delay). This breakdown is gold because it tells you whether to focus on hosting/TTFB, image optimization, or render-blocking resources.

Once you know the LCP element, you can optimize with precision instead of guessing.

Speed up the server response (TTFB) without overcomplicating it

If the server is slow to respond, everything else starts late. A high Time to First Byte (TTFB) can come from slow hosting, heavy backend processing, uncached pages, or third-party integrations that delay page generation.

Practical fixes include enabling full-page caching where appropriate, using a CDN for static assets, and reducing dynamic work during requests. If you’re on a CMS, make sure caching isn’t being bypassed by unnecessary cookies or personalization on pages that don’t need it.

Also, keep an eye on redirects. A chain of redirects can add noticeable delay on mobile networks, and it’s one of the easiest wins to clean up.

Optimize images like you mean it (format, size, and delivery)

Images are often the biggest contributor to LCP delays. Start by ensuring the hero image is properly sized for the viewport. Serving a 3000px-wide image to a 390px-wide phone is a common, costly mistake.

Use modern formats (WebP or AVIF) where possible, and make sure compression is tuned for the web. If the image is decorative, consider whether it can be replaced with a lightweight gradient or CSS treatment.

Delivery matters too: use responsive images (srcset/sizes) so browsers can choose the right file. And avoid lazy-loading the LCP image—lazy-loading is great for below-the-fold images, but it can hurt the one image you actually need immediately.

Preload critical assets (but keep it targeted)

Preloading can be a big LCP win when used carefully. If your LCP element is an image, preloading it helps the browser start fetching it earlier. If it’s a web font that affects above-the-fold text, preloading the font can reduce delays and prevent flashes that feel janky.

That said, preloading everything is a trap. Too many preloads compete for bandwidth and can slow down what truly matters. Keep preloads limited to the handful of assets required for the initial viewport.

As a rule of thumb: preload the hero image (if it’s LCP), the critical font (if it’s render-blocking), and maybe one critical CSS file if your setup benefits from it.

Reduce render-blocking CSS and JavaScript

Render-blocking resources delay the moment the browser can paint anything meaningful. If you have large CSS files that apply to the entire site, consider splitting “critical CSS” (above-the-fold styles) from the rest, then loading the remainder asynchronously.

On the JavaScript side, defer non-critical scripts. Many sites load analytics, chat widgets, A/B testing tools, and sliders immediately—even though users haven’t interacted yet. Deferring or delaying these scripts can dramatically improve LCP.

Be especially cautious with page builders and all-in-one theme bundles. They can introduce large CSS/JS payloads that are hard to tame without intentional pruning.

Fixing INP: make interactions feel instant

Understand what INP is actually measuring

INP focuses on the latency of interactions across the page lifecycle. It looks at the worst (or near-worst) interaction delays a user experiences and reports a single value. So even if most clicks are fast, one slow interaction—like opening a heavy menu—can drag your INP down.

INP isn’t just about “click speed.” It’s about what happens after the click: event handling, JavaScript execution, style recalculation, layout, and paint. If any of those steps take too long, the user feels lag.

This is why INP improvements often come from reducing JavaScript work and breaking up long tasks.

Hunt down long tasks on the main thread

In Chrome DevTools Performance recordings, look for long tasks (typically 50ms+). These tasks block the main thread, preventing the browser from responding quickly to user input.

Common culprits include large frameworks running too much code on load, heavy third-party scripts, and complex UI components that do a lot of work when clicked (like animated mega-menus or filter panels).

Practical fixes include code splitting (load only what’s needed), removing unused libraries, and replacing heavy UI widgets with simpler, native patterns.

Defer and delay third-party scripts (especially on mobile)

Third-party scripts are a frequent INP killer because they execute on your main thread but you don’t fully control what they do. Chat widgets, heatmaps, ad scripts, and tag managers can all add unpredictable work.

A good approach is to delay non-essential third parties until after the page becomes interactive, or until the user performs an action (like scrolling or clicking a “chat” button). You can also use tag manager rules to limit when certain tags fire.

This isn’t about removing analytics—it’s about loading it in a way that doesn’t punish the user experience.

Break up heavy JavaScript work into smaller chunks

If you have a function that does a lot of work (parsing data, building DOM elements, running calculations), break it into smaller chunks so the browser can paint between them. Techniques like requestAnimationFrame, requestIdleCallback (carefully), or splitting work across microtasks can help.

For interactive components, consider optimistic UI updates: show the visual feedback immediately (like opening a menu) while heavier work continues in the background. Users perceive responsiveness based on feedback, not on whether every internal process finished instantly.

Also consider moving expensive computations off the main thread using Web Workers when appropriate—especially for data-heavy experiences.

Keep event handlers lean and avoid unnecessary re-renders

Many INP issues come from event handlers that do too much: they query the DOM repeatedly, trigger layout thrashing, or cause entire sections to re-render when only a small part changed.

Practical ways to slim down handlers include caching DOM references, batching DOM reads and writes, and avoiding forced synchronous layouts (like reading offsetHeight immediately after changing styles).

If you’re using a framework, audit components that re-render on every interaction. Memoization, virtualization for long lists, and avoiding unnecessary state updates can make a big difference.

Fixing CLS: stop the page from jumping around

Reserve space for images, embeds, and anything that loads later

CLS happens when something appears on the page and pushes other content down (or sideways) after the initial render. The most common cause is missing dimensions on images or media embeds.

Always set width and height attributes (or CSS aspect-ratio) so the browser can allocate space before the image loads. This is especially important for responsive images and CMS-driven content where editors can upload anything.

For embeds (YouTube, maps, social posts), use a placeholder with a fixed aspect ratio. If you’re loading them lazily, the placeholder prevents the layout from shifting when the embed finally appears.

Be careful with fonts: avoid layout shifts from late-loading typography

Web fonts can cause CLS when text is initially rendered in a fallback font and then swaps to the custom font, changing line breaks and element sizes. This is often subtle, but it adds up—especially on content-heavy pages.

Use font-display: swap or optional thoughtfully, and consider preloading key fonts used above the fold. Picking fallback fonts with similar metrics (or using font metric overrides) can reduce visible shifts.

Also, don’t load ten font weights “just in case.” Fewer font files means faster loads and fewer opportunities for shifts.

Stabilize dynamic UI elements (banners, consent notices, promos)

Cookie banners, promo bars, and newsletter popups are notorious for causing layout shifts—especially when they appear at the top of the page and push everything down after the user has started reading.

Prefer overlays that don’t move the underlying content, or reserve space from the start if the element must be inline. If you’re injecting a banner after a delay, you’re practically guaranteeing CLS.

If marketing needs a promo bar, consider rendering it immediately (so it’s part of the initial layout) and then animating opacity instead of height or position changes that trigger reflow.

Avoid inserting content above existing content unless it’s user-initiated

CLS is more forgiving when layout shifts happen in response to a user action. But shifts that happen while the user is passively reading are the ones that feel broken.

That means you should avoid loading “related posts” blocks above the article body, injecting ads at the top mid-load, or expanding accordions automatically. If something must load late, place it below the fold or in a reserved container.

Even small UI touches—like a “sticky” header that changes height on scroll—can contribute to CLS. Keep sticky elements consistent in size, and animate transforms rather than layout properties when possible.

Common site patterns that quietly hurt all three metrics

Hero sections with sliders, videos, and oversized background images

Hero sections are often designed to impress, but they’re also the first thing users see—and the first thing Core Web Vitals measure. Sliders add JavaScript, multiple images, and layout complexity. Autoplay videos add heavy network requests and decoding work.

If you want a high-impact hero without the performance cost, consider a single optimized image (or lightweight video poster) with a clear headline and call to action. You can still create visual interest with subtle CSS effects that don’t require heavy scripts.

When in doubt, simplify the hero. It’s one of the highest-leverage areas for improving LCP and INP at the same time.

Navigation menus that load too much code up front

Mega-menus and animated navigation can be surprisingly expensive. If your menu requires a large UI library or complex DOM manipulation, interactions can feel sluggish—especially on mid-range phones.

A practical approach is to ship a minimal menu experience first, then progressively enhance. Load advanced features only when needed (for example, when the user opens the menu). This reduces initial JavaScript execution and improves INP.

Also consider accessibility: keyboard navigation and focus management are essential. Done well, accessibility improvements often align with performance improvements because they encourage simpler, more predictable UI behavior.

Too many plugins and “one more script” syndrome

It’s easy for a site to accumulate scripts over time: a new tracking pixel here, a widget there, a plugin that adds a feature you rarely use. Each addition might seem small, but collectively they bloat the page and compete for CPU and bandwidth.

A quarterly script audit can be transformative. List every third-party script, what it does, who owns it internally, and whether it’s still needed. Remove or replace anything that isn’t pulling its weight.

If you’re managing multiple stakeholders, frame the conversation around outcomes: “This script costs us X in performance and likely affects conversions.” That’s a more productive discussion than “performance is important” in the abstract.

Workflow that makes improvements stick (not just a one-time sprint)

Prioritize by template and impact, not by random URLs

Core Web Vitals work is most efficient when you fix issues at the template level. If your blog template has CLS problems from images, fixing the template can improve hundreds of pages at once.

Start with the templates that matter most: homepage, top landing pages, service pages, and high-traffic content. Then move outward. This approach also makes it easier to validate changes because you can compare before/after on a consistent page type.

Document what you changed and why. Performance work is iterative, and notes prevent you from reintroducing the same problem later.

Set performance budgets so new features don’t undo your progress

A performance budget is a simple agreement: pages shouldn’t exceed a certain amount of JavaScript, image weight, or total requests. You can also budget for metrics like LCP and INP in lab tests as a guardrail.

This doesn’t have to be complicated. Even a basic rule like “no new third-party scripts without review” can prevent performance drift. If you have a CI pipeline, you can automate checks with Lighthouse CI or similar tools.

The goal is to make performance part of the development process, not a panic button you press after rankings drop.

Keep the site healthy with ongoing upkeep

Performance is not “set it and forget it.” CMS updates, new plugins, marketing tags, and content changes can gradually degrade Core Web Vitals. That’s why many teams build ongoing checks into their routine.

If you prefer a predictable way to handle updates, monitoring, and small fixes, a website maintenance subscription can help keep performance improvements from slipping over time—especially when multiple people publish content or request new features.

Even if you don’t use a formal subscription model, the idea is the same: schedule recurring performance reviews, keep dependencies updated, and treat Core Web Vitals like a living KPI.

Quick wins you can often ship in a day or two

Compress and resize the top images on key pages

If you do only one thing for LCP, make it this: optimize the images that appear above the fold on your highest-traffic pages. In many cases, you can cut hundreds of kilobytes (or more) with no visible quality loss.

Use responsive images, modern formats, and ensure the CMS isn’t outputting massive originals. If your theme generates multiple sizes, confirm the correct one is being used in the markup.

After shipping, re-test with Lighthouse and then watch field data over the next couple of weeks to confirm the improvement sticks for real users.

Defer non-critical scripts and remove what you don’t need

Find scripts that load on every page but only matter on a few pages (for example, a form library that loads on pages without forms). Load those scripts conditionally.

Then, delay what can wait: chat widgets, heatmaps, some A/B testing tools. You can often improve INP noticeably just by giving the main thread some breathing room during the first few seconds.

Finally, remove dead weight. If a script isn’t used anymore, delete it. This is one of the rare optimizations that is both easy and permanent.

Add explicit dimensions and placeholders to stop layout shifts

For CLS, go through your templates and ensure images, ads, and embeds have reserved space. This is often a straightforward markup or CSS change with immediate benefit.

Pay special attention to content areas where editors can insert images of varying sizes. Consistent patterns (like fixed aspect ratio containers) make CLS control much easier.

Once you’ve fixed the template, spot-check a handful of pages with different content to make sure the solution holds up in real-world publishing scenarios.

Deeper fixes when you’re ready to invest more effort

Modernize the build: ship less CSS/JS per page

If your site ships a large bundle of CSS and JavaScript to every page, you’ll eventually hit a ceiling with quick wins. At that point, the biggest gains come from sending less code per page and loading features only when needed.

This can involve code splitting, removing legacy libraries, replacing heavy plugins, or moving to a more performance-oriented theme or framework. It can also mean rethinking how you handle animations and interactive elements so they rely more on CSS and less on JavaScript.

These changes are usually easier with a team that’s comfortable working across frontend and backend concerns. If you’re planning a rebuild or major refactor, partnering with a web development company can be a practical way to tackle performance, architecture, and maintainability together rather than patching symptoms one by one.

Improve caching strategy and CDN configuration

Strong caching reduces TTFB and speeds up repeat visits. For static assets, set long cache lifetimes and use cache-busting filenames so you can update safely. For HTML, use server-side caching where appropriate and purge caches when content changes.

A CDN can reduce latency for users far from your origin server and offload bandwidth. But configuration matters: make sure the CDN is caching what it should, compressing responses (Brotli where possible), and serving HTTP/2 or HTTP/3.

Also verify that your cache headers are correct. Misconfigured caching is a common reason sites feel slow even on good hosting.

Rethink third-party dependencies and tag governance

When third parties are essential, the goal is to manage them intentionally. Establish rules: what gets loaded on which pages, when it loads, and how it’s monitored. Assign ownership so scripts don’t live forever without review.

Consider server-side tagging for analytics where it makes sense. It won’t solve every performance issue, but it can reduce client-side overhead and improve control.

Most importantly, measure the impact. If a tool adds significant latency and doesn’t produce meaningful business value, it’s worth questioning.

How to validate improvements without chasing scores

Track real-user outcomes alongside metrics

Core Web Vitals are a means to an end: better user experience. Alongside LCP/INP/CLS, track bounce rate, conversion rate, engagement, and lead quality. Often, the biggest business gains come from removing friction during the first interaction—exactly what INP is about.

If you can, segment by device. Mobile improvements often correlate with the largest conversion lifts because mobile users are more sensitive to delays and layout instability.

Over time, you’ll build confidence in which optimizations actually matter for your audience, not just for a benchmark.

Use a test page set and compare before/after consistently

Pick a small set of representative pages (homepage, one service page, one blog post, one landing page) and use them as your benchmark. Test them in the same way each time: same tool, same settings, similar network throttling for lab tests.

When you ship a change, re-test the set and record results. This makes it easier to spot regressions and understand trade-offs (for example, a change that helps LCP but slightly hurts INP).

Then check field data after enough real-user traffic has accumulated. Lab tests are immediate feedback; field data is the final verdict.

A practical checklist you can hand to your team

LCP checklist for most sites

Start with the LCP element and work backward. Make sure it’s not lazy-loaded, that it’s properly sized, and that it can be fetched early. If it’s a background image, consider switching to an inline image element so the browser can prioritize it more effectively.

Then reduce render-blocking resources: streamline CSS, defer non-critical JS, and minimize third-party scripts that compete for bandwidth during the initial load.

Finally, address server response time with caching and CDN improvements so the browser can begin rendering sooner.

INP checklist for interaction-heavy pages

Identify slow interactions by recording performance traces and looking for long tasks around event handlers. Reduce main-thread work by splitting code, removing unnecessary libraries, and deferring third-party scripts.

Keep UI updates fast and predictable. Provide immediate visual feedback on interactions, and avoid triggering large reflows or re-renders for small changes.

Test on real mobile devices when you can. INP problems often hide on a fast desktop but show up clearly on mid-range phones.

CLS checklist for content and marketing-heavy sites

Reserve space for all media and dynamic components. Add width/height or aspect-ratio for images and embeds, and use placeholders for lazy-loaded content.

Stabilize banners and overlays so they don’t push content around after load. Avoid injecting content above what the user is already reading unless it’s triggered by user action.

Audit fonts to reduce layout shifts from swaps, and keep typography assets lean to reduce load timing surprises.

If you work through these fixes methodically—measure, prioritize, implement, validate—you’ll usually see meaningful improvements not just in Core Web Vitals, but in the overall feel of the site. And that’s the part your visitors (and Google) tend to reward.