onezlabs

0%

SEO

How to Improve Website Speed and Core Web Vitals in 2026

A practical guide to diagnosing and fixing slow website performance – covering LCP, INP, CLS, image optimization, JavaScript reduction, and server response time.

July 26, 202610 min read
#Website Speed#Core Web Vitals#LCP#Performance#Next.js#WordPress
How to Improve Website Speed and Core Web Vitals in 2026

Website speed is no longer just a user experience concern – it is a direct Google ranking factor and a measurable revenue driver. A site that loads in 1 second converts 3x better than one that loads in 5 seconds. This guide covers the complete diagnostic and remediation process for website speed in 2026, including platform-specific fixes for WordPress and Next.js.

Why Speed Matters for Rankings and Revenue

Google uses Core Web Vitals as a ranking signal in its Page Experience system. Pages that pass all three Core Web Vitals thresholds (LCP under 2.5s, INP under 200ms, CLS under 0.1) receive a ranking boost relative to pages that fail. The effect is not massive in absolute terms, but it is a tiebreaker – when two pages have similar content quality and authority, the faster one ranks higher.

The revenue impact is better documented than the ranking impact. Google's own research shows that every 100ms improvement in load time correlates with a 0.3–1% improvement in conversion rate. For e-commerce stores, Deloitte found that a 0.1-second improvement in mobile speed increased conversions by 8.4%. For service businesses, faster sites reduce bounce rate, which increases the number of users who reach the contact form.

The website speed optimization service handles the full diagnostic and fix process described in this guide for sites that need professional implementation. For sites where speed is part of a broader SEO strategy, the technical SEO service covers both.

How to Diagnose a Slow Website

