Shopify Performance Optimization 2025: CWV, Apps, Themes

Pass Core Web Vitals on Shopify in 2025. Stop app bloat, refactor themes, and boost mobile conversion. Includes audit checklist + speed budget. Join now.

Narayan Chaudhary

Narayan Chaudhary

June 3, 2024

Shopify Performance Optimization in 2025: Core Web Vitals, App Bloat, and Theme Refactors That Increase Mobile Conversion

If you run a Shopify store in 2025, speed is not optional. Mobile now drives the majority of browsing, and buyers abandon slow pages faster than your analytics can load. In the past year alone, mobile devices accounted for more than 62 percent of global website traffic, according to Statista’s Q2 2025 rollup, which puts a premium on fast, responsive storefronts that work on mid-range phones and spotty networks. That same Statista snapshot notes mobile devices excluding tablets drove 62.54 percent of traffic, which matches what you see in most DTC analytics stacks. And the technical bar moved again. Google replaced First Input Delay with Interaction to Next Paint, so interactivity across the entire session is being measured, not just the first tap.

At Byte & Buy, our members obsess over the link between page speed and revenue, and they treat performance as part of their growth playbook, not a one-off QA chore. This guide condenses what is working for top-performing stores, including a practical audit checklist and a speed budget model we use in weekly reviews. You can skim it, then go ship improvements today. Members can access the full downloadable checklist and a copy-paste speed budget template in the private library.

What changed in 2025: the Core Web Vitals and Shopify shifts that matter

Interaction to Next Paint officially replaced FID on March 12, 2024. The Chrome team confirmed the handoff and outlined how to prepare in the announcement where they wrote that INP would become a Core Web Vital and FID would be deprecated, with Search Console swapping to INP and a six month deprecation period for other tools. The INP guidance on thresholds spells out the new standard: the 75th percentile should be at or below 200 milliseconds for good, between 200 and 500 milliseconds needs improvement, and above 500 milliseconds is poor.

The rest of Core Web Vitals did not change, but the enforcement expectation remains strict. The Web Vitals overview reiterates the thresholds that still drive pass or fail at the 75th percentile: Largest Contentful Paint should be within 2.5 seconds, Cumulative Layout Shift should be 0.1 or lower, and INP should be 200 milliseconds or lower. If you focus your optimization on these three, your SEO and ads landing performance will benefit.

Meanwhile, Shopify quietly made the platform faster. Shopify’s engineering blog reported that storefronts got more than 35 percent faster in Time to First Byte for real users in CrUX data. The post explains why, citing single domain hosting for static content that lets browsers apply HTTP/3 priorities more effectively, plus theme-level intelligence where sections can mark lazy loaded content based on position. The result: the server responds sooner, the browser loads critical CSS while HTML streams, and the first render starts earlier, which helps LCP and the whole page load waterfall.

If you pair those infrastructure wins with a laser focus on INP, you will see downstream revenue benefits on mobile. That is especially true at checkout. Shopify’s teams have shared that merchants using Shop Pay see 1.91 times higher mobile checkout-to-order rates than regular checkout. Reducing friction in the journey from first paint to card entry is the whole game.

Why speed still maps to revenue

Shoppers’ tolerance for slowness keeps shrinking. Shopify’s enterprise guidance says 70 percent of consumers admit slow websites dent their willingness to buy, and they point to studies where load times outside two to three seconds sharply increase bounce. The same resource notes that faster site speed increases conversions, with internal analyses that a half-second improvement can lift conversion enough to notice in blended CAC. This is not just a UX nicety. Slow landing pages depress Google Ads Quality Score, which increases cost per click, compounds acquisition costs, and punishes your best creative.

Put simply, if you do not pass Core Web Vitals on mobile traffic, you leave large amounts of money behind. That is why our members keep performance visible in weekly growth standups and use a simple budget to veto new bloat.

The three levers to pass Core Web Vitals on Shopify

