Blog/LCP: Why Your Score Keeps Failing in Production
Frontend

LCP: Why Your Score Keeps Failing in Production

LCP under 2.5s is Google's threshold for a fast page. Here's what actually tanks it — and how to find the real bottleneck before your users do.

29 March 2026·6 min read

Largest Contentful Paint measures how long it takes for the biggest visible element to finish rendering. Google uses it as a ranking signal. Your users feel it on every page load. And if you're not actively measuring it, you're probably failing it.

The LCP Thresholds You Need to Know

2.5s
Good LCP — Google's threshold for a fast page experience
web.dev/lcp
51%
of mobile websites achieve good LCP (under 2.5 seconds)
HTTP Archive Web Almanac 2022
72%
of LCP elements on mobile pages are images
HTTP Archive Web Almanac 2022
Performance analytics dashboard on a laptop screen showing website metrics and graphs
Photo by Luke Chesser on Unsplash

The 2.5-second threshold is based on 75th percentile data across billions of Chrome sessions. Under 2.5s is good. Between 2.5s and 4s needs improvement. Above 4s is poor. Nearly half of all mobile pages are currently failing.

Google's measurement is strict: 75% of your users' page loads must hit the threshold. One slow server region or one heavy image that only affects mobile is enough to drag your whole score into the red.

Why Images Are Your Biggest LCP Problem

On 72% of mobile pages, the LCP element is an image — your hero shot, product photo, or above-the-fold illustration. Text-based LCP elements load nearly twice as fast at the 75th percentile: 388ms for text vs 744ms for images.

The highest-impact fix available right now: preload your LCP image. Only 0.56% of mobile pages do this. A single `<link rel='preload' as='image'>` in your document head lets the browser start fetching the image before it parses the rest of the HTML. Hundreds of milliseconds, one line of markup.

The API Latency Connection

If your LCP element depends on a data fetch — a personalized hero, a product image URL returned from your API, a user-specific banner — your backend latency sets the floor on your LCP time. The browser cannot start loading the image until your API responds.

On pages with poor LCP, client-side loading delays average 1,290ms at the 75th percentile. That's more than half your entire LCP budget consumed before a single pixel renders.

Server rack with blinking indicator lights representing backend infrastructure
A slow API response is often the invisible ceiling on your LCP score.

Finding Which Routes Are Killing Your LCP

The problem with LCP debugging is that Lighthouse gives you a score, not a cause. You need to know which specific API route is slow and at which percentile — not a lab average, but what real users hit at P95.

typescript
// Backend: instrument your API routes in one line
import { express as statvisor } from "@statvisor/sdk";

app.use(statvisor({ apiKey: process.env.STATVISOR_API_KEY }));

// Frontend: measure LCP and Core Web Vitals from real sessions
import { initStatvisor } from "@statvisor/sdk/browser";

initStatvisor({ frontendKey: "vl_fe_your_key_here" });

Statvisor tracks P50/P95/P99 latency per backend route and measures Core Web Vitals — including LCP — from real user sessions. You can see exactly which API call is adding time before your LCP element renders.

LCP Fix Checklist

  • Preload your LCP image with `<link rel='preload' as='image' href='...'>` — this is the single highest-leverage change for most sites
  • Serve images in WebP or AVIF — together they represent under 5% of LCP images despite being 2–3x smaller than JPEG
  • Make your LCP element statically discoverable — if it's rendered client-side after a fetch, the browser preload scanner can't find it
  • Measure P95 latency on any API route that feeds above-the-fold content — if it's over 300ms, it's eating your LCP budget
  • Check your TTFB — if the server is slow to respond, LCP can't start until it does

Ready to monitor your API in production?

Statvisor gives you latency percentiles, error rates, and request volume for every route — in minutes, not days.

Get started free →