LUCENTCOMMERCEGET A FREE STORE AUDITFREE AUDIT

CORE WEB VITALS · PERFORMANCE · APPS · 6 JANUARY 2026 · 8 MIN READ

Core Web Vitals after every app you installed

Apps do not damage performance in general. Each kind damages a specific metric in a specific way, and knowing which is the difference between fixing it and guessing.

A loading waterfall with the blocking script highlighted

Differently for each metric, which is why "apps make the site slow" is too vague to act on. Apps that add markup or fonts above the fold damage LCP by competing for bandwidth with the image that actually matters. Apps that ship JavaScript running on the main thread damage INP, and that damage was largely invisible until INP became a stable Core Web Vital in 2024 and replaced First Input Delay. Apps that inject content after the page has painted — banners, badges, recommendation strips, cookie notices — damage CLS. Diagnosis means asking which metric moved, not which app feels heaviest.

IN SHORT

  • The three Core Web Vitals and their "good" thresholds are LCP within 2.5 seconds, INP of 200 milliseconds or less, and CLS of 0.1 or less, assessed at the 75th percentile of page loads and segmented by device type.
  • INP became a stable Core Web Vital in 2024, replacing First Input Delay — so app JavaScript that was always costly only became visibly costly in the metrics two years ago.
  • App embed blocks render immediately before the closing head and body tags, and the compliance_head target renders first, which is why a cookie consent app is a performance decision as much as a legal one.
  • Shopify documents that app embed blocks are deactivated by default after install, but an app can supply a deep link that activates one — so code can arrive on every page without a deliberate moment of approval.
  • Shopify’s theme performance guidance is to identify and remove or defer app scripts that block HTML parsing before any content is rendered, and to remove A/B test anti-flicker snippets when no tests are running.
  • Shopify’s Web Performance report can lag by up to 36 hours, which makes it a trend instrument rather than a way to test a change you made this morning.
  • The only reliable attribution method is still deactivating one app at a time and re-measuring — everything else tells you what is heavy, not what is costing you.

Three metrics, three unrelated failure modes

Core Web Vitals are usually discussed as a single score, and apps are usually discussed as a single category of problem. Both simplifications destroy the information you need.

The targets are specific: Largest Contentful Paint should occur within 2.5 seconds, Interaction to Next Paint should be 200 milliseconds or less, and Cumulative Layout Shift should be 0.1 or less — measured at the 75th percentile of page loads and segmented by device type. Three different numbers, describing three different experiences, damaged by three different app behaviours.

LCP is a bandwidth and discovery problem. The largest element in the viewport is usually a hero or product image, and it is late either because the browser found out about it late or because something else was using the connection. An app does not have to be on the critical path to hurt LCP; it only has to be competing for the same first second.

INP is a main-thread problem. It measures the delay between a user interacting and the next frame being painted. Any script doing work when the user taps — an analytics handler, a personalisation check, an overlay listener — adds to it. This is the metric app-heavy stores fail most often, and it is also the newest: INP became a stable Core Web Vital in 2024, replacing First Input Delay. Stores that had comfortable FID scores for years were not fast; they were being measured on something easier.

CLS is an injection problem. Content that arrives after paint and pushes existing content down. Almost every app that adds a visible element to a page you did not reserve space for contributes to it.

Once you have separated them, the question stops being "which app should we remove" and becomes "which metric is failing, and which app behaviour matches that failure". That question has an answer.

Where an app actually attaches itself

You cannot reason about the cost without knowing the mechanism, and on a modern Shopify theme the mechanism is the theme app extension.

Two block types matter here. App blocks are placed by a merchant inside a section, so they render where the merchant put them. App embed blocks are different: Shopify documents that they render immediately before the closing </head> and </body> tags, with the compliance_head target rendering first for cookie consent purposes.

Read that position carefully, because it is the whole story for head-injected apps. Anything an app embed block puts before </head> is in front of every byte of your page content, on every page of the store. Shopify’s platform work — streaming HTML responses so the browser parses while the server renders, Early Hints to start critical downloads sooner — is specifically designed to get the page started early, and a synchronous third-party script in the head undoes a measurable part of that benefit.

The compliance_head detail is worth sitting with. Your cookie consent app renders before everything else, by design. On many stores it is therefore the first script to execute, the thing a user must interact with before doing anything else, and frequently the largest element in the viewport while it is open. That makes it simultaneously an LCP candidate, an INP path and a CLS source. It is a legal requirement and a performance decision, and most stores have only evaluated it as the former.

One more piece of platform detail that cuts the other way: Shopify runs web pixels in a sandbox — a strict sandbox for app pixels and a lax one for custom pixels — where access to cookies, localStorage and sessionStorage goes through a browser API that executes asynchronously in the top frame rather than synchronously in your document. Tracking code delivered as a pixel is genuinely not the main-thread problem that a tag pasted into theme.liquid was. If you are still carrying analytics as a theme snippet, moving it is one of the few changes that reduces cost without reducing capability.

Fixing LCP: stop the competition, not the app

LCP problems on app-heavy stores are usually not caused by the app rendering anything. They are caused by four or five requests starting before the hero image does.

Shopify’s own theme guidance is direct about the two ends of this. Critical resources should load above {{ content_for_header }} so the browser can fetch them while Liquid renders the sections; non-critical ones take defer or async. Images in the initial viewport should never carry loading="lazy", and the LCP candidate should be marked fetchpriority="high". And preload should be reserved for the one or two resources the browser genuinely discovers late — used liberally it competes with the browser’s own prioritisation and makes things worse.

