Skip to main content
Practical guide

Slow LCP: Most Common Causes and How to Fix It in 2026

The 2.5-second threshold that determines whether your page gets seen

Picture this scenario: a user searches for “best running shoes for overpronation,” clicks on your product page, and spends 3.8 seconds staring at a blank screen or a partial layout with no hero image. According to Think with Google data, the probability of that user leaving has already increased by 32% simply because the 3-second mark was breached. That visual element that failed to load in time — the hero image, the main banner, the header video — is precisely what Google measures with LCP.

Largest Contentful Paint is the Core Web Vitals metric that quantifies how long it takes to render the largest visual element visible in the viewport. Google draws a clear line: below 2.5 seconds is good, between 2.5 and 4 seconds needs improvement, and above 4 seconds is poor. In 2026, according to HTTPArchive, only 58% of websites globally achieve an LCP below 2.5 seconds on mobile, meaning 42% are delivering an experience that Google considers subpar or outright deficient.

What matters for SEO is that Google evaluates LCP using real field data — the 75th percentile of visits collected by Chrome UX Report over the last 28 days — and uses it as a ranking signal within its page experience assessment. This is not a theoretical factor: it is a metric that directly influences where your page appears in search results.

Diagnosis: how to identify the LCP element on your page

Before optimizing LCP, you need to know exactly which element is being measured. The most common mistake is assuming that LCP always corresponds to the hero image, when in reality it depends on the content visible in the viewport at the time of load. On a blog page, the LCP element might be the H1 text block. On a product listing, it is usually the main product image. On a landing page, it could be a video or a promotional banner.

Chrome DevTools provides the most direct diagnosis. Open the Performance tab, record a page load, and look for the LCP marker in the Timings section. DevTools identifies exactly which DOM node is the LCP element, how long it took to render, and which resources were on the critical path. This lab-based diagnosis is the starting point, but it does not replace field data.

PageSpeed Insights (pagespeed.web.dev) combines lab data with CrUX field data. The Diagnostics section identifies the LCP element and improvement opportunities ranked by estimated impact. The most valuable metric is the field LCP — the real 75th percentile — because that is what Google uses for ranking.

Google Search Console reports Core Web Vitals status at the domain level, grouping URLs with similar experience. If you see a group of URLs flagged as “Poor” for LCP, they likely share a root cause: the same template, the same unoptimized images, the same slow server.

The Web Vitals Chrome Extension shows LCP in real time while you browse, visually highlighting the measured element. It is the fastest way to verify which element is being evaluated on any page.

A complete diagnosis must cover both desktop and mobile, because the LCP element can vary between devices. An image that ranks as the third-largest element on desktop might dominate the mobile viewport, completely altering the reported LCP.

Cause 1 — Unoptimized LCP images (WebP, preload, srcset)

Images are responsible for 72% of LCP elements across the web, according to an HTTPArchive analysis of 8 million URLs published in 2025. This makes image optimization the highest-impact action for improving LCP on most websites.

Image problems that cause slow LCP fall into four categories:

Wrong format

Serving images as JPEG or PNG when WebP offers a 25-35% size reduction and AVIF offers 40-50% without perceptible quality loss. In 2026, WebP has 97% browser support and AVIF has 92%, which removes the technical excuses for not using them. A European retailer reported that migrating product images from JPEG to WebP reduced the average image weight from 380 KB to 112 KB, improving LCP from 3.2 to 2.1 seconds on 4G connections.

Missing preload

The browser cannot request an image until it discovers the <img> tag or the CSS reference that contains it, which happens after parsing the HTML and potentially after downloading and processing stylesheets. Adding <link rel="preload" as="image" href="hero.webp"> in the <head> allows the browser to begin downloading immediately, without waiting for natural discovery. According to web.dev, preloading the LCP image can save between 200 and 600 ms on typical mobile connections.

No srcset or sizes

Serving the same 1920px image to a 375px mobile device wastes up to 80% of the bandwidth. The srcset attribute with multiple resolutions and sizes with the actual element dimensions lets the browser select the most appropriate image. The WebP + srcset combination is the most complete image optimization available.

Missing dimensions

Images without explicit width and height attributes force the browser to recalculate layout when the image loads, generating not only a delayed LCP but also additional CLS.

Cause 2 — Slow server and high TTFB

Time to First Byte (TTFB) is the time elapsed from when the browser sends the HTTP request to when it receives the first byte of the server response. It is the starting point of the entire loading waterfall: if TTFB is slow, absolutely everything else is delayed proportionally.

