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.

Monkeyman 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.