Against that baseline, the app fix is usually deferral rather than removal. A reviews widget below the fold has no business loading before the hero image. A personalisation script that decides what a returning visitor sees has to run early by definition, and that one is a real trade you should price rather than optimise away.

The single most common finding is also the most embarrassing to report: Shopify’s guidance to remove A/B test anti-flicker snippets when no tests are running exists because stores routinely leave them in place for months after the last experiment ended. An anti-flicker snippet deliberately hides the page until the testing script responds. If no test is running, you are paying the full cost of that hiding for no result at all.

Fixing INP: the metric that changed the ranking

INP is where app accumulation shows up most honestly, because it measures the thing users actually complain about — the tap that does nothing for a moment.

The pattern to look for is not one heavy script but several small ones attached to the same events. Four apps each adding a modest listener to every click is not four times a small cost; it is a main thread that has to finish four pieces of work before the next frame can paint, on a mid-range phone that is already the slowest device in your audience.

Three questions separate the fixable from the structural. Does the script need to run before the interaction, or is it reacting to it — a recommendation engine computing on page load versus one computing when a drawer opens. Does it need to run at all on this template, or is it an app embed running site-wide to serve one page type. And is the work it does proportional to the value it returns, which is a commercial question wearing a technical costume.

The practical lever most stores have not pulled is scope. An app embed block is site-wide by construction; a lot of the functionality merchants buy is needed on one template. Getting an app to load only where it earns its place typically requires either an app that supports it or a developer, which is exactly why it does not happen by default.

Attributing the damage to a specific app

This is the part that is genuinely hard, and where most speed work goes wrong: a waterfall tells you what is heavy, not what is costing you. A 200 KB script that runs during idle time may cost nothing, and a 4 KB script running a synchronous check on every click may cost your INP score.

A workable method, in order:

  • Start with field data, not lab data. Shopify’s Web Performance report is built on the three Core Web Vitals; note that it can lag by up to 36 hours, so treat it as a trend line rather than a same-day test.
  • Establish which metric is failing and on which template and device. A store failing INP on mobile product pages is a different investigation from one failing LCP on desktop collections.
  • Reproduce it in the lab with throttling that resembles your actual audience, not your laptop on office wifi.
  • Deactivate one app embed block at a time and re-measure. One at a time is slow and it is the only method that produces attribution rather than correlation.
  • Re-check the field data a few days later, because the lab result and the 75th percentile of real page loads regularly disagree, and the field number is the one that counts.

What we would talk you out of

Installing an app to fix performance. The contradiction is on the label. There are narrow exceptions — an image optimisation service that replaces work you are doing badly — but the measurable win available to most stores is deletion.

Optimising for the Lighthouse number. Shopify requires an average Lighthouse score of 60 across home, product and collection pages for Theme Store acceptance, which tells you what kind of instrument it is: a floor for distribution, not a measure of how your customers experience the store. Core Web Vitals field data at the 75th percentile is the number worth managing.

Removing an app that demonstrably earns money because it is heavy. This is the honest limit of performance work. If a reviews widget adds 300 ms of INP and a measurable amount of revenue, the answer is to make it cheaper — defer it, scope it to the templates that need it, reserve its space so it does not shift the layout — not to delete it and call the resulting score an improvement.

The uncomfortable summary is that most app-related performance debt was not decided. It accumulated one install at a time, each of which was individually reasonable, and several of which activated an embed block on every page of the store without anyone experiencing that as a decision. An annual audit of what is actually attached to your theme costs a day and is the highest-return performance work most stores are not doing.

Questions this raises

How do apps affect Core Web Vitals on Shopify?

By metric rather than in general. Apps adding above-the-fold markup or fonts compete with your LCP image for the first second of bandwidth. Apps shipping main-thread JavaScript add to INP, particularly when several attach handlers to the same interactions. Apps injecting visible content after paint cause CLS. Identify which metric is failing first — the remedies are unrelated.

What are the current Core Web Vitals thresholds?

Largest Contentful Paint within 2.5 seconds, Interaction to Next Paint at 200 milliseconds or less, and Cumulative Layout Shift at 0.1 or less. The assessment is made at the 75th percentile of page loads, segmented by device type, so a good desktop experience does not rescue a poor mobile one.

Why did our performance scores get worse without us changing anything?

One common reason is the metric changing rather than the site: INP became a stable Core Web Vital in 2024, replacing First Input Delay, and it measures the full delay to the next paint rather than just the delay before processing starts. Stores carrying a lot of app JavaScript were always paying that cost; FID simply did not report it.

Where does an app’s code actually load on my storefront?

Theme app extensions provide app blocks, which a merchant positions inside a section, and app embed blocks, which Shopify documents as rendering immediately before the closing head and body tags — with the compliance_head target rendering first. Anything in an app embed block is site-wide by construction, which is why scoping it to the templates that need it is usually the biggest available win.

Can I tell which app is slowing the site down from a waterfall?

Only partially. A waterfall shows you what is large, not what is costing you — a big script running during idle time may cost nothing while a tiny one running on every click can wreck INP. The only method that produces real attribution is deactivating one app embed block at a time and re-measuring, then confirming against field data.

Is the Shopify speed score the right thing to optimise?

Not on its own. Shopify sets an average Lighthouse score of 60 across home, product and collection pages as the Theme Store floor, which makes it a distribution requirement rather than a measure of customer experience. Manage the Core Web Vitals field data instead, bearing in mind that Shopify’s Web Performance report can lag by up to 36 hours.

NEXT STEP

Free store audit

A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.