monkeyman.agency
scaling

Shopify Speed, A Real, Working Playbook for Lighthouse 90+

The actual sequence we use to take Shopify themes from Lighthouse 50s to 90+ on mobile in two weeks. No magic. No new theme required.

April 1, 2026 12 min read

Most Shopify speed advice falls into two camps. Camp one: “switch to a Hydrogen storefront.” Camp two: “install this app.” Both miss the point. Almost every Shopify Liquid theme can hit Lighthouse 90+ on mobile if you do the work in the right order.

Here’s the order we use, on every speed engagement we ship.

Day 1, Baseline honestly

Before you change anything: grab a real baseline. Three numbers matter.

  • Lab Lighthouse (PageSpeed Insights, mobile). Run it three times, take the median.
  • Field CrUX data in Google Search Console. This is what Google actually uses for ranking.
  • WebPageTest waterfall, throttled to mobile 4G. This shows you what’s actually loading and when.

Lab numbers are necessary but not sufficient. Field data is what moves rankings. Optimise for both, but if they conflict, follow field data.

Day 2-3, Image pipeline

Shopify’s image_url filter supports WebP and responsive sizing. Most themes don’t use them properly.

  • Add width and height attributes to every image. CLS issues evaporate.
  • Use srcset with mobile-first widths. A 1600px hero loaded on mobile is the most common Lighthouse killer.
  • Lazy-load everything below the fold with loading="lazy". Add decoding="async" while you’re there.
  • Convert your hero image preload to <link rel="preload" as="image" imagesrcset="..."> so it starts loading before the rest of the CSS.

This pass alone usually moves Lighthouse 15-25 points.

Day 4-5, App audit

Open Chrome DevTools → Network. Reload your homepage. Sort by Size. Look at every script over 50KB. Most of them are apps.

For each one:

  • Is it used on this page? If a “shipping protection” app loads on the homepage but only matters at checkout, defer it.
  • Is it deferable? Add defer or async to the script tag. Test the app’s flow still works.
  • Is it removable? If you installed it 6 months ago and never look at the dashboard, kill it.

Most stores can shave 30% of their JS payload here without losing functionality.

Day 6, Critical CSS

Shopify themes ship one giant theme.css file. The browser blocks rendering until it parses all of it.

The fix is critical CSS, extract just the styles needed for above-the-fold content, inline them in the <head>, and load the rest async.

Tools that work:

  • Critters (https://github.com/GoogleChromeLabs/critters), Node tool, integrate into your build.
  • Penthouse, alternative, similar approach.
  • For Shopify, build the critical CSS once during theme development and snippet it into theme.liquid.

This pass usually moves Lighthouse 5-10 points and dramatically improves LCP.

Day 7, Font loading

Geist, Inter, your custom font, fonts are the most-overlooked render-blocker.

  • font-display: swap on every @font-face rule. Users see text in a fallback font first, then the real font swaps in.
  • Preload only the font weights used above the fold (<link rel="preload" as="font">).
  • Self-host fonts. Google Fonts adds DNS lookup and TLS handshake overhead. Self-hosted fonts load from your CDN.

Day 8-9, Third-party scripts

Analytics, chat, reviews, A/B testing, every third-party script is render-blocking until proven otherwise.

  • Microsoft Clarity can be deferred to load event without impact.
  • Meta Pixel should be deferred and fired on first scroll, not on document parse.
  • GA4 can use the lite version (gtag.js async) without losing core functionality.
  • Chat widgets should never load on the initial page. Defer until scroll or interaction.

Aim for zero render-blocking third-party scripts. Lighthouse rewards this directly.

Day 10, Theme code

Liquid is server-rendered, so it doesn’t directly affect Lighthouse. But generated HTML weight does.

  • Strip unused sections. Most themes ship 30+ section files; you use 8.
  • Audit assets/theme.js, most themes ship megabytes of unused JS. Tree-shake or delete.
  • Replace heavy JS components with progressive-enhancement Liquid + small JS islands.

Day 11-12, Verification

  • Re-run Lighthouse three times, median.
  • Check WebPageTest waterfall, should be cleaner now.
  • Check CrUX data in Search Console (note: CrUX has a 28-day rolling window, so the field improvements show up over weeks).
  • Test on a real mid-range Android phone. Lab data lies. A real Pixel 5a is the ground truth.

What 90+ actually requires

For most Liquid themes, hitting 90+ on mobile requires:

  • LCP under 2.5s
  • CLS under 0.1
  • Total JS under 200KB
  • Critical CSS inlined
  • Hero image preloaded and properly sized
  • Zero render-blocking third-party scripts

If you’re missing any of these, you’re missing the score.

The trap

Speed work has a shelf life. If your team installs a chat widget after launch and doesn’t defer it, you’re back to Lighthouse 70s within a quarter. Speed is not a one-time engagement, it’s a discipline.

Set up Core Web Vitals monitoring (CrUX, or a service like SpeedCurve) and check it weekly. The team that runs this discipline keeps the score. The team that doesn’t, doesn’t.

If you want a focused 2-week sprint to take your store from where it is to 90+, and you want the work documented so your team can keep the score, that’s what our Shopify Speed sprint delivers.

Need help with this?

Send us your store. We'll send back an audit.

Send us your store URL. We'll send back a free audit within 48 hours.

Phone (optional)