1) LCP: make the hero paint sooner

  • Serve the right size image from Shopify’s CDN. Shopify’s theme best practices recommend using the image_tag filter that returns a responsive srcset with smart widths and to avoid above-the-fold lazy loading. That keeps bytes small and decoding fast.

  • Prioritize the real LCP resource. The Fetch Priority API allows you to set fetchpriority="high" on your LCP image, which web.dev shows can pull LCP earlier by increasing the priority at discovery. If your hero is a CSS background, preload it and set fetchpriority=high on the preload.

  • Limit critical CSS and avoid asynchronous CSS for above-the-fold. Shopify’s performance blog on CLS warns not to lazy load CSS that styles the first viewport, because late-arriving styles create layout shifts and delay the first meaningful paint.

  • Use system or performant font strategies. Shopify’s theme guidance suggests considering a system font to avoid a network hop before text renders. If you do use custom web fonts, set modern fallbacks and font-display strategies that minimize CLS and FOIT, as discussed in the same CLS piece.

2) INP: make every interaction respond in under 200 ms

  • Trim JavaScript at the source. Shopify’s app performance best practices state that the app entry point should be less than 10 KB of JavaScript and less than 50 KB of CSS on a page, and that bundles should ideally be 16 KB minified. They also call out parser-blocking scripts as harmful to LCP and FCP, and recommend defer or async on script tags. Those same principles apply to your theme.

  • Reduce external frameworks. The theme performance best practices advise using native browser APIs and CSS for interactivity where possible, and to avoid heavy frameworks like React or jQuery in the storefront because of their parse and evaluate cost on mobile. Every kilobyte of JS adds main thread work that harms INP.

  • Defer non-critical code on interaction. Shopify’s docs recommend “import on interaction” patterns. If your PDP reviews carousel initializes on scroll or tap, do not ship it at DOMContentLoaded. Let the user intent trigger the download.

  • Profile and remove long tasks. The INP reference on web.dev emphasizes that long tasks, large DOMs, and client-side rendering can all push INP over the 200 ms threshold. Use Chrome Performance to spot 50 ms plus tasks and split them.

3) CLS: lock the layout before assets arrive

  • Reserve space for images and injected blocks. Shopify’s performance team details the most common CLS mistakes on Shopify and shows how to fix them: set width and height attributes on images, use aspect-ratio where appropriate, and give app blocks min-height so third party widgets do not push content when they arrive.

  • Do not lazy load CSS above the fold. That same guide cautions that async or lazy CSS for visible sections causes flashing and shifts. Keep render blocking CSS for the initial viewport, then defer the rest.

  • Use transforms for animations. Animating top or bottom properties forces layout recalculation and can register as shifts. Use transform translate for off-canvas nav, banners, or toasts, and respect reduced motion.

App bloat: how to audit and reduce third party overhead without losing features

Shopify apps can add critical features, but the way they load matters. Shopify’s enterprise article explains that most app script and CSS files are injected into the head via content_for_header, and if they run synchronously, they will block rendering. The same piece recommends async for scripts added via the Script Tag API so the page is not halted, and it suggests pruning unused apps because many merchants have more than 20 installed but use only a handful.

You also have more control in Online Store 2.0. The Shopify Help Center explains that you can enable or disable app embeds per theme and place app blocks exactly where you need them. That lets you turn off cart drawer widgets on templates where they are not used, and keep analytics or chat embeds from loading on sensitive funnels. As a rule, prefer app blocks and app embeds to apps that inject into theme code, since you can toggle and scope them without editing Liquid.

A timely change in 2025 affects older app integrations. Shopify’s developer docs say ScriptTags on the Thank You and Order Status pages were deprecated in February 2025 and will be turned off completely in August 2025 for Plus and August 2026 for non-Plus. Shopify encourages moving those behaviors to UI extensions or web pixel extensions. For merchants, that means apps relying on unsupported script injections in checkout flows can block upgrades and hurt performance. Favor apps that use extensions, not legacy script tags.

Finally, rein in tracking sprawl. Shopify’s speed guide suggests organizing tags with a tag manager so one request governs analytics and conversion pixels. Load high value tags first, defer the rest, and audit the tag manager container quarterly to remove stale pixels from past campaigns.

Theme refactors worth the sprint

