Website Performance & Core Web Vitals

LCP Optimization: Hero to Render in Under 2.5s

LCP is the ranking signal Google has invested the most in. A score above 4 seconds is a confirmed Page Experience penalty. The optimizations that move LCP are counterintuitive and well-understood — here is the fix sequence in priority order.

Good

≤ 2.5s

Needs Improvement

2.5 – 4.0s

Poor

> 4.0s

LCP Fix Sequence: Priority Order

01

Reduce TTFB with Edge Caching

Up to 1,500ms improvement

TTFB is the upstream bottleneck for LCP. Use a CDN with edge caching (Cloudflare, Vercel Edge, Fastly) to serve the HTML response from a node ≤ 50ms from the user. For dynamic content, use ISR (Incremental Static Regeneration) or stale-while-revalidate to cache the HTML for repeat requests.

02

Preload the LCP Image

200–800ms improvement

Add a <link rel='preload'> for the LCP image in the <head>. This tells the browser's preload scanner to discover and download the image before the CSS or JS that would otherwise reference it has executed.

<link rel="preload" as="image"
  href="/hero.avif"
  fetchpriority="high" />
03

Use AVIF / WebP Format

30–60% payload reduction

AVIF achieves 40-60% smaller file sizes than JPEG at equivalent quality. WebP achieves 25-40% savings. Smaller file size means faster download on any connection. Use <picture> with source elements for AVIF → WebP → JPEG fallback.

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

Remove Render-Blocking Resources

100–500ms improvement

CSS in <head> is render-blocking by default. JavaScript that executes before painting pauses the browser's main thread. Inline critical CSS (above-the-fold styles). Defer non-critical CSS. Move JS to the end of body or use async/defer attributes.

<!-- Defer non-critical JS -->
<script defer src="analytics.js"></script>

<!-- Inline critical CSS -->
<style> /* above-fold CSS here */ </style>

<!-- Defer non-critical CSS -->
<link rel="preload" as="style"
  href="non-critical.css"
  onload="this.rel='stylesheet'" />

Murkuz AI SEO Scorecard Criteria

Target Score: 95/100

Hero Preloading

The LCP image has a corresponding <link rel='preload' fetchpriority='high'> in the document <head> for every key page template.

Eager Loading

The LCP image does NOT have loading='lazy' or any deferred loading attribute — it loads immediately on parse.

TTFB ≤ 800ms

Server response time for the HTML document is under 800ms at the 75th percentile — prerequisite for achieving Good LCP.

Frequently Asked Questions

What elements can be the LCP element on a page?

Google's algorithm considers these element types as candidates for the LCP element: <img> tags (including poster frames of <video> elements), CSS background images loaded via url(), <video> elements with a poster attribute, and large block-level text elements (headings, paragraphs). The browser identifies the largest element in the viewport at each rendering frame and reports the most recent one when user interaction ends. On most landing pages, the LCP element is the hero image or the primary H1 heading.

Why should I never use loading='lazy' on the LCP image?

The loading='lazy' attribute instructs the browser to defer downloading an image until it enters (or is about to enter) the viewport. For below-the-fold images, this is a significant performance win. For the LCP image — which is above the fold by definition — lazy loading is catastrophic: it delays the most critical image load until after the initial rendering has already requested it, adding hundreds to thousands of milliseconds to your LCP score. Always use loading='eager' (the default) or simply omit the loading attribute entirely for LCP images.

What is fetchpriority='high' and when should I use it?

fetchpriority is an HTML attribute (and HTTP header mechanism) that allows you to signal to the browser that a specific resource should be fetched with higher priority than the browser's default heuristics would assign. For the LCP image, add fetchpriority='high' to the <img> tag alongside a <link rel='preload'> in the <head>. This combination tells the browser to: (1) discover the image early via the preload hint, and (2) prioritize its download above other network requests. This is the most impactful single-change optimization available for LCP scores on image-heavy pages.

How much does TTFB (Time to First Byte) affect LCP?

Critically. TTFB is the time from when the browser sends a request to when it receives the first byte of the HTML response. Since LCP cannot start until HTML is received, a TTFB of 1,500ms mathematically prevents any LCP score below 1,500ms — making a Good LCP (≤2.5s) nearly impossible. The Google-recommended TTFB target for a Good LCP is ≤ 800ms. The primary TTFB optimizations are: edge caching (Cloudflare Workers, Vercel Edge, Fastly), CDN proximity, and server-side render (SSR) vs. client-side render (CSR) architecture decisions.

Written by Junaid Khalid

Is your LCP image slowing your rankings? Audit LCP across every page.

Murkuz automatically detects LCP elements across all your page templates, flags missing preload hints and incorrect lazy loading, and reports your real-user LCP CrUX distribution.