Skip to content
6 min read · A/B testing

Mobile Page Speed for Ecommerce: What Actually Costs You Orders

ZWritten byZahidul IslamCTO & Experimentation Lead
Updated on 16 August 2026
A performance report headed same page, two verdicts, comparing mobile field data at the 75th percentile over 28 days, where LCP fails at 3.8 seconds and INP fails at 240 milliseconds while CLS passes at 0.06, against a single desktop lab run scoring 96 with an LCP of 1.4 seconds and a CLS of 0.01

Mobile page speed on a storefront is judged by three published numbers: Largest Contentful Paint at 2.5 seconds or less, Interaction to Next Paint at 200 milliseconds or less, and Cumulative Layout Shift at 0.1 or less. They are assessed on real visits at the 75th percentile and segmented by device, which is why a mobile storefront cannot hide behind a desktop average or a lab score.

That last sentence is most of the article. Almost every argument about ecommerce performance is really an argument about which measurement counts, and a team that has not settled that will spend a quarter optimising a number nobody experiences.

What Core Web Vitals mean on a storefront

The three metrics map onto three ordinary storefront moments. Largest Contentful Paint is when the product photograph or the category heading actually appears, which is the moment the page stops looking broken. Interaction to Next Paint is what happens when somebody taps a filter, opens a variant picker or adds to basket, and it is the one that makes a site feel cheap when it is bad. Cumulative Layout Shift is the badge, the delivery message or the promotional bar arriving late and moving the buy button under a thumb that was already travelling.

What makes a storefront harder than a content site is that all three moments recur. A category page paints, then repaints as filters run. A product page paints, then shifts as a variant is chosen. So the metrics are measured against a page that keeps changing after it has finished loading.

The thresholds and the 75th percentile rule are published by Google at web.dev/articles/vitals, which states plainly that "a good threshold to measure is the 75th percentile of page loads, segmented across mobile and desktop devices". Read that as a promise rather than as a target: you are being graded on your slowest quarter of mobile visits, which is exactly the traffic a storefront acquires most expensively.

A lab score and field data are not the same claim

The most common performance meeting in ecommerce is one where a score of 96 sits on a slide while the field report says the page fails. Both are correct and they are answering different questions.

Google is direct about why. A lab test is "a single device, connected to a single network, run from a single geographic location", while field data "includes a wide variety of network and device conditions as well as a myriad of different types of user behavior". Two metrics suffer particularly: lab tools "cannot accurately predict when users will choose to interact with a page", so responsiveness is guesswork, and layout shift measured in a lab "only considers layout shifts that occur above the fold and during load", which is a fraction of what a real session produces. The conclusion offered is unambiguous, that where you have both, "field data is what you should use to prioritize your efforts", at web.dev/articles/lab-and-field-data-differences.

So the lab score keeps one job, which is telling you whether a change you made this afternoon helped, on a device held constant. It is a regression check, not a verdict. The verdict comes from the field, and if you do not have field data for your own templates yet, that is the first thing to fix rather than the score.

Which culprit owns which metric

Performance advice tends to arrive as an undifferentiated list, which is why it is so easy to spend a fortnight on the wrong thing. On a mobile storefront there are really three cost centres and they do not damage the same metric.

  • Images own Largest Contentful Paint. The hero or the first product shot is almost always the largest element, and the fault is usually a file far bigger than the slot it lands in rather than insufficient compression.
  • Third-party scripts own Interaction to Next Paint. They compete for the same main thread the interface needs, so the page paints on time and then refuses to respond for a quarter of a second when somebody taps.
  • Late-loading interface furniture owns Cumulative Layout Shift. Badges, delivery promises, consent banners and promotional bars that arrive without reserved space, most damagingly around the buy button.
  • App and plugin weight sits underneath all three, because every installed feature adds markup, styles and script to templates that never asked for it.
  • Fonts and consent tooling are the two most commonly forgotten, and both block the first paint on the slowest connections rather than on yours.

Which of those you have is a question your field data answers in an afternoon, and the platform-specific mechanics live elsewhere: on Shopify the culprits are usually app weight and theme scripts, and on WooCommerce they are usually hosting, object caching and plugin count.

Third-party scripts and the owner column