Online Store 2.0 themes were built with performance in mind, and Shopify points to Dawn as a model. If you are still on a heavily customized pre OS 2.0 theme loaded with vintage snippets, moving to a clean OS 2.0 base can net an immediate speed score bump and make the app block model available. You can then apply targeted refactors that most stores recoup in days, not months.

  • Optimize Liquid loops and queries. Shopify’s theme performance guidance explains that complex operations inside loops slow Liquid render time. Use the Theme Inspector for Chrome to profile render hotspots and move sorting or filtering out of inner loops.

  • Wrap inline scripts to avoid namespace collisions. The docs recommend IIFEs so multiple vendor scripts do not conflict and to keep global scope clean.

  • Leverage resource hints selectively. Shopify exposes preload_tag and related flags on stylesheet_tag and image_tag. Use these for at most two critical resources per template, and pair with fetchpriority where appropriate to give LCP a nudge.

  • Host assets on Shopify’s CDN and keep URLs relative. Shopify’s platform improvements consolidate static content under the same domain, which helps with HTTP/3 prioritization. Using asset_url and image_url ensures you get CDN optimizations and versioned URLs.

  • Use Shopify’s automatic lazy loading wisely. Shopify’s performance blog notes you can use section.index to detect whether a section is likely below the fold and let the theme set loading="lazy" accordingly. Above the fold, your critical images should not be lazy.

If you want a lightweight way to test landing page ideas without clogging your theme, spin up a development store on Shopify and build focused templates for paid social. For a fast design-to-publish flow, our members use the workflows in Figma to Framer in 48 Hours, then port proven sections back into the theme.

Mobile-first fixes that increase add to cart and checkout completion

You do not need a full rebuild to see a lift. A few surgical changes drive measurable conversion impact on mobile.

  • Replace heavy hero sliders with a single, strong visual. Shopify’s speed article recommends ditching multiple auto-rotating hero slides that cost megabytes and instead focusing on one clear hero with a CTA. That reduces initial bytes and speeds LCP.

  • Stop preloading quick view data on collections. The same resource notes quick views often preload full PDP data for every tile, which crushes network queues. If you keep quick view, only fetch on tap.

  • Compress and right-size media. Shopify points out images are often 50 to 75 percent of page weight. Use TinyPNG or similar, then rely on Shopify’s image size parameters to request only the needed render size.

  • Use lite video embeds. Web.dev and practitioner guides show how a thumbnail plus deferred player load removes nearly a megabyte until the user taps, which significantly improves initial paint.

  • Keep popups from hijacking first paint. If you use welcome or discount modals, delay them until after the first interaction or a few seconds post-load so they do not fight with LCP and do not cause CLS.

  • Make the words on checkout pages do more work. You can take immediate wins from our playbook Checkout Copy That Converts on Shopify: 25 Wins so fewer buyers bounce after waiting for a slow form.

  • Upgrade the final step. Enabling Shop Pay speeds mobile checkout. Shopify highlights that Shop Pay checkouts deliver 1.91 times higher mobile checkout-to-order rates than standard checkout, which compounds the gains from faster pages.

For product detail pages, design patterns matter too. See the tested structures in 100 Shopify PDPs: Design Patterns That Drive 3% CVR, then enforce performance budgets inside those templates so conversion improvements stick.

A 30 minute Shopify performance audit checklist

Use this as a quick pass to find the biggest wins. Members can download a gated version with checkboxes, scripts, and example calculations.

  • Confirm Core Web Vitals and field data. Run your top URLs through PageSpeed Insights to see CrUX field data and lab hints. Check Shopify’s Web Performance Dashboard, which uses RUM data for LCP, INP, and CLS, to track regressions across releases.

  • Profile one representative mobile session. In Chrome DevTools on a mid-range device profile, record a performance trace from cold load through first interactions. Flag long tasks over 50 ms and their scripts.

  • Inventory third party requests. In the Network tab, group by domain. Note every analytics tag, chat, heatmap, or widget. Remove duplicates, defer low value tags, and set a rule for which pages may load which tags.

  • Inspect content_for_header. In theme.liquid, locate the block and note scripts injected there. Convert blocking scripts to defer or async where safe.

  • Spot layout shifts. Use the Performance pane’s Experience track and the Web Vitals extension to list CLS events. Add explicit width and height to any image without dimensions, reserve space for app blocks, and stop lazy loading above-the-fold images.

  • Confirm LCP resource prioritization. Identify the LCP element in PageSpeed Insights. If it is an image in markup, add fetchpriority="high" and consider a preload. If it is a background image, preload it with fetchpriority=high.

  • Right-size responsive images. Ensure image_tag is used with a sensible max width for hero and gallery images. Verify that mobile viewport requests smaller variants.

  • Budget JavaScript. Open the Coverage panel to measure unused JS at load. Remove unused libraries, split bundles, and convert one heavy component to load on interaction.

  • Test Shopify theme render hotspots. Use the Shopify Theme Inspector for Liquid and reduce repeated filters or nested loops. Cache computed values in variables outside loops where possible.

  • Verify app embed scope. In the theme editor, toggle off app embeds that do not need to run on the current template. Replace any app that cannot be scoped or deferred.