Google recommends a TTFB below 800 ms as a target, and web.dev documents it as one of the most determinant sub-metrics of LCP. The reason is mathematical: if the server takes 1,200 ms to respond, the browser has less than 1,300 ms to download, parse, and render all visible content before exceeding the 2.5-second LCP threshold. In practice, achieving a good LCP with that TTFB is nearly impossible.

The causes of high TTFB are varied but well documented. Low-cost shared hosting typically delivers response times between 800 and 2,000 ms during traffic peaks. CMS platforms like WordPress with multiple plugins executing database queries on every request can add 300-800 ms to TTFB. Applications with dynamic rendering that do not implement server-level caching regenerate the entire page on every visit.

Solutions scale in complexity and cost:

CDN (Content Delivery Network)

Distributing content from servers geographically close to the user can reduce TTFB by 100 to 400 ms. Cloudflare, Fastly, and AWS CloudFront are the most common options. For static sites or those with aggressive caching, CDN delivers the best impact-to-cost ratio.

Server-level caching

Implementing full-page cache with Varnish, Redis, or the CDN’s own cache eliminates the need to dynamically generate the page on every request. A WordPress site with WP Super Cache or LiteSpeed Cache can reduce its TTFB from 1,200 ms to 150 ms.

Hosting upgrade

When the server is the real bottleneck — insufficient CPU, limited memory, slow disks — the only solution is migrating to hosting with more resources. VPS instances with NVMe and 4+ GB of RAM typically deliver TTFB consistently below 300 ms.

Static generation (SSG)

For sites whose content does not change on every request — blogs, documentation, catalogs with periodic updates — generating HTML at build time completely eliminates server-side processing. Frameworks like Astro, Next.js (static export), or Hugo deliver TTFB of 20-80 ms from CDN.

Improving overall web performance requires addressing TTFB first, as it sets the performance ceiling for all other optimizations.

Cause 3 — Render-blocking resources (CSS, fonts, JS)

Even with optimized images and a fast TTFB, LCP can remain high if resources on the critical rendering path block the browser. The three resource types that most frequently cause blocking are CSS stylesheets, web fonts, and synchronous JavaScript scripts.

Render-blocking CSS

Stylesheets are render-blocking by default: the browser will not paint any content until it has downloaded and processed all CSS files referenced in the <head>. On sites with multiple CSS files or a single unminified 200+ KB stylesheet, this blocking can add 300-800 ms to LCP. Solutions include: inlining critical CSS (the styles needed for above-the-fold content) in the <head>, loading the rest with media="print" onload="this.media='all'", and removing unused CSS with tools like PurgeCSS. According to web.dev data, critical CSS extraction can reduce LCP by 150 to 500 ms.

Blocking web fonts

Custom fonts are downloaded after the browser processes the CSS that references them. Without the font-display: swap directive, the browser may hide text during font download, causing a flash of invisible text (FOIT) that delays LCP if the main element is text. The swap directive tells the browser to display text with a system font immediately and switch to the custom font when available. Combined with <link rel="preload" as="font" crossorigin>, this configuration can reduce the font impact on LCP by 100-300 ms.

Synchronous JavaScript

Scripts without async or defer attributes block both HTML parsing and rendering. A 150 KB analytics script loaded synchronously in the <head> can delay entire page rendering by 200-500 ms. The solution is loading third-party scripts with defer (executes after parsing) or async (executes when download completes), and moving scripts that are not needed for initial rendering to the end of <body>.

The most effective tool for diagnosing blocking resources is the Coverage tab in Chrome DevTools, which shows exactly how many bytes of each CSS or JS file are actually used during page load. Usage percentages below 30% indicate files that are candidates for optimization or code splitting.

Cause 4 — Incorrect lazy loading on the above-the-fold element

This is the most ironic cause of slow LCP because it originates from a good intention. Lazy loading with loading="lazy" is a legitimate optimization technique that defers loading of off-viewport images until the user scrolls to them, saving bandwidth and accelerating the initial load. The problem arises when it is applied indiscriminately to all images, including the image that serves as the LCP element.

When the loading="lazy" attribute is present on the hero image — the one that typically serves as the LCP element — the browser intentionally excludes it from priority loading. Instead of beginning its download immediately, it waits to confirm that the image is in the viewport, adding a 200-500 ms delay that is added directly to the LCP time.

Google documents this problem explicitly in its LCP optimization guide on web.dev: “Don’t lazy-load images that are in the viewport. This is particularly important for the Largest Contentful Paint element.” The recommendation is clear: the loading="lazy" attribute should never be applied to above-the-fold images, and the LCP element should have loading="eager" (or simply no attribute, since eager is the default behavior) along with fetchpriority="high".

