Technical SEO

LCP Optimization Guide: How to Fix Slow Largest Contentful Paint

By Reviewed by Hawrry Bhattarai
August 15, 2026 13 min read
Contents
TL;DR — the short answer

Diagnose and fix slow LCP step by step. Covers hero image optimization, server response time, render-blocking resources, and preload hints with real benchmarks.

13 min read · Technical SEO · Last updated July 2026

Quick answer: LCP measures how long the largest visible element takes to appear. Fix it by eliminating render-blocking resources, preloading the LCP image, compressing and right-sizing images, and reducing server response time below 600ms.

Introduction

Slow LCP is the most common Core Web Vitals failure. Google’s own CrUX data shows that roughly 45% of origins fail the 2.5-second Good threshold on mobile. In markets with mixed connection quality — Nepal, India, Southeast Asia — that number climbs even higher.

The frustrating part is that LCP failures are almost always fixable without a platform migration or major rebuild. They come down to a predictable set of root causes: oversized images, missing preload hints, slow server response, and JavaScript that blocks the browser before the LCP element can even start loading.

This guide walks through every common LCP cause, how to confirm it is contributing to your failure, and the specific fix for each.

What you’ll learn:
– How to identify your LCP element in Chrome DevTools
– The four phases of LCP and which one is hurting you most
– Image optimization that actually moves the needle
– Server response time targets and how to hit them
– How to use preload hints correctly without causing other regressions


Table of Contents

  1. Understanding LCP: What It Measures
  2. How to Find Your LCP Element
  3. The Four LCP Sub-Phases
  4. LCP Element Types and Their Implications
  5. Hero Image Optimization
  6. Server Response Time (TTFB)
  7. Render-Blocking Resources
  8. Preload Hints and Resource Prioritization
  9. LCP on JavaScript-Heavy Sites
  10. Verifying Your Fixes in the Field
  11. Frequently Asked Questions

Understanding LCP: What It Measures

LCP marks the point in time when the browser renders the largest image or text block visible in the viewport. “Largest” is defined by rendered size — the element with the greatest area on screen, not the largest file size or the most prominent visually.

This matters because the LCP element can change between page variants. On desktop, your LCP might be a 1200×500px hero image. On mobile, where the hero is cropped and a large <h1> heading is visible above the fold, the heading becomes the LCP element. They require different fixes.

LCP thresholds (75th percentile of field data):
– Good: ≤ 2.5s
– Needs Improvement: 2.5s – 4.0s
– Poor: > 4.0s

A site that scores 2.6 seconds in lab conditions may still fail at the 75th percentile in the field if 25% of users are on connections under 10 Mbps. Always anchor your diagnosis to field data.


How to Find Your LCP Element

Open Chrome DevTools (F12), go to the Performance tab, and click Record. Reload the page, then stop the recording. In the “Timings” row at the top of the timeline, click the “LCP” marker. The element box at the bottom will show you exactly which DOM element was the LCP element for that specific load.

An even faster method: open PageSpeed Insights on your URL, scroll to the “Diagnostics” section, and look for “Largest Contentful Paint element.” It shows the specific HTML element Google identified as LCP for your page.

Common LCP elements by site type:
E-commerce product pages: hero product image (<img> inside a featured image container)
Blog posts: featured image or the first large block of text
Landing pages: full-width background image or large <h1> headline
News sites: article thumbnail or headline

Once you know the LCP element, the rest of your diagnosis is targeted at that specific resource.


The Four LCP Sub-Phases

Google’s web performance team has broken LCP into four measurable sub-phases. Understanding which phase is eating your time tells you exactly where to fix.

Phase 1: Time to First Byte (TTFB)
From navigation start to when the browser receives the first byte from the server. Target: under 800ms. If your TTFB is above 800ms, the LCP race is already lost before any resource has loaded.

Phase 2: Resource Load Delay
Time between TTFB and when the browser starts loading the LCP resource. This is typically caused by render-blocking scripts or stylesheets discovered before the LCP image in the HTML, or by an LCP image that is lazy-loaded or only referenced in CSS. Target: under 200ms.

Phase 3: Resource Load Duration
The actual time to download the LCP resource. This is determined by file size and connection speed. A 400KB WebP image on a 10 Mbps connection takes about 300ms. A 1.2MB JPEG takes nearly 1 second. Target: under 500ms.

Phase 4: Element Render Delay
Time between when the LCP resource finishes loading and when the element appears on screen. Usually caused by main-thread blockage from heavy JavaScript. Target: under 50ms.


LCP Waterfall Timeline

Click a scenario to see how the four LCP phases compare. Numbers reflect typical mobile 4G conditions.




