Skip to main content
Shopify guide

INP (Interaction to Next Paint) for Shopify Stores

By ยท Updated ยท 7 min read

Why INP Behaves Differently on Shopify

Shopify stores run on a hosted platform with architectural constraints that directly shape INP scores. Unlike self-hosted storefronts, merchants cannot modify server-side rendering pipelines, adjust CDN caching rules for dynamic routes, or restructure the checkout domain โ€” all of which affect how quickly the browser responds to user interactions like taps, clicks, and keyboard input.

Shopify's Liquid templating engine renders pages server-side, but the real INP threat comes from the JavaScript layer loaded after the initial HTML. Every installed app that injects a script tag โ€” whether through a theme app extension or the older ScriptTag API โ€” adds to the main thread work that delays interaction responses. A store with 15 active apps routinely accumulates 400โ€“800ms of blocking JavaScript, pushing INP well above Google's 200ms 'good' threshold.

Shopify's Online Store 2.0 architecture introduced theme app extensions and app blocks, which give merchants more control over where and when third-party scripts load. This is the single most important structural change for INP, because it replaces always-on global script injection with section-level, conditional loading. Stores still on legacy themes โ€” Dawn 1.x or older custom themes โ€” carry the full INP burden of every installed app regardless of the page type.

The Main Causes of Poor INP on Shopify Themes

The product page is the highest-risk INP surface in a Shopify store. Variant selector changes trigger JavaScript that updates price, image gallery, availability text, and add-to-cart button state โ€” all in sequence on the main thread. Themes that chain these updates synchronously, rather than using requestAnimationFrame or breaking work into microtasks, produce INP events in the 300โ€“600ms range just from variant switching.

Cart drawer implementations are a close second. When a customer clicks 'Add to Cart,' a typical Shopify theme fires a fetch request, waits for the response, then re-renders the cart drawer DOM โ€” blocking any further interaction until the paint completes. Themes that optimistically update the UI before the fetch resolves, then reconcile after confirmation, cut perceived INP dramatically without changing actual network latency.

Third-party chat widgets, loyalty pop-ups, review apps, and upsell tools each register their own event listeners and often reflow large DOM sections on interaction. Because Shopify's app ecosystem encourages adding these through the theme's app embed blocks, merchants accumulate them without a clear view of their combined main-thread cost. Tools like Chrome DevTools' Performance panel, run on a throttled CPU profile, reveal exactly which app's listener is responsible for each slow interaction.

Shopify-Specific Tools for Diagnosing INP

Google's PageSpeed Insights (PSI) is the starting point โ€” it pulls real-user INP data from the Chrome User Experience Report (CrUX) and displays it at the URL level for Shopify storefronts. Because CrUX aggregates 28 days of field data, PSI reflects actual customer interactions including mobile device distribution, not just lab simulations. Check PSI for the homepage, a collection page, and a product page separately, since INP scores vary significantly across these templates.

Shopify's built-in Web Performance dashboard, available inside the admin under Online Store > Themes, surfaces Core Web Vitals including INP for the store's own CrUX data. This is useful for tracking trend direction after theme or app changes. For deeper diagnosis, the Web Vitals JavaScript library can be installed via a Shopify theme's additional scripts section to log INP breakdowns โ€” element, event type, and delay โ€” to a custom analytics endpoint or the browser console during QA sessions.

The Chrome extension 'Web Vitals' provides real-time INP readings while navigating a storefront. Run it on a mid-range Android device profile in Chrome DevTools' device emulator to reproduce the conditions of the average Shopify customer. Third-party Shopify app audit tools like Nostra and Littledata surface script load attribution, though merchants should cross-reference their findings against raw DevTools traces.

Working Around Shopify's Platform Limitations

Shopify does not allow merchants to defer or remove Shopify's own core JavaScript files โ€” things like the cart API polyfills and section rendering infrastructure are outside merchant control. The practical implication: there is a floor on how low main-thread JavaScript can go, and optimizing INP means focusing on the controllable layer โ€” theme code and third-party apps โ€” rather than expecting Shopify's platform scripts to disappear.