Start with PageSpeed Insights (pagespeed.web.dev). Enter your URL and note both the Field Data (CrUX – real user data aggregated over 28 days) and the Lab Data (Lighthouse – synthetic test from Google's servers). Field data is what affects rankings. Lab data is what you can control and improve immediately. A large gap between the two (good lab data, poor field data) usually means a geographic CDN issue or mobile-specific problems.

For deeper diagnosis, use the Chrome DevTools Performance panel. Record a page load, identify the LCP element in the Timings section, and trace what is blocking it. The Waterfall chart in the Network panel shows exactly which resources are loading, in what order, and how long each takes. Look for: render-blocking scripts in the head (scripts loaded without async or defer), large CSS files, image resources without preload hints, and third-party scripts loaded synchronously.

Check CrUX field data at scale using the Chrome UX Report (CrUX) in Google Search Console under "Core Web Vitals." This shows the percentage of your real users experiencing good, needs improvement, or poor scores for each metric. Focus remediation on the pages with the most traffic and the worst scores first.

Fixing LCP (Largest Contentful Paint)

LCP is the most impactful metric for both rankings and user experience. The LCP element is almost always a hero image, a large hero text block, or a video poster frame. The first step is to identify your LCP element: use the Core Web Vitals panel in Chrome DevTools (Ctrl+Shift+P, type "Core Web Vitals") and look for the element labeled "LCP."

If your LCP element is an image, the most impactful fixes are: (1) Add a preload hint in the HTML head – <link rel="preload" as="image" href="/hero.webp" fetchpriority="high">. This tells the browser to start downloading the image immediately rather than waiting for the CSS parser to discover it. (2) Serve the image from a CDN. Images served from a CDN edge node close to the user load 2–5x faster than images served from an origin server in a different country. (3) Convert the image to WebP or AVIF format. WebP is 25–35% smaller than JPEG at equivalent quality. AVIF is 50% smaller but has slightly lower browser support (still 94%+ as of 2026). (4) Use correct image dimensions – serve an image sized to its display dimensions, not a 4000px original that the browser scales down in CSS.

If your LCP element is a text block, slow LCP usually means render-blocking resources (scripts or stylesheets in the head) are delaying when the browser first paints anything. Audit your head section and move non-critical scripts to the footer or add defer/async attributes. Eliminate or inline critical CSS and defer non-critical stylesheet loading.

Fixing CLS (Cumulative Layout Shift)

CLS above 0.1 is usually caused by one of four things. First, images without explicit width and height attributes. When the browser loads an image without knowing its dimensions, it cannot reserve space for it – when the image loads, it pushes all the content below it down. Fix: always add width and height to every img tag. In CSS, you can use aspect-ratio to achieve the same effect for responsive images.

Second, web fonts causing FOUT (Flash of Unstyled Text). When a custom font loads, it can cause text to reflow if the fallback font has different metrics. Fix by adding font-display: optional (prevents FOUT entirely by only using the web font if already cached) or font-display: swap with size-adjust to match the fallback font metrics. The @font-face size-adjust descriptor, now supported in all major browsers, lets you adjust the scale of a fallback font to match the web font – eliminating layout shift when the web font loads.

Third, dynamically injected content (cookie banners, chat widgets, newsletter popups) that loads above existing content. Fix by reserving space in the layout before the dynamic content loads, or by injecting the content at the bottom of the page rather than at the top.

Fourth, ads that change size after loading. Fix by giving ad containers explicit min-height values matching your smallest expected ad unit, so smaller ads do not cause the container to collapse and expand.

Fixing INP (Interaction to Next Paint)

INP replaced FID (First Input Delay) as a Core Web Vitals metric in March 2024. Where FID measured only the delay before the browser responds to the first interaction, INP measures the actual rendering latency across all interactions throughout the page lifecycle. This makes it significantly harder to pass – a click that triggers a slow JavaScript function can fail INP even if FID was fine.

The root cause of poor INP is always JavaScript blocking the main thread. Fixes: (1) Code splitting – use dynamic import() to load JavaScript only when it is needed. A product filter that loads 200KB of JavaScript on page load is a classic INP problem. Load that JavaScript when the user first interacts with the filter. (2) Defer non-critical third-party scripts. Chat widgets, marketing pixels, and analytics scripts often block the main thread. Load them after the page is interactive using setTimeout or requestIdleCallback. (3) Break up long tasks. JavaScript tasks over 50ms block the main thread and cause INP failures. Use scheduler.yield() or setTimeout(0) within long loops to yield control back to the browser between chunks of work. (4) For React applications, use useTransition and startTransition to mark non-urgent state updates and prevent them from blocking interactive updates.

Image Optimization Deep Dive

Images are the single largest contributor to page weight and LCP on most websites. The optimization stack: (1) Format – use WebP for broad compatibility, AVIF for maximum compression (offer both via srcset with format negotiation or a CDN that serves the right format per browser). (2) Compression – lossy compression at 80–85% quality for photographs, lossless for graphics with flat colors. Tools: Squoosh (browser-based, free), imagemin (Node.js), or Sharp (Node.js, production pipeline). (3) Sizing – serve images at the exact display size. Use srcset to serve different sizes for different viewport widths. (4) Lazy loading – add loading="lazy" to all images below the fold. Never lazy-load the LCP image – it will make LCP worse. (5) Explicit dimensions – always set width and height attributes to prevent CLS.

For the full stack web development projects, image optimization is built into the build pipeline using Sharp and automated srcset generation, achieving 90+ Lighthouse scores by default.

WordPress-Specific Speed Fixes

WordPress is inherently slower than static site generators because it generates pages dynamically from a database on each request. The key to fast WordPress is aggressive caching to serve static HTML and offloading heavy assets to a CDN. Recommended stack: WP Rocket or LiteSpeed Cache for full-page caching, Cloudflare or BunnyCDN for CDN and image optimization, and Short Pixel or Imagify for automatic WebP conversion on image upload.

WP Rocket configuration that matters most: enable page caching with cache pre-loading, enable GZIP compression, enable file optimization (combine and minify CSS/JS but test each option individually as plugins sometimes break), enable LazyLoad for images and iframes, and enable database optimization to run weekly cleanup. For LCP specifically, enable "Load critical CSS separately" and add your LCP image URL to the preload list. Disable WP Rocket's JavaScript defer for any scripts that break your theme.

Hosting choice has an outsized impact on WordPress speed. Shared hosting caps PHP workers at 1–2 per account, which means concurrent visitors queue. On managed WordPress hosting (Kinsta, WP Engine, Flywheel) or a VPS with LiteSpeed, PHP workers scale with traffic. Upgrade hosting before investing in caching plugins if your TTFB (Time to First Byte) is consistently above 800ms – no cache plugin can fix a slow server.

Next.js Performance Optimizations

Next.js provides excellent performance by default through static generation, automatic code splitting, and the built-in Image component. The key is using the platform correctly rather than fighting it. Use next/image for all images – it handles format selection, lazy loading, srcset generation, and prevents CLS automatically. Never use raw img tags for content images in a Next.js application.

For LCP optimization in Next.js, add priority prop to the hero image component: <Image src="/hero.webp" priority />. This adds the fetchpriority="high" attribute and a preload link, which is the correct fix for LCP in Next.js. Bundle analysis with @next/bundle-analyzer should be run before every major deployment to identify unexpectedly large imports. Common culprits are moment.js (replace with date-fns), full lodash imports (use tree-shaken individual function imports), and large charting libraries loaded on pages that do not need them.

Use next/font for font loading instead of Google Fonts @import. Next.js font optimization downloads fonts at build time and serves them from your own domain, eliminating the external round-trip and the render-blocking Google Fonts DNS lookup. This alone typically improves LCP by 0.3–0.8 seconds on sites using Google Fonts.

Frequently Asked Questions

What Lighthouse score should my website have?

Aim for 90+ on both mobile and desktop. A score below 50 on mobile indicates serious performance problems that will hurt rankings. For e-commerce sites, each 1-second improvement in load time correlates with 7% more conversions.

What is LCP and how do I fix it?

LCP (Largest Contentful Paint) measures how long it takes for the largest visible element to render &ndash; usually a hero image or heading. Fix it by preloading the hero image, using a CDN, and removing render-blocking scripts above the fold.

WordPress vs Next.js for website speed?

An optimized Next.js site scores 90&ndash;98 on Lighthouse by default. WordPress needs WP Rocket + Cloudflare + image optimization to reach 80&ndash;90. Next.js serves pre-rendered static HTML from CDN edge nodes; WordPress generates pages dynamically on each request.

Share:TwitterLinkedIn

Get the newsletter

Practical articles on AI development, full stack engineering, and WordPress — delivered whenI publish, not on a schedule. No spam, ever.

JO

Johnbert Oñez

AI Solutions Engineer & Full Stack Developer

Johnbert builds AI systems, web applications, and WordPress solutions for clients worldwide. Based in Davao City, Philippines. 6+ years, 50+ projects.

More Like This

Enjoyed the article? Let's build something together.

From AI chatbots to SaaS products — I turn ideas into working software. Based in Davao City, available worldwide.