Lighthouse scores are a lab number. Here is what actually determines the load experience on a mid-range phone, in the order worth fixing it.
AmImA Team
9 May 2026 · 8 min read

Core Web Vitals conversations usually start with a Lighthouse score and end with an argument about whether it matters. The score is a lab simulation. What matters is field data — what real customers on real phones experience — and it is measured by three numbers.
LCP (Largest Contentful Paint) — when the biggest thing above the fold finishes rendering. Target under 2.5s. On ecommerce this is almost always the hero image or the product image.
CLS (Cumulative Layout Shift) — how much the page moves around while loading. Target under 0.1. Causes mis-taps and makes a site feel cheap.
INP (Interaction to Next Paint) — how long the page takes to respond to a tap. Target under 200ms. Usually a JavaScript problem.
On a Shopify store the LCP element is the hero or the first product image, and the fix is almost always about bytes and timing.
Serve modern formats. A 2MB JPEG hero becomes 40-60KB as AVIF at the same visual quality. This is usually the single biggest win available and it requires no design change.
Serve the right size. A phone at 390px wide does not need a 2000px image. Responsive srcset with real breakpoints means the phone downloads a phone-sized file.
Do not lazy-load the hero. Lazy loading is right for everything below the fold and wrong for the LCP element — it delays the exact thing being measured. Mark it fetchpriority="high" and load it eagerly.
Do not put the LCP image behind JavaScript. A hero inside a slider that initialises on load cannot start downloading until the script runs. Render the first slide in HTML.
Layout shift comes from content arriving without a reserved slot.
Images without dimensions. Every image needs width and height attributes or an aspect-ratio in CSS. Without them the browser reflows when the image arrives.
Late-arriving banners and app widgets. Announcement bars, cookie notices, review widgets, and express-payment buttons all commonly inject themselves and push content down. Reserve the height in the initial layout.
Fonts. This one is subtle and costs real CLS: if the webfont has different metrics from the fallback, headings rewrap when it loads. A heading that fits on one line in the fallback and two in the real font moves everything below it. Use a size-adjusted fallback, and reserve a minimum height on display headings that sit near a wrapping boundary.
INP is dominated by third-party scripts competing for the main thread.
The usual offenders, in rough order of cost: review widgets, chat, analytics stacks with several tags, personalisation, and upsell apps that run on every page.
Three moves:
Take a product page, record the network waterfall, and attribute every request to its source. Most stores are surprised: a third or more of the page weight is apps, and a meaningful share is apps that produce no measurable revenue.
The exercise is worth doing annually. Uninstall in a staging theme, measure, and only keep what pays for itself.
Lighthouse on a developer's laptop tells you almost nothing about your customers. Use field data:
Segment by template. Home, collection, product, and cart fail for different reasons and averaging them hides all of it.
The ranking effect of Core Web Vitals is real but modest. The conversion effect is larger and better established: load time and conversion rate move together, and mobile is where the loss concentrates.
The pragmatic framing: you are not optimising for Google, you are optimising for the customer on a three-year-old Android on a train. Google's metrics just happen to be a decent proxy for that.
PerformanceThe subscription fees are the small part. The real cost is page weight, main-thread time, and the conversions those milliseconds take with them.
ConversionThe average Shopify store converts at 1.4%. Here is what that number hides, what the top decile does differently, and which segment you should actually compare yourself against.
ConversionEvery section on a product page should kill one objection, in the order shoppers actually raise them. Here is how to find yours and sequence the page around them.