<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Shoptimize</title>
  <subtitle>Slow load times drive customers away. We optimize your Shopify store for speed, boosting engagement and sales — fast.</subtitle>
  <link href="https://shoptimizehq.com/feed/feed.xml" rel="self" />
  <link href="https://shoptimizehq.com/" />
  <updated>2026-07-25T00:00:00Z</updated>
  <id>https://shoptimizehq.com/</id>
  <author>
    <name>Glen Hodges</name>
  </author>
  <entry>
    <title>Image and Video Optimization for Shopify: The Complete Guide</title>
    <link href="https://shoptimizehq.com/blog/shopify-image-video-optimization/" />
    <updated>2026-07-25T00:00:00Z</updated>
    <id>https://shoptimizehq.com/blog/shopify-image-video-optimization/</id>
    <content type="html">&lt;p&gt;Images are the number one drag on Shopify store speed. They account for roughly 27% of total page weight, they dominate your Largest Contentful Paint score, and they are where the majority of &amp;quot;why is my store so slow&amp;quot; problems trace back to.&lt;/p&gt;
&lt;p&gt;The good news is that image and video optimization is also the highest-ratio work you can do. Get it right and you can cut page weight by 60 to 70% while making the store &lt;em&gt;look&lt;/em&gt; exactly the same to the shopper. 😎&lt;/p&gt;
&lt;p&gt;This guide covers the full picture. How Shopify actually serves media, the correct formats and sizing, lazy loading, layout stability, video handling, and the specific Liquid filters and tags you should be using in your theme to get all of this for free.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;why-images-matter-more-than-almost-anything-else&quot;&gt;Why images matter more than almost anything else&lt;/h2&gt;
&lt;p&gt;When a shopper loads a product page, the largest visible element is almost always an image, usually the hero or the main product photo. That element is what LCP measures, and LCP under 2.5 seconds is the single highest-impact Core Web Vital on Shopify. So your images are not just &amp;quot;assets,&amp;quot; they are the thing standing between the shopper and a page that feels fast.&lt;/p&gt;
&lt;p&gt;Unoptimized images cause three separate problems at once:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;They slow LCP.&lt;/strong&gt; Big files take longer to download and paint.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;They cause layout shift.&lt;/strong&gt; Images without set dimensions make the page jump, hurting CLS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;They waste bandwidth.&lt;/strong&gt; Especially painful on the mobile connections that make up most of your traffic.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Fix images well and you improve all three metrics simultaneously.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;first-understand-what-shopify-does-for-you-automatically&quot;&gt;First, understand what Shopify does for you automatically&lt;/h2&gt;
&lt;p&gt;Before changing anything, it helps to know what the platform already handles, because it changes what you should and should not do manually.&lt;/p&gt;
&lt;p&gt;Shopify serves all theme and product media through its CDN, and that CDN automatically detects which image formats the visitor&#39;s browser supports (WebP, AVIF, and so on) and picks the format that gives the best quality at the smallest size for that specific visitor. This is documented behavior of the image filters, when you serve an image through Shopify&#39;s URL filters, format negotiation happens at the edge without you specifying anything.&lt;/p&gt;
&lt;p&gt;This has a practical and slightly counterintuitive consequence: &lt;strong&gt;you generally should not try to force WebP or AVIF yourself in Liquid.&lt;/strong&gt; The &lt;code&gt;format&lt;/code&gt; parameter on Shopify&#39;s image filters only supports &lt;code&gt;jpg&lt;/code&gt; and &lt;code&gt;pjpg&lt;/code&gt; (progressive JPEG) conversions. It does not let you force WebP or AVIF, because Shopify is already choosing the optimal modern format for each browser on its own. Fighting that is unnecessary and can actually produce a worse result.&lt;/p&gt;
&lt;p&gt;So the real job is not &amp;quot;convert everything to WebP.&amp;quot; The real job is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give Shopify a good, high-quality source image to work from.&lt;/li&gt;
&lt;li&gt;Request it at the correct size for where it displays.&lt;/li&gt;
&lt;li&gt;Let it generate a proper &lt;code&gt;srcset&lt;/code&gt; so each device gets an appropriately sized file.&lt;/li&gt;
&lt;li&gt;Load above-the-fold images eagerly and everything else lazily.&lt;/li&gt;
&lt;li&gt;Reserve layout space so nothing shifts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Almost all of that is done through the right Liquid filters, which we will get to a little later.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;step-1-give-shopify-a-good-source-and-compress-before-upload&quot;&gt;Step 1: Give Shopify a good source, and compress before upload&lt;/h2&gt;
&lt;p&gt;Shopify optimizes delivery, but it cannot un-bloat a badly prepared source file. Do not upload a 20MB, 6000px image straight off a camera or a stock site.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compress and right-size your master image before upload using a tool like Squoosh or TinyPNG (which handles JPEG and PNG despite the name).&lt;/li&gt;
&lt;li&gt;Upload at a sensible maximum: a source somewhere around 2048px on the long edge is plenty for almost any storefront use, since Shopify will generate call the smaller sizes you actually serve.&lt;/li&gt;
&lt;li&gt;Keep PNG only for graphics that genuinely need transparency or crisp edges (logos, icons, line art). Use JPEG or a high-quality source for photography and let the CDN convert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A note on image-optimization apps: they can be useful, but remember every app adds its own script load to every page. If an app is mostly doing compression you could do once before upload, weigh that recurring performance cost against the convenience.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;step-2-serve-images-with-the-right-liquid-filters&quot;&gt;Step 2: Serve images with the right Liquid filters&lt;/h2&gt;
&lt;p&gt;This is where most real theme-level wins live, and where custom-built stores most often go wrong. Shopify gives you a small set of image filters that, used correctly, produce a properly sized, responsive, lazy-loaded &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag with almost no effort.&lt;/p&gt;
&lt;p&gt;A quick but important note on modern versus deprecated filters. Shopify has two generations of image filters. Use the current ones, &lt;code&gt;image_url&lt;/code&gt; and &lt;code&gt;image_tag&lt;/code&gt;, and avoid the deprecated &lt;code&gt;img_url&lt;/code&gt; and &lt;code&gt;img_tag&lt;/code&gt;, which you will still see in a lot of old themes and outdated blog posts. The deprecated filters are exactly the kind of legacy code that quietly holds a store back.&lt;/p&gt;
&lt;h3 id=&quot;image-url-request-the-image-at-a-specific-size&quot;&gt;&lt;code&gt;image_url&lt;/code&gt;: request the image at a specific size&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;image_url&lt;/code&gt; filter builds a CDN URL for an image at the width (and optionally height) you specify. This is how you avoid the classic mistake of shipping a 2000px file into a 400px slot.&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;featured_image &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can constrain both dimensions and control cropping when the target aspect ratio differs from the source:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;featured_image &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; height&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; crop&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;center&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;crop&lt;/code&gt; parameter accepts &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;center&lt;/code&gt;, &lt;code&gt;bottom&lt;/code&gt;, &lt;code&gt;left&lt;/code&gt;, and &lt;code&gt;right&lt;/code&gt;, with &lt;code&gt;center&lt;/code&gt; as the default. There is also a &lt;code&gt;pad_color&lt;/code&gt; parameter (a hex value like &lt;code&gt;&#39;ffffff&#39;&lt;/code&gt;) if you want to pad to an aspect ratio instead of cropping.&lt;/p&gt;
&lt;h3 id=&quot;image-tag-generate-a-proper-responsive-img&quot;&gt;&lt;code&gt;image_tag&lt;/code&gt;: generate a proper responsive &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;On its own, &lt;code&gt;image_url&lt;/code&gt; just gives you a URL. Pipe it into &lt;code&gt;image_tag&lt;/code&gt; and Shopify generates a complete &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element for you, and this is where a lot of the optimization comes for free:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;featured_image &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two things happen automatically here that matter a great deal:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Width and height are set for you.&lt;/strong&gt; By default &lt;code&gt;image_tag&lt;/code&gt; adds &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes derived from the image&#39;s dimensions and aspect ratio. That is exactly what prevents Cumulative Layout Shift: the browser reserves the correct space before the image arrives, so nothing jumps. You do not have to hand-calculate anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A &lt;code&gt;srcset&lt;/code&gt; is generated for you.&lt;/strong&gt; By default &lt;code&gt;image_tag&lt;/code&gt; produces a &lt;code&gt;srcset&lt;/code&gt; with a sensible set of widths up to the size you requested, so each device downloads an appropriately sized file rather than everyone getting the same large image. This is the single biggest bandwidth saving available, and you get it just by using the filter properly.&lt;/p&gt;
&lt;p&gt;You can add attributes like a class:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;featured_image &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; class&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;product__image&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;control-the-responsive-widths-and-sizes-explicitly&quot;&gt;Control the responsive widths and sizes explicitly&lt;/h3&gt;
&lt;p&gt;If you want to define the exact widths in the &lt;code&gt;srcset&lt;/code&gt; rather than accept the defaults, pass &lt;code&gt;widths&lt;/code&gt; as a comma-separated string:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;featured_image
  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; widths&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;400, 600, 800, 1200&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pair that with a &lt;code&gt;sizes&lt;/code&gt; attribute so the browser knows how much space the image occupies at each breakpoint and can pick the smallest sufficient file. A product image that is full width on mobile but half width on desktop, for example:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;featured_image
  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      widths&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;400, 600, 800, 1200&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      sizes&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;(min-width: 750px) 50vw, 100vw&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Getting &lt;code&gt;sizes&lt;/code&gt; right is one of the highest-value, most-overlooked pieces of image optimization, because without it the browser has to guess and often downloads more than it needs.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;step-3-handle-lazy-loading-correctly-and-know-the-one-exception&quot;&gt;Step 3: Handle lazy loading correctly (and know the one exception)&lt;/h2&gt;
&lt;p&gt;Lazy loading defers below-the-fold images until the shopper scrolls toward them, so the initial paint only handles what is actually visible.&lt;/p&gt;
&lt;p&gt;Here is the useful part: &lt;code&gt;image_tag&lt;/code&gt; handles this intelligently on its own. Unless you apply a &lt;code&gt;preload&lt;/code&gt; attribute, Shopify automatically sets &lt;code&gt;loading&lt;/code&gt; to &lt;code&gt;lazy&lt;/code&gt; for images further down the page. In other words, correct default behavior comes built in when you use the filter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The critical exception is your above-the-fold hero or main product image.&lt;/strong&gt; That image is almost certainly your LCP element, and it must not be lazy-loaded. You want it to load eagerly, and ideally preloaded. You should not lazy-load images above the fold. If your theme&#39;s default logic gets this wrong for a given template, Shopify exposes &lt;code&gt;section.index&lt;/code&gt; and &lt;code&gt;section.location&lt;/code&gt; so a developer can write correct above-the-fold logic rather than lazy-loading everything blindly.&lt;/p&gt;
&lt;p&gt;This is exactly the kind of thing custom theme work frequently breaks. Either it strips the smart defaults and lazy-loads the hero (tanking LCP), or it removes lazy loading entirely (bloating the initial load). If your store has had custom development, this is worth checking explicitly, because it is one of the most common hidden LCP killers.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;step-4-layout-stability-comes-from-letting-the-filters-set-dimensions&quot;&gt;Step 4: Layout stability comes from letting the filters set dimensions&lt;/h2&gt;
&lt;p&gt;Cumulative Layout Shift, the annoying jump where you go to tap a button and it moves, is very often caused by images that do not reserve their space before loading.&lt;/p&gt;
&lt;p&gt;The fix is mostly already covered above: because &lt;code&gt;image_tag&lt;/code&gt; sets &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes by default from the image&#39;s real aspect ratio, using it correctly protects your CLS almost automatically. Where stores get into trouble is hand-rolling raw &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags without dimensions, or overriding those attributes. If you build &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; markup manually, always set explicit dimensions or wrap the image in a container with a reserved aspect ratio. There is no cost to doing this and a real cost to skipping it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;step-5-handle-video-without-wrecking-performance&quot;&gt;Step 5: Handle video without wrecking performance&lt;/h2&gt;
&lt;p&gt;Video is powerful for conversion but dangerous for speed if handled naively. A self-hosted video file can dwarf every other asset on the page combined. Shopify gives you two Liquid filters that make this much safer.&lt;/p&gt;
&lt;h3 id=&quot;shopify-hosted-video-video-tag&quot;&gt;Shopify-hosted video: &lt;code&gt;video_tag&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;For video uploaded to Shopify (product media or files), use the &lt;code&gt;video_tag&lt;/code&gt; filter rather than hand-writing a &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;media_type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;video&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;video_tag&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The reason this matters for performance. When you upload an MP4, Shopify also generates an HLS (&lt;code&gt;m3u8&lt;/code&gt;) source alongside it. HLS lets the player adapt the stream to the visitor&#39;s connection quality rather than forcing everyone to download one heavy file, and the player falls back to the MP4 if HLS is not supported. You get adaptive streaming essentially for free by using the filter. One caveat worth knowing, if you enable &lt;code&gt;loop&lt;/code&gt;, Shopify intentionally does not use the HLS source, so it can cache the video via progressive download instead.&lt;/p&gt;
&lt;h3 id=&quot;external-video-youtube-vimeo-external-video-tag&quot;&gt;External video (YouTube/Vimeo): &lt;code&gt;external_video_tag&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;For video hosted on YouTube or Vimeo, use &lt;code&gt;external_video_tag&lt;/code&gt;, which generates the embed iframe for you and lets you pass player options:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;media_type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;external_video&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;host &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;youtube&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;external_video_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;white&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;external_video_tag&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;elsif&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;host &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;vimeo&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;media&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;external_video_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; loop&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; muted&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;1&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;external_video_tag&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Offloading video to YouTube or Vimeo keeps the heavy delivery and transcoding off your critical path entirely.&lt;/p&gt;
&lt;h3 id=&quot;general-video-rules&quot;&gt;General video rules&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do not self-host large, unoptimized video&lt;/strong&gt; on the storefront. Prefer Shopify-hosted video (for the automatic HLS benefit) or an external host.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lazy-load or facade your video.&lt;/strong&gt; A &amp;quot;click to play&amp;quot; thumbnail that only loads the real player on interaction keeps the initial page light.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never autoplay heavy video above the fold.&lt;/strong&gt; If you want motion in the hero, a short compressed muted clip is far lighter than a full player, and you should still test its effect on LCP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replace animated GIFs with video.&lt;/strong&gt; GIFs are enormous: a single two-second GIF can hold 20-plus frames, and two or three of them can add 10MB or more to a page. A short compressed MP4 is a fraction of the size at better quality.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;a-quick-checklist&quot;&gt;A quick checklist&lt;/h2&gt;
&lt;p&gt;Before you consider your media optimized, verify:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Source images compressed and sensibly sized before upload (no raw 20MB masters).&lt;/li&gt;
&lt;li&gt;Images served through &lt;code&gt;image_url&lt;/code&gt; and &lt;code&gt;image_tag&lt;/code&gt;, not the deprecated &lt;code&gt;img_url&lt;/code&gt; / &lt;code&gt;img_tag&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Each image requested at an appropriate &lt;code&gt;width&lt;/code&gt; for where it displays, not the full source size.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;srcset&lt;/code&gt; present (the &lt;code&gt;image_tag&lt;/code&gt; default, or explicit &lt;code&gt;widths&lt;/code&gt;) plus a correct &lt;code&gt;sizes&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes present on every image so nothing shifts.&lt;/li&gt;
&lt;li&gt;The above-the-fold hero loading eagerly (or preloaded); everything below lazy-loaded.&lt;/li&gt;
&lt;li&gt;Video served via &lt;code&gt;video_tag&lt;/code&gt; (Shopify-hosted, gets HLS) or &lt;code&gt;external_video_tag&lt;/code&gt; (YouTube/Vimeo), never a heavy autoplaying self-hosted file.&lt;/li&gt;
&lt;li&gt;No animated GIFs, short MP4s used where motion is needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then re-run PageSpeed Insights on a product page, mobile first, and watch LCP and CLS both improve.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;reference&quot;&gt;Reference&lt;/h2&gt;
&lt;p&gt;The Liquid filters covered here are documented on Shopify&#39;s developer site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image_url&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/image_url&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image_tag&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/image_tag&lt;/li&gt;
&lt;li&gt;&lt;code&gt;video_tag&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/video_tag&lt;/li&gt;
&lt;li&gt;&lt;code&gt;external_video_tag&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/external_video_tag&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-bottom-line&quot;&gt;The bottom line&lt;/h2&gt;
&lt;p&gt;Most image and video optimization on Shopify is really about &lt;em&gt;using the platform correctly&lt;/em&gt;. Give the CDN a clean source, request the right sizes, and let the modern Liquid filters generate responsive, lazy-loaded, dimension-locked markup for you. The CDN handles WebP and AVIF negotiation on its own, so the work is sizing, &lt;code&gt;srcset&lt;/code&gt;, &lt;code&gt;sizes&lt;/code&gt;, and load order, not manual format conversion.&lt;/p&gt;
&lt;p&gt;Where it gets genuinely technical is in the theme itself: correct &lt;code&gt;sizes&lt;/code&gt; values per template, right handling of the above-the-fold exception, video facades, and untangling the deprecated filters and hand-rolled markup that older custom themes are full of. That is exactly the part DIY efforts tend to get wrong. If your images are dragging your store down and you would rather have the media pipeline built correctly in your theme and verified against your Core Web Vitals, that is a good place to bring in a specialist.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to Actually Improve Your Shopify Lighthouse Score and Core Web Vitals</title>
    <link href="https://shoptimizehq.com/blog/improve-lighthouse-core-web-vitals/" />
    <updated>2026-07-25T00:00:00Z</updated>
    <id>https://shoptimizehq.com/blog/improve-lighthouse-core-web-vitals/</id>
    <content type="html">&lt;p&gt;You ran PageSpeed Insights, got a red number in the 30s, and now you want to know how to make it green. This guide explains what that number really means, why chasing 100 is the wrong goal, and exactly which levers move Core Web Vitals on a Shopify store, in the order that gets you the most improvement per hour of effort.&lt;/p&gt;
&lt;p&gt;Core Web Vitals are a confirmed ranking signal, so this is not vanity. A slow store ranks lower, bounces more, and converts worse, especially on mobile, which is now the majority of Shopify traffic. But the way most store owners approach the score actively wastes their time. Let us fix that first.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;first-stop-chasing-100&quot;&gt;First, stop chasing 100&lt;/h2&gt;
&lt;p&gt;Most Shopify performance work fails for one reason: the team treats a perfect 100/100 lab score as the target. It is not achievable, or worth achieving, for a real store carrying product photography, reviews, and a few genuinely useful apps.&lt;/p&gt;
&lt;p&gt;A healthy mobile PageSpeed score for a real, revenue-generating Shopify store sits between 60 and 80. Above 80 is excellent. For context, the top three organic results on most commercial search queries load in about 1.8 to 2.4 seconds and score above 75 on mobile. That is the bar to clear to compete, not a synthetic hundred.&lt;/p&gt;
&lt;p&gt;So the goal is not &amp;quot;green everywhere.&amp;quot; The goal is: LCP under 2.5s, INP under 200ms, CLS under 0.1, on mobile, on your money-making templates. Hit that and the score takes care of itself.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;lab-data-vs-field-data-know-which-one-you-are-looking-at&quot;&gt;Lab data vs field data: know which one you are looking at&lt;/h2&gt;
&lt;p&gt;This trips people up constantly, so it is worth being precise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab data&lt;/strong&gt; is a simulated, single load in a controlled environment. Lighthouse (in Chrome DevTools) and the lab section of PageSpeed Insights produce it. It is repeatable and perfect for diagnosing specific causes. It does not reflect what your actual customers experienced.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Field data&lt;/strong&gt; is aggregated from real visits. Google evaluates Core Web Vitals at the 75th percentile of real-user sessions, split across mobile and desktop. This is what feeds ranking signals. When you run a URL through PageSpeed Insights, the top of the report shows this field data, drawn from the Chrome User Experience Report (CrUX), a rolling 28-day dataset of real Chrome users, provided your store gets enough traffic to be included. PageSpeed Insights itself is a one-time check rather than a dashboard, so for tracking trends over time, Shopify&#39;s own Web Performance reports are the better tool (though that data can lag up to 36 hours).&lt;/p&gt;
&lt;p&gt;The practical rule: &lt;strong&gt;field data tells you what to prioritize, lab data tells you how to fix it.&lt;/strong&gt; If your field LCP is bad, use the Lighthouse lab diagnostics to find the render-blocking resource or oversized image causing it. Do not fix things that only look bad in lab but are fine in the field.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-three-metrics-and-what-actually-drives-each-one&quot;&gt;The three metrics, and what actually drives each one&lt;/h2&gt;
&lt;h3 id=&quot;lcp-largest-contentful-paint-target-under-2-5s&quot;&gt;LCP (Largest Contentful Paint) — target under 2.5s&lt;/h3&gt;
&lt;p&gt;LCP measures how long until the largest visible element finishes rendering, usually your hero image or main heading. On Shopify, this is almost always the metric to fix first, and it is almost always dominated by images.&lt;/p&gt;
&lt;p&gt;What drives it up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A large, uncompressed hero image above the fold.&lt;/li&gt;
&lt;li&gt;The hero image lazy-loaded by mistake (it should load eagerly).&lt;/li&gt;
&lt;li&gt;Render-blocking CSS or JavaScript delaying the paint.&lt;/li&gt;
&lt;li&gt;Slow server response, though on Shopify&#39;s infrastructure this is rarely the bottleneck.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How to fix it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compress the hero source before upload. You do not need to convert it to WebP or AVIF yourself; Shopify&#39;s CDN negotiates the best modern format per browser automatically when you serve through the image filters.&lt;/li&gt;
&lt;li&gt;Right-size the image to the space it fills. A 2000px file in a 500px slot delays everything. Request the size you need with &lt;code&gt;image_url&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;section&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;settings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hero &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1500&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; preload&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;That &lt;code&gt;preload: true&lt;/code&gt; sends a preload resource hint for your LCP image, which is one of the most direct LCP wins available. Use it only on the above-the-fold hero, never site-wide.&lt;/li&gt;
&lt;li&gt;Make sure the hero loads eagerly, not lazily. &lt;code&gt;image_tag&lt;/code&gt; lazy-loads below-the-fold images by default, which is what you want everywhere except the hero. Custom theme work frequently breaks this split, so check it explicitly.&lt;/li&gt;
&lt;li&gt;Defer non-critical scripts so they stop blocking the paint (see INP below).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;inp-interaction-to-next-paint-target-under-200ms&quot;&gt;INP (Interaction to Next Paint) — target under 200ms&lt;/h3&gt;
&lt;p&gt;INP replaced First Input Delay. It measures how quickly the page responds when someone taps or clicks. A high INP means the page looks loaded but is not yet responsive, because the browser&#39;s main thread is busy running JavaScript.&lt;/p&gt;
&lt;p&gt;What drives it up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Too many third-party app scripts competing for the main thread.&lt;/li&gt;
&lt;li&gt;Heavy tracking tags and tag managers firing early.&lt;/li&gt;
&lt;li&gt;Chat widgets, heatmaps, and popup logic loading before the user can interact.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How to fix it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is an app-and-script problem, so the fix is the app audit (see below).&lt;/li&gt;
&lt;li&gt;Defer non-critical JavaScript so it runs after the page is interactive. Any script you control in the theme should load with &lt;code&gt;defer&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;theme.js&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;asset_url&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;defer&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Remove tracking and marketing scripts that fire before interaction.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cls-cumulative-layout-shift-target-under-0-1&quot;&gt;CLS (Cumulative Layout Shift) — target under 0.1&lt;/h3&gt;
&lt;p&gt;CLS measures how much the layout jumps around while loading. It is the one shoppers feel viscerally, the &amp;quot;I tried to tap the button and it moved&amp;quot; frustration.&lt;/p&gt;
&lt;p&gt;What drives it up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Images without explicit width and height, so the browser does not reserve space.&lt;/li&gt;
&lt;li&gt;App or ad content injected into the layout after initial render.&lt;/li&gt;
&lt;li&gt;Web fonts loading late and reflowing text.&lt;/li&gt;
&lt;li&gt;Banners or announcement bars that appear after paint and push content down.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How to fix it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set explicit width and height (or a reserved aspect-ratio container) on every image. The good news: &lt;code&gt;image_tag&lt;/code&gt; adds &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; for you automatically from the image&#39;s real aspect ratio, so simply using it correctly protects most of your CLS. Hand-rolled &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags without dimensions are the usual culprit. (See our &lt;a href=&quot;https://shoptimizehq.com/blog/shopify-image-video-optimization/&quot;&gt;post on image and video optimization&lt;/a&gt; for more on this.)&lt;/li&gt;
&lt;li&gt;Reserve space for anything injected late, including app widgets and banners.&lt;/li&gt;
&lt;li&gt;Control font loading with &lt;code&gt;font_face&lt;/code&gt; and &lt;code&gt;font-display: swap&lt;/code&gt;, and limit font families to reduce late reflow:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; settings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type_body_font &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;font_face&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; font_display&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;swap&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endstyle&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-fix-order-that-gives-you-the-most-improvement-per-hour&quot;&gt;The fix order that gives you the most improvement per hour&lt;/h2&gt;
&lt;p&gt;Do these in order. The early ones do most of the work.&lt;/p&gt;
&lt;h3 id=&quot;1-audit-and-remove-apps&quot;&gt;1. Audit and remove apps&lt;/h3&gt;
&lt;p&gt;App sprawl is the single biggest cause of slow Shopify stores, ahead of the platform, the theme, or anything else. Nearly every app injects scripts on every page load whether or not the shopper uses that feature, and they pile onto the main thread and wreck INP.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;List every installed app in your admin.&lt;/li&gt;
&lt;li&gt;Remove any that are not clearly earning their keep. Uninstalling beats disabling, because stopped apps leave residual code.&lt;/li&gt;
&lt;li&gt;Then disable leftover embeds under &lt;strong&gt;Online Store &amp;gt; Themes &amp;gt; Customize &amp;gt; App embeds&lt;/strong&gt;. This is the step everyone forgets. The app is gone but its embed still fires.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-compress-and-fix-images&quot;&gt;2. Compress and fix images&lt;/h3&gt;
&lt;p&gt;Images are roughly 27% of page weight and the number one drag on LCP. Compress the source before upload, serve through &lt;code&gt;image_url&lt;/code&gt; / &lt;code&gt;image_tag&lt;/code&gt; (which set dimensions and generate a &lt;code&gt;srcset&lt;/code&gt; for you, and let the CDN handle WebP/AVIF), right-size to the display, and confirm the hero loads eagerly while everything below the fold is lazy-loaded. Done properly this can cut page weight 60 to 70%.&lt;/p&gt;
&lt;h3 id=&quot;3-defer-non-critical-third-party-scripts&quot;&gt;3. Defer non-critical third-party scripts&lt;/h3&gt;
&lt;p&gt;Tracking pixels, chat, heatmaps, and popup logic almost never need to fire before the shopper can interact. Defer them. This is the biggest single lever on INP after the app audit.&lt;/p&gt;
&lt;h3 id=&quot;4-address-the-theme&quot;&gt;4. Address the theme&lt;/h3&gt;
&lt;p&gt;If the store carries heavy legacy theme code, the first three steps will move the number but often will not push it past 60 on their own. Themes built on Online Store 2.0 with section groups load faster than older customized themes carrying years of edits. Minify CSS and JS, remove unused sections, and keep Liquid loops tight. For a store with real performance debt, a controlled rebuild on modern architecture frequently pays back faster than fixing it piece by piece.&lt;/p&gt;
&lt;p&gt;One theme-level lever worth knowing at the code level: Shopify&#39;s &lt;code&gt;image_tag&lt;/code&gt; already lazy-loads below-the-fold images by default, but if your theme needs custom control over which sections count as &amp;quot;above the fold,&amp;quot; the &lt;code&gt;section.index&lt;/code&gt; property tells you a section&#39;s position on the page. A common pattern is to load eagerly for the first few sections and lazily below them:&lt;/p&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;section&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;index &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; loading&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;lazy&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is exactly the kind of logic custom themes get wrong, either lazy-loading everything (including the hero, which tanks LCP) or nothing (which bloats the initial load).&lt;/p&gt;
&lt;p&gt;A representative real-world path: a store starting at a mobile PageSpeed score of 20 reached 59 after one focused sprint, then 89 after a second pass plus a controlled theme rebuild. The jump from the 20s to the high 80s came from theme-level work, not from tweaks.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;measure-the-right-templates&quot;&gt;Measure the right templates&lt;/h2&gt;
&lt;p&gt;Do not judge your whole store by the homepage. Every template type (home, collection, product, cart, blog) has its own bottlenecks, and a product page loading a dozen media assets and three widgets behaves nothing like the homepage. Test each type separately, mobile first, and prioritize product and collection pages because that is where purchases happen.&lt;/p&gt;
&lt;p&gt;Take a screenshot of your baseline before you start. You will want the before-and-after, and re-measure after each meaningful change so you know what actually moved.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-honest-maintenance-reality&quot;&gt;The honest maintenance reality&lt;/h2&gt;
&lt;p&gt;A good score is not permanent. New apps, theme updates, and seasonal content all push the numbers back down; a store gets heavier unless someone tunes it. Install a Web Vitals monitor, set alerts for when LCP or INP regresses, and review monthly.&lt;/p&gt;
&lt;p&gt;Everything here is doable yourself, and it is the right sequence. The catch is that getting from a red 30s score into a solid green 80s usually requires the theme-level engineering in step four, which is where the work gets genuinely technical and where most DIY efforts stall in the low 60s. If you would rather have your Core Web Vitals brought into the green and kept there to a measurable standard, that is the kind of work worth handing to someone who does it every day.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;reference&quot;&gt;Reference&lt;/h2&gt;
&lt;p&gt;The Liquid filters and objects referenced here are documented on Shopify&#39;s developer site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image_url&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/image_url&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image_tag&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/image_tag&lt;/li&gt;
&lt;li&gt;&lt;code&gt;font_face&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/font_face&lt;/li&gt;
&lt;li&gt;&lt;code&gt;section&lt;/code&gt; object (&lt;code&gt;section.index&lt;/code&gt;): https://shopify.dev/docs/api/liquid/objects/section&lt;/li&gt;
&lt;li&gt;Performance best practices for Shopify themes: https://shopify.dev/docs/storefronts/themes/best-practices/performance&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>The Complete Guide to Optimizing a Shopify Store (Front to Back)</title>
    <link href="https://shoptimizehq.com/blog/complete-shopify-optimization-guide/" />
    <updated>2026-07-25T00:00:00Z</updated>
    <id>https://shoptimizehq.com/blog/complete-shopify-optimization-guide/</id>
    <content type="html">&lt;p&gt;Most Shopify stores are leaving money on the table, not because the products are wrong or the marketing is weak, but because the store itself is slow, cluttered, and quietly bleeding conversions at every stage of the funnel. &lt;strong&gt;A one-second delay in load time can reduce conversions by around 7%.&lt;/strong&gt; For a store doing $50K a month, that is roughly $3,500 in monthly revenue lost to nothing but latency.&lt;/p&gt;
&lt;p&gt;This guide walks through how to optimize a Shopify store end to end. How it is built, how fast it loads, how it renders, and how it converts. It is thorough on purpose. If you work through all of it carefully, you can meaningfully move your numbers.&lt;/p&gt;
&lt;p&gt;A quick orientation before we start. Optimization on Shopify breaks into four layers that build on each other:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Measurement.&lt;/strong&gt; You cannot improve what you are not measuring correctly, and most people measure it wrong.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The foundation.&lt;/strong&gt; Theme architecture and app load. This is where the majority of real speed lives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rendering and delivery.&lt;/strong&gt; Images, fonts, scripts, and the critical rendering path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conversion.&lt;/strong&gt; Turning the faster, cleaner store into more completed checkouts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Work in that order. Fixing conversion elements on a store that takes six seconds to load is like repainting a car with a seized engine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;part-1-measure-correctly-before-you-touch-anything&quot;&gt;Part 1: Measure correctly before you touch anything&lt;/h2&gt;
&lt;p&gt;The single most common mistake in Shopify optimization is chasing a Lighthouse score on the homepage and calling it done. Lab scores from a single URL are diagnostic tools, not the goal. What actually matters is what real users experience across your real templates.&lt;/p&gt;
&lt;h3 id=&quot;understand-the-two-kinds-of-data&quot;&gt;Understand the two kinds of data&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Lab data&lt;/strong&gt; comes from tools like Lighthouse and PageSpeed Insights running a simulated load in a controlled environment. It is repeatable and great for diagnosing specific causes like render-blocking resources, oversized images, layout shift sources. It does not tell you what your customers experienced.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Field data&lt;/strong&gt; is real-user monitoring, aggregated from actual visits. Google evaluates Core Web Vitals at the 75th percentile of real sessions, split across mobile and desktop. This is what feeds into search ranking signals and what reflects your actual revenue exposure.&lt;/p&gt;
&lt;p&gt;You need both. Lab data tells you &lt;em&gt;why&lt;/em&gt; something is slow. Field data tells you &lt;em&gt;whether it matters&lt;/em&gt; and &lt;em&gt;to whom&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-three-metrics-that-matter&quot;&gt;The three metrics that matter&lt;/h3&gt;
&lt;p&gt;Google&#39;s Core Web Vitals are the throughline for both user experience and rankings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LCP (Largest Contentful Paint):&lt;/strong&gt; time until the largest visible element (usually the hero image or main heading) finishes rendering. Target: under 2.5 seconds. On Shopify this is the highest-impact metric, and it is almost always dominated by images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INP (Interaction to Next Paint):&lt;/strong&gt; how quickly the page responds to user interaction. This replaced First Input Delay. Target: under 200ms. High values mean the page looks ready but is not yet responsive, usually because of heavy JavaScript from apps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLS (Cumulative Layout Shift):&lt;/strong&gt; how much the layout jumps around while loading. Target: under 0.1. Caused by images without set dimensions, injected ad or app content, and late-loading fonts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;test-the-templates-that-make-money-not-just-the-homepage&quot;&gt;Test the templates that make money, not just the homepage&lt;/h3&gt;
&lt;p&gt;Every Shopify template type behaves differently. Your homepage, collection pages, product pages, cart, and blog posts each have their own bottlenecks. A product template loading a dozen media assets and three review widgets will behave nothing like your homepage. Test each type separately, and prioritize the product and collection pages, because that is where purchase decisions happen.&lt;/p&gt;
&lt;h3 id=&quot;your-measurement-toolkit&quot;&gt;Your measurement toolkit&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PageSpeed Insights&lt;/strong&gt; (free): lab plus field data, LCP/INP/CLS, and specific recommendations. Run it per template, mobile first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lighthouse&lt;/strong&gt; (in Chrome DevTools): deeper lab diagnosis of render-blocking resources and script cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shopify&#39;s built-in Web Performance reports&lt;/strong&gt; (Online Store &amp;gt; Themes, and Analytics): real-user LCP, INP, and CLS over time and by page type. Note that this data can lag by up to 36 hours, so treat it as a directional record rather than an instant QA check.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebPageTest&lt;/strong&gt;: waterfall view of exactly what loads in what order, which is invaluable for finding what is blocking the critical path.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Set a baseline for every key template before you change anything.&lt;/p&gt;
&lt;h3 id=&quot;a-realistic-target&quot;&gt;A realistic target&lt;/h3&gt;
&lt;p&gt;Do not chase 100/100. Most Shopify performance work fails because teams treat the perfect lab score as the objective. A real store carrying product photography and a few genuinely useful apps that scores 60 to 80 on mobile PageSpeed, with LCP under 2.5s, is in healthy shape. The top three organic results on most commercial queries load in roughly 1.8 to 2.4 seconds. That is the bar to clear to compete, not a synthetic hundred.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;part-2-the-foundation-theme-and-apps&quot;&gt;Part 2: The foundation (theme and apps)&lt;/h2&gt;
&lt;p&gt;This is where the biggest wins live, and where most guides stay superficial. If the foundation is heavy, nothing you do downstream will save you.&lt;/p&gt;
&lt;h3 id=&quot;app-sprawl-is-the-number-one-killer&quot;&gt;App sprawl is the number one killer&lt;/h3&gt;
&lt;p&gt;The single biggest cause of slow Shopify stores is third-party app sprawl, not the platform itself. Here is the mechanism, which is worth understanding rather than just accepting: nearly every Shopify app injects JavaScript, CSS, or both into your storefront on every page load, regardless of whether a visitor ever uses that app&#39;s feature. A reviews app, an upsell app, a currency converter, a chat widget, and a popup tool each add their own scripts, their own render cost, and often their own external network requests. The effect compounds. Ten apps do not add ten small costs; they add ten scripts competing for the main thread, and INP falls apart.&lt;/p&gt;
&lt;p&gt;How to fix it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your Shopify admin and list every installed app.&lt;/li&gt;
&lt;li&gt;For each one, ask a blunt question: is this app actively earning its keep in revenue or operations? If you cannot answer yes with confidence, it goes.&lt;/li&gt;
&lt;li&gt;Uninstall the ones that fail. Uninstalling matters more than disabling, because stopped apps often leave residual code behind.&lt;/li&gt;
&lt;li&gt;Then go to &lt;strong&gt;Online Store &amp;gt; Themes &amp;gt; Customize &amp;gt; App embeds&lt;/strong&gt; and disable any leftover app embeds from apps you have already removed. This is a commonly missed step. The app is gone but its embed is still firing.&lt;/li&gt;
&lt;li&gt;Where two apps do overlapping jobs, consolidate to one.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Stopping a script from loading is always faster than optimizing it. This step alone, done honestly, moves more stores than any other single change.&lt;/p&gt;
&lt;h3 id=&quot;theme-architecture&quot;&gt;Theme architecture&lt;/h3&gt;
&lt;p&gt;Your theme is the foundation of the storefront: it controls templates, sections, scripts, styles, product media, collection grids, and menus. Heavy, outdated, or animation-laden themes carrying years of legacy code will hold you back no matter what else you do.&lt;/p&gt;
&lt;p&gt;Guidance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prefer Online Store 2.0 themes with section groups.&lt;/strong&gt; They load faster and are cleaner to maintain than older customized themes carrying accumulated legacy code. Horizon, Dawn, Impulse, and Prestige are reliable performance-focused starting points.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not switch themes on a demo score alone.&lt;/strong&gt; A theme demo store has no apps, no real product data, and idealized images. Test any candidate theme in a development environment with your actual products, images, menus, apps, and templates before committing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove unused sections and dead code.&lt;/strong&gt; Themes accumulate cruft (a technical term 😅). If a section is not used on any live template, it is still shipping code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minify CSS and JavaScript&lt;/strong&gt; in your theme files to strip whitespace, comments, and dead code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;when-a-rebuild-beats-incremental-fixes&quot;&gt;When a rebuild beats incremental fixes&lt;/h3&gt;
&lt;p&gt;If a store carries significant performance debt, a custom theme stacked with years of edits, broken lazy loading, tangled Liquid, a controlled rebuild on a modern Online Store 2.0 architecture often pays back faster than fixing it tip by tip. A representative real-world example: a store that arrived at a mobile PageSpeed score of 20 climbed to 59 in one optimization sprint, then to 89 after a second pass plus a controlled theme rebuild. Incremental work rarely takes a store from the 20s into the high 80s on its own; theme-level work is what breaks that ceiling.&lt;/p&gt;
&lt;h3 id=&quot;liquid-discipline&quot;&gt;Liquid discipline&lt;/h3&gt;
&lt;p&gt;Shopify&#39;s Liquid templating is powerful but not free at scale. Features like mega menus, AJAX carts, dynamic recommendations, and complex collection filtering all execute work on every render. A well-structured store does not make the browser recompute things it does not need. Keep loops tight, avoid deeply nested queries in high-traffic templates, and be deliberate about how much dynamic logic runs above the fold.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;part-3-rendering-and-delivery&quot;&gt;Part 3: Rendering and delivery&lt;/h2&gt;
&lt;p&gt;With the foundation clean, this is where you sharpen perceived and actual load speed.&lt;/p&gt;
&lt;h3 id=&quot;images-the-biggest-single-lever-on-lcp&quot;&gt;Images: the biggest single lever on LCP&lt;/h3&gt;
&lt;p&gt;Images typically account for around 27% of total page weight, and unoptimized images are the number one drag on Shopify LCP. Because there is a lot of depth here, images and video get &lt;a href=&quot;https://shoptimizehq.com/blog/shopify-image-video-optimization/&quot;&gt;their own dedicated guide&lt;/a&gt;, but the essentials:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Let Shopify&#39;s CDN pick the format.&lt;/strong&gt; You do not need to convert to WebP or AVIF yourself. Shopify&#39;s CDN detects what each visitor&#39;s browser supports and serves the optimal modern format automatically, as long as you serve images through the Liquid image filters. The &lt;code&gt;format&lt;/code&gt; parameter only supports &lt;code&gt;jpg&lt;/code&gt; and &lt;code&gt;pjpg&lt;/code&gt;, so trying to force WebP by hand is both impossible and unnecessary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compress and right-size the source before uploading.&lt;/strong&gt; Do not upload a 4MB hero straight off a camera. A source around 2048px on the long edge is plenty; Shopify generates the smaller sizes you actually serve.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use &lt;code&gt;image_url&lt;/code&gt; and &lt;code&gt;image_tag&lt;/code&gt;, not the deprecated &lt;code&gt;img_url&lt;/code&gt; / &lt;code&gt;img_tag&lt;/code&gt;.&lt;/strong&gt; The modern filters set width and height for you (protecting CLS) and generate a responsive &lt;code&gt;srcset&lt;/code&gt; automatically:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token object&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;featured_image &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;800&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
     widths&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;400, 600, 800&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     sizes&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;(min-width: 750px) 50vw, 100vw&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Load the above-the-fold hero eagerly, lazy-load everything below.&lt;/strong&gt; &lt;code&gt;image_tag&lt;/code&gt; already sets &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; for images further down the page by default. For your LCP hero, do the opposite and preload it:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;section&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;settings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hero &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; width&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1500&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;image_tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; preload&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Themes from 2024 onward generally handle this split by default, but custom theme work frequently breaks it, so verify. The dedicated image guide covers this in depth.&lt;/p&gt;
&lt;h3 id=&quot;fonts&quot;&gt;Fonts&lt;/h3&gt;
&lt;p&gt;Custom fonts are a quiet performance and CLS cost. Discipline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use system fonts where the brand allows; they are effectively instant.&lt;/li&gt;
&lt;li&gt;If using custom or Google Fonts, limit to a maximum of two families and only the weights you actually use.&lt;/li&gt;
&lt;li&gt;Prefer Shopify&#39;s own font library through the &lt;code&gt;font_face&lt;/code&gt; filter, which lets you serve fonts from Shopify&#39;s CDN and control &lt;code&gt;font-display&lt;/code&gt; so text stays visible while the font loads:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;style&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; settings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type_body_font &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;font_face&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; font_display&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;swap&#39;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;endstyle&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Preload only your primary above-the-fold font so text does not flash or shift late.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-critical-rendering-path&quot;&gt;The critical rendering path&lt;/h3&gt;
&lt;p&gt;The goal is to get visible, above-the-fold content painted as fast as possible and defer everything else. Practically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Defer non-critical JavaScript&lt;/strong&gt; so it does not block the initial render. Tracking pixels, chat widgets, heatmaps, and popup logic almost never need to fire before the shopper can interact. In your theme, load scripts with &lt;code&gt;defer&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;custom.js&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;asset_url&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;defer&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;defer&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Preload only what the first paint truly needs.&lt;/strong&gt; Use &lt;code&gt;preload_tag&lt;/code&gt; sparingly for genuinely render-critical assets, and &lt;code&gt;stylesheet_tag&lt;/code&gt; with &lt;code&gt;preload&lt;/code&gt; for a render-blocking stylesheet:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-liquid&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-liquid&quot;&gt;&lt;span class=&quot;token liquid language-liquid&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;theme.css&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;asset_url&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function filter&quot;&gt;stylesheet_tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; preload&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prioritize visible content.&lt;/strong&gt; Restructure asset loading so what the shopper sees first loads first, rather than loading everything at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit marketing tags.&lt;/strong&gt; Tag managers, pixels, and analytics scripts firing before interaction are a common INP wrecker.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cdn-and-caching&quot;&gt;CDN and caching&lt;/h3&gt;
&lt;p&gt;Shopify provides a world-class CDN (powered by Cloudflare) for media and assets at no extra cost, serving files from the nearest edge location globally. You get most of this for free. What you control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Let Shopify handle CDN delivery. Do not fight it with custom overrides.&lt;/li&gt;
&lt;li&gt;Use predictable, stable asset naming so browsers cache effectively.&lt;/li&gt;
&lt;li&gt;Avoid constantly changing assets, which invalidates caching unnecessarily.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;mobile-is-the-real-test&quot;&gt;Mobile is the real test&lt;/h3&gt;
&lt;p&gt;The majority of Shopify traffic in 2026 is mobile, and mobile converts lower than desktop (roughly 1.2% vs 1.9%), so it is both your largest audience and your biggest opportunity. Desktop numbers looking good tells you little. Always test mobile first, on a real device over a throttled connection, not just a fast laptop on office wifi. If it feels slow to you on a phone, it is definitely slow to your customers.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;part-4-conversion-optimization&quot;&gt;Part 4: Conversion optimization&lt;/h2&gt;
&lt;p&gt;A fast store that does not convert is just an efficient way to lose visitors. Once the technical foundation is solid, conversion is where the fast store turns into revenue. The average Shopify store converts between roughly 1.4% and 3.2%; top performers sit at 4 to 6% or higher. Moving from 2% to 3% on the same traffic is a 50% revenue increase with zero additional ad spend.&lt;/p&gt;
&lt;h3 id=&quot;diagnose-the-funnel-before-optimizing&quot;&gt;Diagnose the funnel before optimizing&lt;/h3&gt;
&lt;p&gt;The Shopify funnel runs: land, discover, engage with product, add to cart, check out. Use your analytics to find where visitors actually drop off, then fix that stage rather than guessing. Track add-to-cart rate, checkout initiation rate, and checkout completion rate, not just the top-line conversion number, because those reveal &lt;em&gt;where&lt;/em&gt; the friction is.&lt;/p&gt;
&lt;h3 id=&quot;product-pages-reduce-hesitation-not-just-friction&quot;&gt;Product pages: reduce hesitation, not just friction&lt;/h3&gt;
&lt;p&gt;Most conversion problems are not broken buttons; they are unresolved buyer hesitation. Shoppers arrive interested, scroll, sometimes add to cart, and then something feels unresolved. Your job is to remove uncertainty at each decision point:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lead with value before configuration.&lt;/strong&gt; Put a one or two sentence description directly under the product name that answers &amp;quot;why this, why now&amp;quot; before you ask the shopper to pick size, color, or variant. Asking people to make choices before desire and reassurance are established creates resistance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make variant selection visual.&lt;/strong&gt; Replace dropdowns with clearly labeled buttons or tiles, and separate the decisions visually (size is not frame is not color). Buried dropdowns force mental effort.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set delivery expectations clearly.&lt;/strong&gt; Shoppers frequently hesitate not over price but over not knowing when they will receive the item. State realistic dates or ranges, and explain made-to-order timelines plainly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be specific about materials and quality.&lt;/strong&gt; Vagueness reads as something to hide. Specifics build trust, especially above commodity price points.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structure the information.&lt;/strong&gt; Even good content hurts if it is a wall of text. Break reassurance into scannable blocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;social-proof-and-trust&quot;&gt;Social proof and trust&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Place reviews on product and checkout pages, where trust matters at the moment of decision. Reviews alone can lift conversions 10 to 15%.&lt;/li&gt;
&lt;li&gt;Use varied formats: text, photos, video.&lt;/li&gt;
&lt;li&gt;Show trust badges and secure-checkout signals near the buy button and at checkout.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cart-and-checkout&quot;&gt;Cart and checkout&lt;/h3&gt;
&lt;p&gt;Cart abandonment averages just under 70%. Small improvements here compound:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show line-item and total savings in the cart, and a free-shipping progress indicator if you offer one.&lt;/li&gt;
&lt;li&gt;Reveal shipping costs early. Surprise costs at checkout are a top abandonment cause.&lt;/li&gt;
&lt;li&gt;Enable guest checkout. Forced account creation kills conversions.&lt;/li&gt;
&lt;li&gt;Offer one-tap payment (Shop Pay, Apple Pay, Google Pay).&lt;/li&gt;
&lt;li&gt;Keep mobile checkout single-column. Shopify&#39;s default checkout is already well optimized; be careful with third-party checkout modifications.&lt;/li&gt;
&lt;li&gt;Set up abandoned-cart email recovery. Top stores recover 15 to 25% of abandoned carts this way.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;mobile-conversion-specifics&quot;&gt;Mobile conversion specifics&lt;/h3&gt;
&lt;p&gt;Since mobile is most of your traffic and converts lower, closing that gap is one of the largest available wins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hero image, price, and primary CTA above the fold on standard phone screens.&lt;/li&gt;
&lt;li&gt;Minimum 16px body text with comfortable line height so no one has to zoom.&lt;/li&gt;
&lt;li&gt;Tap targets at least 44 by 44 pixels to prevent mistaps.&lt;/li&gt;
&lt;li&gt;Collapsible menu with clear category labels.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;test-properly&quot;&gt;Test properly&lt;/h3&gt;
&lt;p&gt;Not everything needs a test, some things are just best practice. But for anything ambiguous, run one change at a time so you can isolate the effect, give each test two to four weeks, and root your hypotheses in observed buyer behavior rather than opinion. &lt;strong&gt;Real gains come from changing flows (navigation, product discovery, checkout), not from cosmetic button-color tweaks.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;putting-it-in-order&quot;&gt;Putting it in order&lt;/h2&gt;
&lt;p&gt;If you do nothing else, do these three first, in this order, because they deliver most of the gain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Audit and remove apps (plus their leftover embeds).&lt;/li&gt;
&lt;li&gt;Compress and modernize images, and fix lazy loading.&lt;/li&gt;
&lt;li&gt;Defer non-critical third-party scripts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then measure again. Then move to theme-level work and conversion. Re-measure after each meaningful change so you know what actually moved the number.&lt;/p&gt;
&lt;p&gt;And a final honest note. Speed and conversion optimization is not a one-time project. New apps, theme updates, seasonal traffic, and everyday content additions all push your numbers back down over time. A store naturally gets heavier unless someone periodically tunes it. Install a Web Vitals monitor, set alerts for when LCP or INP regresses, and review monthly.&lt;/p&gt;
&lt;p&gt;This is genuinely doable yourself, and everything above is real. It is also a lot of careful, ongoing, technical work, and the difference between a store that scores 60 and one that scores 88 is usually theme-level engineering and disciplined maintenance. If you would rather have that handled, done to a measurable standard and kept that way, that is exactly the kind of work worth handing to a specialist.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;reference&quot;&gt;Reference&lt;/h2&gt;
&lt;p&gt;The Liquid filters and objects referenced here are documented on Shopify&#39;s developer site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image_url&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/image_url&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image_tag&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/image_tag&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stylesheet_tag&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/stylesheet_tag&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preload_tag&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/preload_tag&lt;/li&gt;
&lt;li&gt;&lt;code&gt;font_face&lt;/code&gt;: https://shopify.dev/docs/api/liquid/filters/font_face&lt;/li&gt;
&lt;li&gt;&lt;code&gt;section&lt;/code&gt; object (&lt;code&gt;section.index&lt;/code&gt;): https://shopify.dev/docs/api/liquid/objects/section&lt;/li&gt;
&lt;li&gt;Performance best practices for Shopify themes: https://shopify.dev/docs/storefronts/themes/best-practices/performance&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>