Why your Shopify store is slow, and what actually fixes it
Most speed advice for Shopify is about images. Images are rarely the problem. The problem is usually how much JavaScript your apps run before anyone can tap anything.
A store owner sends us a PageSpeed score of 34 and asks what happened. Usually nothing happened. Nothing was ever removed. Every app that got installed over two years is still loading on every page, including the one that ran a Diwali promotion in 2024.
Speed on Shopify is not really a technical problem. It is an accumulation problem.
The three numbers that matter
Google measures three things, and only three, when it decides whether your store feels fast.
LCP, or Largest Contentful Paint, is how long until the biggest thing on screen appears. On a product page that is almost always your main image. Under 2.5 seconds is good.
INP, or Interaction to Next Paint, is how long the page takes to respond when someone taps something. Under 200 milliseconds is good. This one replaced the old First Input Delay metric, and the swap made a lot of stores look much worse overnight, because the old metric only measured the very first interaction. INP measures all of them.
CLS, or Cumulative Layout Shift, is how much the page jumps around while loading. Under 0.1 is good. This is the one that makes people tap the wrong thing and then leave.
If you only remember one, remember INP. It is the one most Shopify stores fail, and it is the one most directly caused by decisions you can reverse.
Why INP is the honest metric
A browser runs your JavaScript on a single thread. The same thread handles taps. So while a script is running, taps queue up and nothing visibly happens.
That is the whole mechanism. When someone hits Add to Cart and the button feels dead for half a second, it is almost never the button. It is a review widget, a chat bubble, an upsell app and an analytics script all deciding to run at the same moment.
Your theme is rarely the culprit. Ten apps, each individually reasonable, is the culprit.
Do this before you touch code
Open your store on a real phone on mobile data. Not your desktop on office wifi, which is roughly the conditions of nobody who shops with you.
Then work in this order.
Count your apps. Open the admin, list every installed app, and be honest about which ones affect revenue. Most stores we look at can uninstall three without anyone noticing. Uninstalling is worth more than any optimisation, because the fastest script is the one that never loads.
Check for leftovers. Uninstalling an app does not always remove its code. Snippets get pasted into theme.liquid and stay there long after the app is gone. Search your theme files for script tags that reference apps you no longer pay for.
Look at what loads above the fold. Your hero image, your logo, your navigation. Everything else can wait. If a slider library is loading before the first image renders, that is a decision, and it can be reversed.
Fix layout shift with dimensions. Every image needs an explicit width and height. Without them the browser cannot reserve space, so the page reflows when each image lands. This is the cheapest CLS fix that exists and it takes an afternoon.
The apps conversation nobody enjoys
Every app is a permanent performance decision, and it is very easy to make that decision twenty times without ever making it once deliberately.
We are not against apps. Some earn their weight several times over. But there is a specific failure pattern worth naming: an app gets installed to test an idea, the test is inconclusive, and the app stays forever because uninstalling feels riskier than leaving it. Multiply by two years.
A useful habit is to treat installing an app the way you would treat hiring. What does it do, what does it cost, and when will you review whether it is still worth it.
What we do differently
When we build a Shopify theme, we prefer writing a section to installing an app for anything that touches the critical path. A custom section that does one thing ships a few kilobytes of Liquid. A general purpose app ships a framework capable of doing forty things, thirty nine of which you will never use.
That is not always the right trade. Apps handle edge cases, updates and support that custom code does not. But for a homepage hero, a size guide, a countdown, a tabbed description, the maths usually favours building it.
The honest expectation
You are not going to get a perfect score, and you should not chase one. Shopify's own checkout and platform scripts set a floor you do not control.
What you can control is whether the first tap works. Get LCP under two and a half seconds, get INP under two hundred milliseconds, stop the page jumping, and the store will feel fast to the people who matter, whatever the score says.
If you want a second opinion on where the time is going in your store, send us the URL. We will tell you what we would remove first, and whether it is worth paying anyone to do it.
0 comments
Be kind. Comments are moderated.