Hero Image Optimization

The LCP element on most sites is an image. Image optimization is therefore the single highest-leverage LCP fix.

Format: Convert to WebP. WebP typically reduces file size by 25–35% compared to JPEG at equivalent visual quality, and 50–60% compared to PNG for photographic images. AVIF is even more efficient but lacks broad enough browser support to use as a primary format — use it as a progressive enhancement with WebP fallback.

<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg" alt="Hero image" width="1200" height="600" fetchpriority="high">
</picture>

Size: Never serve an image larger than its display size. A hero image displayed at 800px wide does not need a 1600px source file — not even for retina displays. Use a 1200px or 1600px source for high-DPI screens but deliver it compressed. Use srcset with multiple resolutions so mobile devices download smaller files.

fetchpriority=”high”: This attribute tells the browser to prioritize the LCP image over other resources discovered at the same time. Without it, the browser uses heuristics that sometimes delay LCP image loading by 200–400ms. Add it to your LCP <img> tag. Do not add it to multiple images — it dilutes the signal.

Lazy loading: Do not lazy-load your LCP image. loading="lazy" delays loading until the image is near the viewport. If the image is already in the viewport, lazy loading it paradoxically makes LCP worse. Reserve lazy loading for images below the fold.

Real benchmark: an Australian hotel booking site had a 3.8s LCP driven by a 1.4MB JPEG hero. After converting to WebP (290KB), adding fetchpriority="high", and removing loading="lazy" from the hero, LCP dropped to 2.1s. No server changes, no code changes.


Server Response Time (TTFB)

Target TTFB below 800ms. Above that, your LCP cannot reach Good status no matter how optimized your images are — you have already spent a third of your 2.5s budget before the browser has even received the HTML.

Hosting quality: Shared hosting on oversold servers commonly delivers TTFB of 1.5–3 seconds. Moving to a managed WordPress host (Kinsta, WP Engine, Cloudways) or a VPS with proper caching reduces TTFB to 200–500ms for most sites. This single change often has more impact than all other LCP fixes combined.

Page caching: For CMS-based sites, full-page caching is non-negotiable. A cached page response is delivered in under 50ms. An uncached PHP/WordPress page rendering database queries on each request takes 400–1200ms.

CDN: A CDN reduces TTFB by serving content from a location geographically closer to your users. For a site hosted in Singapore targeting users in Nepal, Australia, and the UAE simultaneously, a CDN is the only way to deliver consistently low TTFB to all three markets. Cloudflare, Fastly, and AWS CloudFront are the most common choices.

Database query optimization: For dynamic sites, slow TTFB is often a symptom of unoptimized database queries. Use New Relic or Query Monitor (WordPress) to identify N+1 queries and missing indexes.


Render-Blocking Resources

The browser cannot start rendering the page until it has processed all render-blocking resources. These are typically CSS files in the <head> and synchronous JavaScript files.

Identify render-blocking resources: In PageSpeed Insights, the “Eliminate render-blocking resources” diagnostic lists every resource that delayed the First Contentful Paint. Everything on that list is potentially delaying your LCP.

CSS: Inline critical CSS — the styles needed to render above-the-fold content — directly in <style> tags in the <head>. Load the full stylesheet asynchronously afterward. Tools like Critical CSS generators can automate this. Typical impact: 200–600ms improvement.

JavaScript: Move <script> tags to the bottom of the <body>, or use defer and async attributes. A defer script does not block HTML parsing but executes after the document is parsed. An async script loads in parallel and executes as soon as it is ready — useful for independent scripts like analytics tags.

<!-- Blocks rendering — avoid for non-critical scripts -->
<script src="analytics.js"></script>

<!-- Better: defers execution until after HTML parsing -->
<script src="analytics.js" defer></script>

Preload Hints and Resource Prioritization

<link rel="preload"> tells the browser to fetch a resource early, before the parser would normally discover it. For an LCP image that is referenced in CSS (as a background image) or loaded dynamically, the browser cannot discover it until it has processed the CSS or JavaScript. A preload hint fixes this.

<!-- In <head>, before any stylesheets or scripts -->
<link rel="preload" as="image" href="/images/hero.webp" type="image/webp">

Use preload for: your LCP image (if it is not referenced directly in HTML), web fonts used in above-the-fold text, critical JavaScript chunks.

Do not overuse preload. Every preloaded resource competes for bandwidth with other critical resources. Preloading five images simultaneously can slow LCP by creating bandwidth contention. Be selective — preload only the LCP resource and perhaps one or two critical fonts.


LCP on JavaScript-Heavy Sites

