PageSpeed Insights came back with a lower number than last time, and the advice has already started arriving: it's the apps, it's the images. Before changing anything, it helps to know what each tool measures, because that score is not the one Shopify reports in your admin.

Shopify reports field metrics, not a grade

The web performance reports in your admin hand out no grade. They give three metrics measured on your own visitors. LCP: good at 2500 ms or below, poor above 4000. INP: good at 200 ms or below, poor above 500. CLS: good at 0.1 or below, poor from 0.25 up.

Everything is reported at the 75th percentile — not the average, but the visitor sitting 75th out of every hundred. For the overall picture to read as good, three in four page loads have to be good on all three at once. The data covers 90 days, can lag by up to 36 hours, and stops entirely in private mode. On volume, Shopify makes exactly one caveat: less traffic means larger fluctuations. No minimum visitor count is published, which is a good reason not to invent one.

Why PageSpeed shows a different number

PageSpeed's lab run happens on a simulated device with the network and CPU deliberately constrained. Its field half comes from CrUX, which reports the 75th percentile at origin level over a rolling 28-day window. Shopify's reports measure real visitors to your storefront, split by page type and device. Both sources share one limit, and Shopify's lab-vs-field guide states it of each: the data comes from Chrome users who opted into sharing performance metrics, so your Safari traffic shows up in neither.

What the platform already handles

Shopify's platform documentation confirms that CDN-served files are minified and compressed with Brotli and gzip, that requests use HTTP/3 and TLS 1.3, and that theme CSS and JavaScript are minified for you. The image_url filter detects which formats the client supports, WebP and AVIF included, and picks the one with the best quality-to-size result. Bulk-converting a catalogue to WebP before upload is a negotiation the platform has already had on your behalf.

Three 2026 changes ask nothing of you:

  • Automatic Early Hints, live since 28 August 2026: Shopify identifies resources in the generated HTML itself and measured 76 ms off FCP and 100 ms off LCP at the 75th percentile.
  • Moderate speculation rules, live on all Liquid storefronts since 4 May 2026: desktop medians dropped 285 ms on TTFB and 228 ms on LCP; on mobile, 25 ms and 24 ms.
  • Video lazy loading in video_tag, rolled out in July 2026 and written up on 13 August: 78% less video data per page view, for videos in sections at position 3 or later that aren't the header.

CSS subsetting is the one to check

Since 20 April 2026, Shopify ships only the CSS from the {% stylesheet %} tags a page actually renders. It is the one change here the changelog flags as action required: if one file defines classes used by HTML in other, unrelated files, those styles can go missing on pages where the defining file isn't rendered. Theme Check's ValidScopedCSSClass check catches that pattern. The scope is narrow, too — per the documentation it leaves alone stylesheets in assets/, inline style attributes, <style> tags and Liquid's {% style %}. A theme that loads its CSS from assets/ gets none of this.

The image that paints first decides your LCP

Three of the six entries in Shopify's essential practices table concern that image: never lazy-load it, mark it fetchpriority="high", and don't hide it behind a reveal animation. The fourth lever is the sizes attribute, which Shopify's responsive layout guidance calls "the single most effective responsive performance lever in Shopify themes". It tells the browser how wide the image will be at each viewport so it can pick the smallest sufficient source from srcset. Get it wrong or leave it out and the browser assumes 100vw and takes the largest source; on a four-column product grid, the same page says, that means downloading images four times larger than needed. Note also that sizes="auto" works only with loading="lazy" — eager images, the LCP image included, still need an explicit value. The image_tag filter writes the srcset, width and height from the image URL.

An app's real cost is on the main thread

No admin report tells you what each app costs in milliseconds, but there is one documented case worth reading. In August 2026 Shopify's web performance team published work done with the developers of a popup app: synchronous XMLHttpRequest calls in the script load handler, running on every page load whether or not a popup was configured, producing a task of roughly 900 ms. Restructured as asynchronous calls with initialization deferred into a new task, INP went from 280 ms to 120 ms at the 75th percentile.

The switch you control sits in the theme editor, under theme settings. Turning app embeds off one at a time and watching INP is a reversible test that requires no theme code edits, and per the theme app extension documentation embeds install deactivated in the first place. Shopify's guide lists the categories that most often block rendering and offers an order for removal: what is unused, what duplicates functionality, what has a native alternative, and what causes 500 ms or more of blocking time.

Third-party scripts have moved

Two deprecations here carry similar dates and are not the same thing. Per Shopify's checkout.liquid documentation, checkout.liquid and additional scripts were sunset for the Thank you and Order status pages on 28 August 2025, for every store. The split timeline belongs to script tags: 28 August 2025 on Plus, 26 August 2026 on non-Plus stores. So if your conversion pixels lived in additional scripts and you aren't on Plus, they stopped in 2025.

Script tags are on the way out entirely: from 1 October 2026 Shopify rejects their creation and update, and on 1 March 2027 it stops injecting them. The changelog is explicit that this covers all API versions, so pinning an older one defers nothing; query and delete keep working so you can audit and clear up. App embed blocks are the replacement.

Where to start

Start with the scale of it. The Web Almanac 2025 ecommerce chapter found 76% of Shopify sites passing all three metrics on mobile, which makes the useful question which page type and which metric are out.

Open your reports and note all three metrics by page type and device. Take the worst page type and reproduce it in the lab: Shopify recommends at least three runs per URL in Incognito and using the median, since a single run can swing five to ten points on CPU and network noise alone. Identify the real LCP element and fix that first. Then work down into the JavaScript, switching app embeds off one at a time and watching INP.

Then wait. CrUX averages over 28 days, and Shopify's sustainable performance guidance puts field data at days to weeks depending on traffic, suggesting weekly or biweekly reviews on the same page. A score that went up is not evidence; field data two weeks later is.

It is also worth knowing when to leave things alone. If your field data is good, a lab score of 68 is not worth a week of anyone's time. If an app costs you two hundred milliseconds and brings measurable revenue, that is a commercial decision. Switching themes for speed is no safe bet either: Shopify publishes real-user data by theme and notes on the same page that actual performance depends on theme code, its version, customisations and the apps added to the shop. If the number still won't move, somebody has to read the theme code — and if you'd like that to be us, get in touch.

Common questions

Did Shopify remove the online store speed score?

Yes. Instead of a single grade, the web performance reports in your admin show three metrics measured on real visitors (LCP, INP and CLS) at the 75th percentile. The data covers the last 90 days and can lag by up to 36 hours.

Does uninstalling an app remove its code from my theme?

Not always. Shopify's help center says some apps add theme code that isn't removed automatically, and advises checking the app's listing or contacting the developer before uninstalling. Where an app is built as a theme app extension, its blocks are removed from the theme entirely on uninstall.

Do I need to convert my images to WebP before uploading them to Shopify?

No. The image_url filter detects which image formats the client supports, WebP and AVIF included, and picks the one with the best quality-to-size result. The work that does pay off is a correct sizes attribute, never lazy-loading the LCP image, and letting image_tag write width and height.