Third-party code is the largest controllable cost on most storefronts, and the only inventory that ever produces action is one with an owner column in it. Script, blocking time, transfer size, the person who asked for it, and a decision. The decision column is the point: without it the audit becomes a document, and documents do not get faster.

A third-party script inventory for a mobile product page listing a live chat widget at 620 milliseconds, a reviews widget at 410, a personalisation script at 350 owned by nobody and marked remove, a tag manager at 280 and a retargeting pixel at 190, totalling 1,850 milliseconds of main-thread blocking and 511 KB

The row that recurs on every store is the one whose owner is nobody. A personalisation tool, an abandoned experiment, a widget installed for a campaign that ended in the spring. Nobody defends it because nobody remembers it, and it is costing a third of a second of main-thread time on every product view. Removing it is the cheapest performance work in ecommerce and it needs no engineering at all.

It is worth knowing the shape of the worst case as well as the average one. Google notes that when a third party has server trouble, "rendering is blocked until the request times out, which can be anywhere from 10 to 80 seconds", at web.dev/articles/third-party-javascript. Nobody sees that in a median. It shows up as a support ticket saying the site was down, on a day the site was not down.

When a bad number is not a problem

Not every failing metric costs anything, and pretending otherwise is how performance work loses its budget. Three cases are worth naming before you spend.

The first is a failure on a template with no commercial job: a blog archive, a policy page, a legacy landing page nobody links to. The second is a metric that fails narrowly on one device family while the revenue-carrying segments pass, which is a compatibility bug rather than a performance programme. The third is a score, as opposed to a metric, since a composite number can move several points without any customer noticing anything at all.

The published data is worth reading in the same spirit. Speed and conversion move together across large samples, and the size of that relationship is measured differently by every publisher who reports it, which is why our benchmarks page reproduces each one with its source rather than quoting a single percentage. Anyone offering you one number for what a second is worth has stopped citing.

Deciding whether you have a real one

Four questions settle it, in order. Does the metric fail in field data rather than only in a lab run? Does it fail on a template that takes money? Does it fail for the segments that convert, or only for the ones that never would? And is there a specific, named cause, or only a low score?

Four yeses is a real problem and it deserves engineering time ahead of most of the roadmap, because it is suppressing every metric downstream of it rather than one. Anything less is a number, and a number can wait behind work that has a customer attached to it. That discipline is the same one that keeps a testing programme honest, and it is worth applying to performance precisely because performance is the easiest place in ecommerce to look busy. If your field data and your lab score have been disagreeing for a while, we will happily read both.

Sharein𝕏f

The questions people ask first

The published thresholds are the same for every site: Largest Contentful Paint at 2.5 seconds or less, Interaction to Next Paint at 200 milliseconds or less, and Cumulative Layout Shift at 0.1 or less. What makes them harder on a storefront is that they are assessed at the 75th percentile of page loads and segmented by device, so a mobile product page is judged on its own slowest quarter rather than on an average that desktop traffic has flattered.

Because they are different claims. A lab run is one device, one network and one location, chosen to be repeatable; field data is every device, every network and every kind of user behaviour your store actually sees. Two metrics in particular cannot be captured properly in a lab: interaction responsiveness, because no script can predict when a real person will tap, and layout shift, because a lab run only sees shifts above the fold during load.

Largest Contentful Paint on category and product pages, and Interaction to Next Paint everywhere a customer taps to filter, choose a variant or open a menu. Layout shift matters most beside the buy button, where a late-loading badge or delivery message that pushes the button down turns a purchase into a mis-tap. Which one to work on first is decided by your own field data, not by a general ranking.

Segment before you spend. Compare the conversion rate of sessions on the slow template with the same template on faster devices or connections, and check whether the bad metric appears on pages that carry revenue at all. A failing score on a page with no commercial job is a number, not a problem, and a passing score on a product page that still loses paid traffic means the fault is elsewhere.

They are usually the largest controllable cost, because they are the code you did not write, cannot profile easily and rarely remove. The failure mode worth knowing is not the average case but the bad one: Google documents that a third party with server trouble can block rendering until the request times out, which can be anywhere from ten to eighty seconds.

ZWritten byZahidul IslamCTO & Experimentation Lead

Zahidul is Optyv’s CTO and runs the experimentation practice. He reviews the build behind every test before it sees traffic.

Do you like what you see?

Optimize your store