A pattern that repeats across CMSs and frameworks is the automatic application of loading="lazy" to all <img> tags generated by the system. WordPress, for example, added native lazy loading to all images starting with version 5.5, and while later versions excluded the first content image, many themes and plugins override this behavior. Auditing the rendered HTML — not the template source code — is essential for detecting this problem.

The optimal configuration for the LCP image is: WebP or AVIF format, preload with <link rel="preload"> in the <head>, fetchpriority="high" attribute, no loading="lazy", and explicit width and height. This combination ensures the browser prioritizes the LCP image from the very first moment of parsing.

30-minute LCP optimization checklist

This checklist is ordered by descending impact. Each step includes the diagnostic tool and the corrective action. A professional familiar with the tools can complete the entire process in a 30-minute session.

Step 1: Identify the LCP element (2 minutes)

Open Chrome DevTools, navigate to Performance, record a page load, and find the LCP marker in Timings. Note which DOM element is the LCP and what the current time is.

Step 2: Verify image format and size (5 minutes)

If the LCP element is an image, check its format (WebP or AVIF preferred), its weight (target: under 150 KB for mobile hero), and whether it has srcset with multiple resolutions. Use Squoosh (squoosh.app) to compare formats and quality levels.

Step 3: Verify preload and fetchpriority (3 minutes)

Inspect the rendered HTML <head>. The LCP element should have a corresponding <link rel="preload"> if it is an image. The fetchpriority="high" attribute should be on the LCP element tag. Verify that it does not have loading="lazy".

Step 4: Measure TTFB (3 minutes)

In the DevTools Network tab, observe the first HTML document. The “Waiting for server response” timing is your TTFB. If it exceeds 800 ms, the solution requires server caching or a CDN before optimizing other aspects.

Step 5: Audit render-blocking resources (5 minutes)

In PageSpeed Insights, review the “Eliminate render-blocking resources” and “Reduce unused CSS/JS” sections. In DevTools Coverage, identify CSS and JS files with usage below 30%.

Step 6: Verify web fonts (3 minutes)

Check that all @font-face declarations include font-display: swap. Verify whether fonts have preload. Consider using system fonts for above-the-fold content.

Step 7: Measure the result (5 minutes)

Repeat the measurement in DevTools and verify the LCP. Compare with the initial measurement. For field data, CrUX updates take 28 days, but PageSpeed Insights provides an immediate estimate based on lab data.

Step 8: Document and monitor (4 minutes)

Record the changes made, the before-and-after LCP values, and configure alerts in Google Search Console to detect future regressions in Core Web Vitals.

LCP optimization is not a one-time project but an ongoing process. Every content update, every new third-party script, every hosting change can affect LCP. Incorporating Core Web Vitals verification into the deployment workflow — automated with Lighthouse CI or Web Vitals Reporter — is the most reliable way to maintain performance long term.

What causes a slow LCP?

The most common causes of a slow LCP are: unoptimized hero images without preload (responsible for 70% of LCP issues), high TTFB from slow servers, render-blocking CSS and JavaScript resources, web fonts without font-display: swap, and lazy loading incorrectly applied to the above-the-fold element.

Sources and references

  1. LCP (web.dev)
  2. Optimize LCP (web.dev)
  3. Chrome DevTools Performance (developer.chrome.com)

FAQ about slow LCP causes and fixes

What is a good LCP score according to Google?

Google defines a good LCP as under 2.5 seconds. Between 2.5 and 4 seconds is classified as needs improvement, and above 4 seconds is poor. These thresholds are measured using real-world field data through the Chrome UX Report (CrUX), not lab tools. The 75th percentile of actual visits over the last 28 days is the value Google uses to evaluate the page.

How does LCP affect search rankings?

LCP is one of three Core Web Vitals that Google has used as a ranking signal since 2021. It is not the most decisive factor — content relevance remains the priority — but in competitive scenarios where two pages have similar content and authority, the one with better LCP has an advantage. Additionally, a slow LCP increases bounce rates, indirectly affecting engagement metrics that Google monitors.

Can LCP be improved without changing servers?

Yes, in most cases. The highest-impact optimizations do not depend on the server: compressing images to WebP or AVIF, preloading the LCP image, removing render-blocking CSS, using font-display: swap, and removing lazy loading from the above-the-fold element. Only when TTFB consistently exceeds 800 ms is a server change or CDN implementation likely needed.