For apps that cannot be converted to theme app extensions, use Shopify's 'load order' settings in the Theme Editor to place scripts in the footer rather than the head where available. For apps that must load globally, wrapping their initialization in an IntersectionObserver so they only activate when their DOM element enters the viewport reduces idle main-thread saturation. This is not a native Shopify feature โ€” it requires custom theme code in the theme.liquid layout file.

Shopify's Checkout is hosted on a separate subdomain and runs Shopify's own JavaScript. INP within checkout is not in merchant scope for standard Shopify plans. Shopify Plus merchants with Checkout Extensibility can add UI extensions, but even those are sandboxed and do not provide the same optimization surface as the main storefront. For most stores, the INP improvement opportunity is entirely in the Online Store section, not checkout.

Concrete Steps to Improve INP on a Shopify Store

Audit installed apps first. Go to Shopify Admin > Apps and cross-reference every active app against a DevTools Performance trace on the product page. Remove any app whose interaction delay cost exceeds its revenue contribution โ€” this is the single highest-return action available. Apps that load scripts globally but only serve a function on one page type (e.g., a subscription widget only needed on product pages) should be migrated to conditional loading via app blocks.

In the theme code, break up long JavaScript tasks in the variant selector and cart handlers. Shopify's Dawn theme (the official reference theme) is a useful benchmark โ€” compare its variant change handler against a custom theme's to identify added synchronous work. Use scheduler.postTask() or setTimeout(fn, 0) to yield to the browser between DOM updates. For the add-to-cart flow, implement optimistic UI updates: increment the cart count immediately, then confirm or roll back after the fetch resolves.

Set a performance budget and enforce it across theme releases. Because Shopify merchants add and remove apps continuously, INP can regress between deployments without a tracking mechanism. Monitoring INP via the Web Vitals library logged to an analytics tool โ€” even Google Analytics 4's custom events โ€” gives a measurable signal that degrades are caught before they accumulate into a sustained CrUX decline that affects search ranking.

Frequently asked questions

Does Shopify's platform itself hurt INP scores?

Shopify contributes a baseline of main-thread JavaScript that merchants cannot remove โ€” cart API infrastructure, section rendering, and theme framework code. This creates a performance floor. On a well-optimized store with few third-party apps, that floor is manageable. On stores with 10+ active apps injecting scripts globally, the platform baseline becomes a minor factor relative to third-party bloat.

Which Shopify apps most commonly cause high INP?

Chat widgets, loyalty and rewards programs, review platforms with interactive widgets, and upsell pop-up apps are the most common INP contributors. These apps register persistent event listeners, reflow large DOM sections on interaction, and often load regardless of page type. The impact varies by implementation โ€” check each app's interaction cost individually in Chrome DevTools rather than assuming guilt by category.

What is a good INP score for a Shopify store?

Google classifies INP under 200ms as 'good,' 200โ€“500ms as 'needs improvement,' and above 500ms as 'poor.' These thresholds apply to Shopify stores the same as any site. Product pages with complex variant selectors and cart drawers are the most likely pages to exceed 200ms. Target the product page INP specifically, since it carries the most interaction weight in a typical store session.

Does Online Store 2.0 automatically improve INP compared to older Shopify themes?

Online Store 2.0 provides the infrastructure for better INP through theme app extensions and app blocks, but it does not automatically improve scores. The improvement depends on app developers migrating their integrations to app blocks, and on merchants removing apps that still use the legacy ScriptTag API. Switching to Dawn or another 2.0 theme while keeping legacy apps produces limited INP gains.

Does INP affect Shopify store rankings in Google Search?

INP replaced FID as a Core Web Vital in March 2024 and is a confirmed Google ranking signal via the Page Experience system. A 'poor' INP score โ€” above 500ms โ€” on key landing pages like product pages and collections can negatively influence organic search ranking relative to competitors with 'good' scores. The effect is not absolute โ€” content relevance and authority outweigh Core Web Vitals โ€” but INP is a direct ranking factor, not a proxy metric.

MG
Written by

Matt is the founder of RunOctopus. He built All Angles Creatures from zero to page-1 rankings in reptile feeder insects in under 60 days using exactly this method โ€” turning a hard, entrenched niche into RunOctopus's proof store for programmatic SEO and AI search citation.

Connect on LinkedIn →

See what Otto would build for your store

Free architecture preview. No card required. Five minutes.

Generate Preview →