React, Vue, and Next.js apps present a unique LCP challenge. Server-side rendering (SSR) and static generation (SSG) help significantly, but client-side hydration can still delay the element render phase.

Common issues on SPA-based sites:
– Hero image is rendered by a JavaScript component that loads after the initial HTML response — the browser cannot preload it because it does not appear in the HTML source
– Large JavaScript bundles block the main thread, delaying element render after the image has already loaded
– Client-side routing replaces the initial page with a JS-rendered version, resetting the LCP clock

Fixes: use Next.js <Image> component with priority={true} on hero images (it adds the preload hint automatically), code-split aggressively to reduce initial bundle size, and use React Server Components where possible to reduce hydration work.


LCP Element Type Identifier

Select your LCP element type to see the most common causes and targeted fixes.





Verifying Your Fixes in the Field

After deploying LCP fixes, verify them in this order:

  1. Immediately: Run PageSpeed Insights on the affected URL. Check the lab data LCP. You should see improvement within minutes of deployment.

  2. After 24-48 hours: Use the Web Vitals Chrome Extension on the live URL. Browse the page as a real user — this gives you real-environment readings.

  3. After 28 days: Check Google Search Console’s Core Web Vitals report and CrUX API for the affected URLs. This is the field data that affects rankings.

Set up Search Console Core Web Vitals alerts so you get notified if CWV status regresses. A CDN misconfiguration, a new plugin, or a third-party script update can quietly break your hard-won LCP improvements.

Key takeaway: The LCP sub-phase breakdown in PageSpeed Insights tells you exactly where your seconds are going. Fix the largest phase first — do not optimize images if your TTFB is 2.5 seconds.


Frequently Asked Questions

What is a good LCP for mobile vs desktop?
The threshold is the same: under 2.5 seconds for Good. But mobile field data is almost always slower because of device limitations and network conditions. Focus your optimization effort on mobile first — it usually needs more work and carries more ranking weight due to mobile-first indexing.

My LCP element is different on mobile and desktop. Which do I optimize for?
Optimize for mobile first, since Google’s ranking uses mobile field data for most sites. But confirm your LCP element on both viewports using Chrome DevTools device emulation — the fixes may differ, and you should address both.

Does CDN alone fix LCP?
A CDN primarily fixes TTFB (Phase 1). If your LCP is failing primarily because of image size (Phase 3) or render-blocking resources (Phase 2), a CDN alone will not move you into the Good range. Most sites need fixes at multiple phases.

What image format should I use for LCP images in 2026?
WebP for broad compatibility. AVIF where browser support allows (Chrome, Firefox, and Safari all support it now). Use a <picture> element with AVIF and WebP sources and a JPEG fallback. The AVIF vs WebP size difference is typically 15–20%, worthwhile for large hero images.

Can lazy loading hurt LCP?
Yes, significantly. If loading="lazy" is applied to your LCP image, the browser delays loading it until it is near the viewport — but it is already in the viewport. This is a common misconfiguration in themes and page builders that apply lazy loading globally. Remove loading="lazy" from any image visible above the fold.

My LCP is 2.3s in Lighthouse but 3.8s in field data. Why?
Lighthouse runs under controlled lab conditions (simulated network throttling, fresh cache). Field data reflects real users, including those on slower connections, older devices, or geographically distant from your server. The 75th percentile field measurement is specifically designed to capture your worst-performing quartile.


Conclusion

LCP is the most tractable of the three Core Web Vitals. The fix is almost always some combination of better hosting (lower TTFB), image optimization (smaller files, better format), preload hints (earlier resource discovery), and eliminating render-blocking resources. Most sites can achieve Good LCP status with 2–3 targeted changes.

The key is diagnosing which of the four phases is costing you the most time before touching anything. A site with 2.5-second TTFB needs a hosting or caching fix first. A site with 50ms TTFB and 1.5-second resource load duration needs image optimization. Work from the timeline, not from generic best-practices lists.


Let Ignited Nepal Handle This

We audit LCP sub-phases for clients across Nepal, Australia, and beyond — delivering specific, prioritized recommendations your developer can implement in a sprint.

→ Request a Free Technical SEO Audit


Written by the Ignited Nepal SEO team. We build organic search systems for businesses across Nepal, Australia, UAE, USA, UK, and beyond. ignitednepal.com

NR

Article by

Niraj Raut

Head of Search at Ignited Nepal. Drove 340% organic traffic growth for EzyDog (Australia), 4× revenue for The Turf Man (Australia), and 120% month-on-month traffic growth for ThemeGrill (Nepal). Keynote speaker at WordCamp Nepal 2023 and verified WordPress.org open-source contributor.