A speed budget that keeps your team honest

Performance does not stay good by accident. The web.dev primer defines a performance budget as a set of limits on metrics that affect site speed, such as page weight, number of requests, or time-based milestones. They recommend pairing quantity budgets with user-centric timings, and they suggest baseline targets like under 170 KB for critical path resources and under five seconds to interactive on a slow connection for early-phase constraints.

Here is a pragmatic Shopify budget our members use for mobile PDPs and collections in 2025. Set it per template, track in CI, and block merges that violate thresholds.

  • Critical path HTML plus CSS under 150 KB compressed for first viewport. If you must exceed this on the home page for brand, the PDP and collection pages should still meet it.

  • Total JavaScript shipped at initial load under 200 KB compressed, with any component JS above that loaded only on interaction. Keep vendor libraries out of the initial bundle.

  • LCP under 2.2 seconds at the 75th percentile on mobile, with a stretch goal under 2.0 seconds to withstand seasonal bloat.

  • INP under 200 milliseconds at the 75th percentile, measured via RUM. Use Total Blocking Time in lab as a proxy for regressions.

  • CLS under 0.08 to give margin for A/B testing and injected content.

Enforce this budget automatically. Lighthouse supports performance budgets you can run locally or in CI, and the Shopify theme docs include a Lighthouse CI GitHub Action that uploads your theme to a benchmark shop and calculates your speed score. Use it to fail pull requests that introduce regressions, and layer in bundlesize or a custom script that blocks merges when JS or CSS files exceed limits.

Members-only: the Byte & Buy audit checklist and speed budget template

We turned the checklist above into a repeatable template, including copy-paste code for fetchpriority, a quick theme.liquid script audit, the exact DevTools views to open for INP and CLS, and the spreadsheet we use to track budgets per template with traffic weights. Members can grab the files and a 10 minute video walkthrough in our private library. If you are not a member yet, you can upgrade for unlimited access for $4.99 per month billed yearly, or create an account from sign up.

Byte & Buy members also get weekly playbooks that compound performance with growth tactics. If you are localizing for EU, UK, or ANZ, see the conversion-safe pattern in Shopify Markets: EU, UK, ANZ Localization That Converts. If your collections are heavy, tune SEO and crawl with Shopify Collection SEO: Filters, Links, Schema. For acquisition efficiency, connect merchandising to social with TikTok Shop for Shopify: Setup, Affiliates, Live and index your favorite resources in Bookmarks.

Pulling it together this week

  • Measure where customers actually feel pain. Check PageSpeed Insights for field data and Shopify’s Web Performance Dashboard for your RUM trendlines. Treat LCP, INP, and CLS as the single source of truth.

  • Remove one app and one blocking script. Toggle app embeds you do not need on PDPs, then convert a parser-blocking tag to defer. Shopify’s guidance on parser-blocking scripts explains why this helps immediately.

  • Fix the biggest layout shift. Reserve space for the PDP image gallery and for any reviews app block. Shopify’s CLS article shows exactly how to add min-height to app blocks in the theme editor.

  • Make the hero paint first. Preload the real LCP resource and set fetchpriority="high". Web.dev documents how this helps the browser prioritize correctly.

  • Ship the budget. Add a performance budget to CI with Lighthouse and a bundlesize check. Hold the line at under 200 KB JS at initial load on mobile templates.

If you want a clean foundation and better defaults, consider spinning up a modern theme on Shopify, then cloning only the sections you need. Build fast LPs for your paid social or product drops, prove the patterns convert, and fold them back into the core theme once they pass budgets.

Performance is a team sport, not a solo refactor. Keep your speed budget visible in growth and design reviews. When you launch a new preorder flow or price test, secure your conversion upside by protecting your LCP, INP, and CLS. For structured conversion checklists and template-level best practices, start with our playbooks on checkout copy, PDP patterns, and the 2025 pricing playbook. Then add this performance guide to your weekly rituals so every feature ships fast by default.

Login to manage your membership, bookmarks, and private downloads from your account. If you need to reset access, use forgot password or update password. If a link takes you to an access denied page, just sign in to unlock it.