<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>scandiweb</title>
	<atom:link href="https://scandiweb.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://scandiweb.com/blog</link>
	<description>Success Stories &#124; scandiweb blog</description>
	<lastBuildDate>Fri, 30 Oct 2026 15:41:17 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.8</generator>

<image>
	<url>https://scandiweb.com/blog/wp-content/uploads/2022/08/6277b7d3d3ca4eb3c978a38c_favicon-1.png</url>
	<title>scandiweb</title>
	<link>https://scandiweb.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Reduce Initial Server Response Time: A Guide for eCommerce Stores</title>
		<link>https://scandiweb.com/blog/reduce-initial-server-response-time/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 15:26:00 +0000</pubDate>
				<category><![CDATA[Collection]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[adobe commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[magento 2]]></category>
		<category><![CDATA[magento optimization]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[pagespeed]]></category>
		<category><![CDATA[site performance]]></category>
		<category><![CDATA[website optimization]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26516</guid>

					<description><![CDATA[<p>Got the reduce initial server response time warning? Learn how to measure TTFB, find the slow layer and fix it on Magento, Shopify and headless stores.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/reduce-initial-server-response-time/">Reduce Initial Server Response Time: A Guide for eCommerce Stores</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-reduc wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/solutions/magento/expedio" target=_blank >
        2x Faster Magento with Expedio
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/aws-hosting-services-readymage" target=_blank >
        Magento Hosting (ReadyMage)
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-performance-optimization" target=_blank >
        Magento Performance
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">If you&#8217;ve ever tested your store in Google PageSpeed Insights, or in Lighthouse, the audit tool built into Chrome, and seen the warning &#8220;Reduce initial server response time&#8221;, your server took too long to start sending the page. The check fails when the first bytes of the page&#8217;s HTML take more than 600 ms to arrive. Since October 2025, the same check appears under a new name, &#8220;Server responded slowly&#8221;, in the Document request latency section of PageSpeed Insights.</p>



<p class="wp-block-paragraph">Google also measures that moment on real visits, as time to first byte (TTFB). It counts a page as good when 75% of visits get the first byte within 800 ms. So a store can fail the test in PageSpeed Insights and still pass on real visits, or the other way round.</p>



<p class="wp-block-paragraph">Homepage TTFB is one of the first numbers we look at in our store health checks, and the warning never says which part of the setup is slow. The host, the platform, the theme and the code all get blamed in turn, and each fix only works if it targets the step that is slow on your store.</p>



<h2 class="wp-block-heading">What does &#8220;reduce initial server response time&#8221; mean?</h2>



<p class="wp-block-paragraph">Reduce initial server response time is the Lighthouse warning for a slow main document. It appears when the browser waits more than 600 ms for the server to start sending a page&#8217;s HTML. Lighthouse 13 moved the check into the Document request latency insight, which now reports it as &#8220;Server responded slowly&#8221; next to redirect and compression checks.</p>



<p class="wp-block-paragraph">The main document matters more than any other request because everything else waits for it. Until the HTML arrives, the browser has no list of stylesheets, scripts or images to fetch, so a slow initial server response time delays everything that follows.</p>



<h3 class="wp-block-heading">Where the warning went in Lighthouse 13</h3>



<p class="wp-block-paragraph">Since Lighthouse 13, published on October 10, 2025 and in PageSpeed Insights within a week, the server response check is grouped with the redirect and compression checks in the Document request latency insight. The insight shows three lines, each with a pass and a fail version:</p>



<ul class="wp-block-list">
<li>&#8220;Avoids redirects&#8221; or &#8220;Had redirects (N redirects, +X ms)&#8221;</li>


<li>&#8220;Server responds quickly (observed X ms)&#8221; or &#8220;Server responded slowly (observed X ms)&#8221;</li>


<li>&#8220;Applies text compression&#8221; or &#8220;No compression applied&#8221;</li>

</ul>



<p class="wp-block-paragraph">The threshold stayed at 600 ms, and the performance score didn&#8217;t change, because scoring is based on the metrics rather than the audits. Google&#8217;s <a href="https://developer.chrome.com/docs/performance/insights/document-latency" target="_blank" rel="noopener">Document request latency</a> page lists the three failure conditions and the fix for each.</p>



<h3 class="wp-block-heading">What is a good server response time?</h3>



<p class="wp-block-paragraph">A good server response time is under 600 ms in a Lighthouse test and 800 ms or less for real users at the 75th percentile, as measured by the Chrome UX Report (CrUX). The two numbers measure different things, which is why the same store can pass one and fail the other.</p>



<figure class="wp-block-table"><table><thead><tr><th>Where you see it</th><th>What it measures</th><th>Good</th><th>Flagged</th></tr></thead><tbody><tr><td>Lighthouse 13 / PageSpeed Insights lab (Document request latency)</td><td>Server response for the main HTML, one simulated load, without DNS and redirects</td><td>600 ms or less</td><td>Above 600 ms: &#8220;Server responded slowly&#8221;</td></tr><tr><td>PageSpeed Insights field data (Chrome UX Report)</td><td>TTFB for real Chrome users, 75th percentile, last 28 days</td><td>800 ms or less</td><td>800–1,800 ms needs improvement, above 1,800 ms poor</td></tr><tr><td>Old PageSpeed Insights rule (API v4, shut down 2019)</td><td>Server response time</td><td>Under 200 ms</td><td>Outdated, don&#8217;t use</td></tr></tbody></table><figcaption class="wp-element-caption">What counts as a good server response time</figcaption></figure>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Lighthouse flags the server at 600 ms, and Google&#8217;s field threshold is 800 ms at the 75th percentile. Real shoppers show up in the field number, so check that one first.</p></div>



<h2 class="wp-block-heading">What is TTFB, and what makes up time to first byte?</h2>



<p class="wp-block-paragraph">Time to first byte (TTFB) measures how long a page takes from the start of navigation until the first byte of its response arrives. Google&#8217;s web.dev splits it into five phases: redirect time, service worker startup, DNS lookup, connection and TLS negotiation, and the request itself. That last phase is where the server builds the page.</p>



<p class="wp-block-paragraph">Here are the five phases in order, as <a href="https://web.dev/articles/ttfb" target="_blank" rel="noopener">web.dev defines TTFB</a>:</p>



<ol class="wp-block-list">
<li>Redirect time. Any hop before the final URL, such as http to https or a trailing-slash fix.</li>


<li>Service worker startup time. Only counts if the site registers a service worker.</li>


<li>DNS lookup. Turning the hostname into an IP address.</li>


<li>Connection and TLS negotiation. The TCP handshake and the TLS handshake.</li>


<li>The request itself, until the first byte of the response arrives. This is the phase where the server runs your application and builds the page.</li>

</ol>



<p class="wp-block-paragraph">Field TTFB from CrUX includes all five phases. Lighthouse&#8217;s server response check isolates the last one and leaves DNS and redirect time out. That difference explains most cases where the lab number and the field number disagree. It also means a redirect chain can push a store over the 800 ms field line while the lab check passes, because the lab never saw the redirect.</p>



<p class="wp-block-paragraph">Web.dev adds that TTFB comes before every other loading metric. A slow first byte pushes back First Contentful Paint and Largest Contentful Paint by the same amount, which is why a server fix often moves the rendering metrics too.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-ttfb-phases.png" alt="Time to first byte timeline: redirect, service worker, DNS, connection and TLS, then the server building the page" class="wp-image-26512" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-ttfb-phases.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-ttfb-phases-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-ttfb-phases-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-ttfb-phases-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-ttfb-phases-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-ttfb-phases-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-ttfb-phases-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">TTFB adds up five phases. Field data counts all of them, while Lighthouse&#x27;s server response check only times the last one.</figcaption></figure></div>



<h2 class="wp-block-heading">How to measure TTFB: lab data vs field data</h2>



<p class="wp-block-paragraph">Measure TTFB in two places. Field data from the Chrome UX Report, shown in PageSpeed Insights, tells you what real Chrome users got at the 75th percentile over the last 28 days. Lab tools such as Lighthouse, Chrome DevTools and curl time one request at a time, so you can compare a cached page with an uncached one.</p>



<h3 class="wp-block-heading">Field data: PageSpeed Insights and the Chrome UX Report</h3>



<p class="wp-block-paragraph">Field TTFB is what real Chrome users got, at the 75th percentile, over the last 28 days. PageSpeed Insights labels it an experimental metric and shows it in the field section next to the Core Web Vitals. A page with little traffic may have no field data at all, and then the lab is all you have. Our older guide to <a href="https://scandiweb.com/blog/how-to-and-how-not-to-use-google-pagespeed-insights/" target="_blank" rel="noopener">lab and field data</a> in PageSpeed Insights explains how the two sections are built.</p>



<h3 class="wp-block-heading">Lab data: Lighthouse and Chrome DevTools</h3>



<p class="wp-block-paragraph">Lighthouse times one simulated load and checks the server&#8217;s response against 600 ms, with DNS and redirect time left out. To check TTFB in Chrome yourself, open DevTools, go to the Network panel, click the document request and open the Timing tab. Read the DNS Lookup, Initial connection and Waiting (TTFB) rows. Then do it twice: once on a page the cache has already served, and once on a page it hasn&#8217;t, such as a category URL with a filter combination nobody has used. The gap between the two Waiting (TTFB) values is the first clue about where the time goes.</p>



<h3 class="wp-block-heading">How to check server response time with curl</h3>



<p class="wp-block-paragraph">curl&#8217;s write-out timings show each phase from the command line, with no browser cache in the way. This command prints every phase as a cumulative time from the start of the request:</p>



<pre class="wp-block-code"><code>curl -s -o /dev/null -L -w "dns %{time_namelookup}\nconnect %{time_connect}\ntls %{time_appconnect}\nredirects %{time_redirect}\nfirst byte %{time_starttransfer}\ntotal %{time_total}\n" "https://www.example.com/"</code></pre>



<p class="wp-block-paragraph"><code>time_starttransfer</code> is the time until the first byte was received, and curl&#8217;s documentation notes that it includes the time the server needed to calculate the result. <code>time_redirect</code> is the cost of every redirect step before the final request started. Run the command twice: once as it is, and once with a throwaway query parameter such as <code>?nocache=1234</code> on the URL, which makes most caches treat it as a new page. The difference between the two <code>first byte</code> values is the cost of an uncached page build.</p>



<h3 class="wp-block-heading">Split server time with the Server-Timing header</h3>



<p class="wp-block-paragraph">The Server-Timing response header lets your backend report where its own time went on each request. web.dev&#8217;s example looks like this:</p>



<pre class="wp-block-code"><code>Server-Timing: db;desc="Database";dur=121.3, ssr;desc="Server-side Rendering";dur=212.2</code></pre>



<p class="wp-block-paragraph">The values appear in the Timing tab of Chrome DevTools next to the network phases, and you can collect them from real users through the Navigation Timing API&#8217;s <code>serverTiming</code> property. That turns &#8220;the server is slow&#8221; into &#8220;the database took 121 ms&#8221;. MDN&#8217;s <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Server-Timing" target="_blank" rel="noopener">Server-Timing reference</a> adds a warning: the header can expose application and infrastructure details, so send it only to your own team or to authenticated users.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-lab-vs-field.png" alt="Lab vs field TTFB: Lighthouse times one load against 600 ms, CrUX reports real users at the 75th percentile against 800 ms" class="wp-image-26513" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-lab-vs-field.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-lab-vs-field-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-lab-vs-field-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-lab-vs-field-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-lab-vs-field-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-lab-vs-field-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-lab-vs-field-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Lab tools time one request so you can find the slow phase. Field data tells you what real shoppers got over 28 days.</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Run curl twice on the same URL, once plain and once with a throwaway query parameter. The gap in <code>time_starttransfer</code> is what an uncached page build costs you.</p></div>



<h2 class="wp-block-heading">How to reduce server response time, cause by cause</h2>



<p class="wp-block-paragraph">To reduce server response time, find the slow phase first, then fix that layer. Remove redirects, put a CDN in front to cut DNS, connection and TLS time, cache full pages at the server or edge, give the store enough dedicated hosting, fix slow database queries, and speed up the code that builds each page.</p>



<p class="wp-block-paragraph">Anyone searching for how to reduce initial server response time gets the same six fixes in a fixed order. The order that works is the one your measurements set, because each symptom points at a different layer.</p>



<figure class="wp-block-table"><table><thead><tr><th>What you see</th><th>Likely cause</th><th>First fix</th></tr></thead><tbody><tr><td>Redirect time above zero in curl, or &#8220;Had redirects&#8221; in PageSpeed Insights</td><td>Redirect chain</td><td>Link to the final URL, add HSTS</td></tr><tr><td>Slow DNS or connection rows, worse far from the server</td><td>Network distance</td><td>CDN with nearby edge servers</td></tr><tr><td>Cached pages fast, uncached pages slow</td><td>Slow page build</td><td>Profile code and queries</td></tr><tr><td>Every page slow, worse at busy hours</td><td>Hosting capacity</td><td>Dedicated resources, separate tiers</td></tr><tr><td>First request after a deploy is slow, repeats are fast</td><td>Cold cache</td><td>Faster uncached build, cache rules</td></tr></tbody></table><figcaption class="wp-element-caption">Server response time: symptoms, causes and first fixes</figcaption></figure>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-decision-tree.png" alt="Decision tree to reduce initial server response time: check redirects, network distance, cache misses and hosting" class="wp-image-26514" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-decision-tree.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-decision-tree-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-decision-tree-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-decision-tree-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-decision-tree-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-decision-tree-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/reduce-initial-server-response-time-decision-tree-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Work down the questions in order. The first &quot;yes&quot; tells you which layer to fix first.</figcaption></figure></div>



<h3 class="wp-block-heading">Remove redirects before the real page</h3>



<p class="wp-block-paragraph">Link straight to the final URL. Same-origin redirects are the ones you control: http to https, a missing or extra trailing slash, a hop to a country store. Cross-origin redirects from ad platforms, link shorteners and newsletter tools are often outside your control, so give partners the final URL from the start. Add a <code>Strict-Transport-Security</code> header so returning visitors skip the http hop, and submit the domain to the HSTS preload list to remove it on the first visit too. PageSpeed Insights reports leftover hops as &#8220;Had redirects&#8221; with their cost in ms.</p>



<h3 class="wp-block-heading">Cut DNS, connection and TLS time with a CDN</h3>



<p class="wp-block-paragraph">Put a CDN in front of the store so shoppers connect to an edge server near them. CDN providers usually offer very fast DNS resolution, and they support HTTP/2 or HTTP/3 and current TLS versions, which shortens the connection and TLS phases. Lighthouse lists &#8220;Use a CDN to reduce network latency&#8221; among its own fixes for this audit. Without HTML caching at the edge, the CDN still forwards every page request to the origin and waits for it, so the server phase of TTFB doesn&#8217;t move at all.</p>



<h3 class="wp-block-heading">Cache full pages at the server or the edge</h3>



<p class="wp-block-paragraph">Cache full pages so the application doesn&#8217;t run for most requests. Set <code>Cache-Control</code> headers so the CDN can hold the HTML at the edge, and use a server-side page cache for the rest. Caching can hide a slow backend, and every cache has misses: the first request after a deploy, every request after you <a href="https://scandiweb.com/blog/sometimes-flushing-the-whole-cache-storage-is-the-only-option/" target="_blank" rel="noopener">flush the whole cache</a>, URLs nobody has asked for yet, and pages with many variants, such as one entry per customer group or per search term. A <a href="https://scandiweb.com/blog/magento-cache-warmer/" target="_blank" rel="noopener">cache warmer</a> refills the top pages after a deploy, though it can&#8217;t cover every URL. Those pages still go through the cache. They hit it less often.</p>



<h3 class="wp-block-heading">Give the store enough dedicated hosting</h3>



<p class="wp-block-paragraph">Give the application enough CPU and memory, keep the backend stack updated, and move off crowded shared hosting, which is generally slower. On larger stores, split the tiers. Adobe&#8217;s own guidance for Magento (Adobe Commerce) is to install Varnish on a separate server in front of the web tier. <a href="https://scandiweb.com/blog/server-autoscaling-in-magento-2/" target="_blank" rel="noopener">Server autoscaling</a> adds capacity when traffic peaks, which keeps response times from climbing under load. It leaves a single request exactly as fast as before, so a slow page build needs a different fix.</p>



<h3 class="wp-block-heading">Fix slow database queries</h3>



<p class="wp-block-paragraph">Find the slow queries first. They show up as a large <code>db</code> value in Server-Timing or as entries in the database&#8217;s slow query log. Index the columns your filters and sorts use, and keep the database&#8217;s <code>max_connections</code> setting in line with the number of PHP threads in the application server, as Adobe recommends. Platforms with flexible attribute models are query-heavy by design, and <a href="https://scandiweb.com/blog/magento-series-the-eav-model/" target="_blank" rel="noopener">Magento&#8217;s EAV model</a> is the one most eCommerce teams meet, so query count matters there as much as query speed.</p>



<h3 class="wp-block-heading">Speed up the code that builds each page</h3>



<p class="wp-block-paragraph">Lighthouse&#8217;s doc for this audit, &#8220;Reduce server response times&#8221;, puts application logic first: optimize it to prepare pages faster. Profile the templates, loops, extensions and apps that run on a slow page and remove what doesn&#8217;t earn its time. 103 Early Hints can start asset downloads while the server is still working, and web.dev recommends it when backend work is significant, but it can mask a slow backend, so keep measuring real server time with Server-Timing. Which code to profile depends on the platform: the Magento page build, the Shopify theme&#8217;s Liquid, or the renderer on a headless frontend. The next three sections take them in turn.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>If cached pages are fast and uncached pages are slow, the slow part is the page build, and more caching only covers it up until the next miss.</p></div>



<h2 class="wp-block-heading">How to reduce TTFB on Magento and Adobe Commerce</h2>



<p class="wp-block-paragraph">Magento stores fail TTFB far more often than Shopify stores. In HTTP Archive&#8217;s September 2026 data, 23% of Magento sites had a good TTFB, against 84% (mobile) to 93% (desktop) of Shopify sites. The fixes are Varnish for cached pages, a tuned server stack, and a faster page build for every request the cache can&#8217;t answer.</p>



<p class="wp-block-paragraph">Those figures come from <a href="https://httparchive.org/reports/techreport/tech?tech=Magento,Shopify" target="_blank" rel="noopener">HTTP Archive&#8217;s technology report</a>, which counts the share of sites with a field TTFB of 800 ms or less at the 75th percentile. The Magento share is improving, from 16.6% on mobile in September 2025 to 23.0% a year later. The dataset holds about 13 times more Shopify sites than Magento sites, and HTTP Archive itself warns that correlation doesn&#8217;t equal causation.</p>



<h3 class="wp-block-heading">Cached pages: Varnish and a tuned server stack</h3>



<p class="wp-block-paragraph">Lighthouse&#8217;s whole Magento advice for this audit is one line: &#8220;Use the Varnish integration.&#8221; Adobe says the same with more force. It strongly recommends Varnish in production and calls the built-in full page cache, which writes to the file system or database, much slower. Once Varnish answers the cached pages, the rest of the stack decides how fast the remaining requests are:</p>



<ul class="wp-block-list">
<li>Valkey for cache and sessions on 2.4.9, since Redis cache isn&#8217;t supported there, with cache and sessions kept separate.</li>


<li>Production mode, because default mode isn&#8217;t optimized for production due to how it handles static files.</li>


<li>A supported PHP version (8.5 on 2.4.9, 8.4 or 8.3 on 2.4.8) with OPcache sized for the codebase, for example <code>opcache.memory_consumption=512</code> and <code>opcache.max_accelerated_files=60000</code>.</li>


<li><a href="https://scandiweb.com/blog/magento-indexers-known-issues-and-fixes/" target="_blank" rel="noopener">Indexers</a> set to Update on Schedule, with cron running so the schedule is honored.</li>

</ul>



<p class="wp-block-paragraph">The full list of fixes is in our guide to <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">speed up Magento</a>.</p>



<h3 class="wp-block-heading">Uncached pages: a faster page build with Expedio</h3>



<p class="wp-block-paragraph">Every request the cache can&#8217;t answer goes to PHP: the first request after a deploy or a cache flush, URL combinations no shopper has opened yet, and any page with one <code>cacheable="false"</code> block, which makes the whole page uncacheable. Catalog pages for logged-in customers and search results are cached too, one entry per customer group or search term, but those entries miss far more often than the homepage does, and a flush empties them all. Our guide to the <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">Magento full page cache</a> shows which requests miss and why.</p>



<p class="wp-block-paragraph">For the requests your cache can&#8217;t answer, <a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> makes the server build each Magento page at least 2x faster, measured as TTFB, and lets the same server handle 3x the traffic before response times start to rise. It is scandiweb&#8217;s software for the page build itself. It applies Liquid, the open-source template language created at Shopify, and its core is open source. In a <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">benchmark on one merchant&#8217;s Hyvä store</a>, measured as server response time, pages built with all caches empty took a median of 57 ms instead of 181 ms, and a full category page made 30 database queries instead of 655. Expedio works on Magento Open Source, Adobe Commerce and Commerce Cloud, with any theme and any host, and comes built into ReadyMage hosting. It doesn&#8217;t change the theme, the data, the checkout or the admin.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png" alt="The Expedio page on scandiweb.com with the headline Magento. 2x faster. and buttons to get Expedio or try the demo" class="wp-image-25972" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Expedio makes Magento at least 2x faster without changing your theme or data</figcaption></figure></div>



<h3 class="wp-block-heading">Why a new theme leaves TTFB where it was</h3>



<p class="wp-block-paragraph">A new theme fixes what the browser does, and the server&#8217;s first byte needs server work. HTTP Archive&#8217;s September 2026 data makes the split visible: 23.2% of <a href="https://scandiweb.com/blog/how-to-work-with-hyva/" target="_blank" rel="noopener">Hyvä</a> sites had a good TTFB on mobile, the same share as Magento overall at 23.0%, while 66.4% of them passed all Core Web Vitals on mobile, against 44.6% for Magento overall. The theme moved the rendering metrics and left the first byte alone. A store can run both: a Hyvä frontend for the browser side and a faster page build on the server.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Before you budget for a new theme to fix TTFB, compare a cached page with an uncached one. If only the uncached page is slow, the fix is on the server.</p></div>



<h2 class="wp-block-heading">How to improve TTFB on Shopify</h2>



<p class="wp-block-paragraph">To improve TTFB on Shopify, start with the theme&#8217;s Liquid code. Shopify renders Liquid on the server for every page request, and its developer docs say most of a storefront&#8217;s response time is Liquid rendering. Nested loops over products, variants or options are the most common cause, and Shopify Theme Inspector shows which lines are slow.</p>



<p class="wp-block-paragraph">Shopify&#8217;s TTFB is good for most stores. In September 2026, 83.8% of Shopify sites had a good TTFB on mobile and 92.6% on desktop, so when a Shopify store fails the check, the theme is the first place to look.</p>



<p class="wp-block-paragraph">Install the Shopify Theme Inspector for Chrome, a browser plugin that shows Liquid render profiling data as a flame graph for your own store or any store where you have collaborator access. Load the slow page and read the graph from the widest bars down. Shopify&#8217;s <a href="https://shopify.dev/docs/storefronts/themes/best-practices/performance" target="_blank" rel="noopener">theme performance guidance</a> names the patterns to look for: loops nested across products, variants or options, which grow quadratically with catalog size, iterating all variants of a product, which forces expensive database queries, and metafield access inside loops.</p>



<p class="wp-block-paragraph">Hosting isn&#8217;t a lever here. Shopify runs the platform on a global CDN backed by Cloudflare, and theme assets get HTTP/3, Brotli and edge caching without any setup on your side. Redirects are still worth a check: apps that add their own redirect chains show up in the &#8220;Had redirects&#8221; line, and the curl command above puts a number on them. For the browser-side work that comes after the first byte, our guide to <a href="https://scandiweb.com/blog/shopify-performance-optimization/" target="_blank" rel="noopener">speed up a Shopify store</a> covers apps, images and scripts.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>On Shopify, open Shopify Theme Inspector before blaming apps. Its flame graph shows which Liquid lines take the server&#8217;s time.</p></div>



<h2 class="wp-block-heading">Server response time on headless storefronts</h2>



<p class="wp-block-paragraph">On a headless storefront, TTFB depends on how the frontend server renders HTML. Cache rendered pages at the CDN edge, render pages that need no personalization ahead of time, stream server-rendered HTML so the first bytes leave early, and start API calls in parallel. Server-Timing headers show whether rendering or data fetching is the slow part.</p>



<p class="wp-block-paragraph">In a headless setup the HTML comes from the frontend&#8217;s own server, a Node or edge runtime, which calls the commerce platform&#8217;s APIs and then renders the page. Server response time is rendering time plus API time, and the fixes follow from that split.</p>



<ul class="wp-block-list">
<li>Cache rendered HTML at the CDN edge with <code>Cache-Control</code> headers for pages that look the same to every shopper.</li>


<li>Use static rendering for pages that need no personalization, so they are built ahead of time and served as files.</li>


<li>Stream server-rendered HTML where the runtime supports it, so the first bytes leave before the whole page is ready. Google&#8217;s guide to <a href="https://web.dev/articles/optimize-ttfb" target="_blank" rel="noopener">optimizing TTFB</a> covers both options.</li>


<li>Start API requests in parallel. In Next.js, for example, one slow data request blocks the whole route, so start the requests together and await them with <code>Promise.all</code>.</li>

</ul>



<p class="wp-block-paragraph">Add a Server-Timing header with <code>ssr</code> and <code>api</code> or <code>db</code> entries so you can see whether rendering or data fetching is the slow part. One caveat from web.dev: a server-rendered page can show a higher TTFB than a client-rendered one and still paint content sooner, with a better FCP and LCP, because the browser receives finished HTML. Judge a headless storefront on all three metrics, with TTFB as the one you fix first.</p>



<h2 class="wp-block-heading">Frequently asked questions about reducing initial server response time</h2>



<h3 class="wp-block-heading">Is a 100 ms server response time good?</h3>



<p class="wp-block-paragraph">Yes. A 100 ms server response time is very fast. Lighthouse calculates its estimated savings against a 100 ms target and fails the check only above 600 ms, and Google rates field TTFB of 800 ms or less as good. The 200 ms target still quoted online comes from an old PageSpeed Insights rule written for API version 4, which Google shut down in May 2019.</p>



<h3 class="wp-block-heading">Is TTFB a Core Web Vital?</h3>



<p class="wp-block-paragraph">No. The Core Web Vitals are Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift, and web.dev says plainly that TTFB isn&#8217;t one of them. It still matters because it comes before every other loading metric. A slow first byte pushes back First Contentful Paint and LCP, which leaves less time for everything else on the page.</p>



<h3 class="wp-block-heading">Why is my TTFB so high?</h3>



<p class="wp-block-paragraph">High TTFB usually comes from one of four places: redirects before the real page, a long network path to a distant server, a cache miss that makes the server build the page from scratch, or slow code and database queries during that build. Time the same URL with and without the cache to see which one applies to your store.</p>



<h3 class="wp-block-heading">What does &#8220;Waiting (TTFB)&#8221; mean in Chrome DevTools?</h3>



<p class="wp-block-paragraph">Waiting (TTFB) is a row in the Timing tab of the Chrome DevTools Network panel. It covers the time when the browser is waiting for the first byte of the response, after the request is sent. DNS lookup and initial connection appear as separate rows above it, so a long Waiting (TTFB) bar points at the server.</p>



<h3 class="wp-block-heading">Does a CDN reduce initial server response time?</h3>



<p class="wp-block-paragraph">Yes, in two ways. A CDN shortens DNS, connection and TLS time because shoppers connect to a nearby edge server, and when it caches HTML, those pages never wait on the origin. It can&#8217;t speed up pages it doesn&#8217;t cache, such as the cart, checkout or customer account pages, which still depend on how fast the origin server builds them.</p>



<h3 class="wp-block-heading">Why does PageSpeed Insights show a different TTFB than my own test?</h3>



<p class="wp-block-paragraph">PageSpeed Insights shows two different measurements. The field TTFB comes from real Chrome users over the last 28 days and includes redirects, DNS and connection time. The Lighthouse lab check times one simulated load and leaves DNS and redirect time out. Your own test adds its own location, network and cache state, so the three numbers rarely match.</p>



<h2 class="wp-block-heading">Where to start when you need to reduce initial server response time</h2>



<p class="wp-block-paragraph">To reduce initial server response time, measure before you fix. Check field TTFB in PageSpeed Insights, then time a cached and an uncached page with curl or DevTools to find the slow phase. Redirects and distance are quick wins. A slow page build needs work on caching, hosting, the database or the application code. On Magento, our list of <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">causes of a slow Magento store</a> helps match the symptom to the layer.</p>



<p class="wp-block-paragraph">On Magento, the page build is the layer Expedio speeds up. On Shopify or a headless frontend, profile the Liquid or the renderer.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Is a 100 ms server response time good?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. A 100 ms server response time is very fast. Lighthouse calculates its estimated savings against a 100 ms target and fails the check only above 600 ms, and Google rates field TTFB of 800 ms or less as good. The 200 ms target still quoted online comes from an old PageSpeed Insights rule written for API version 4, which Google shut down in May 2019."}}, {"@type": "Question", "name": "Is TTFB a Core Web Vital?", "acceptedAnswer": {"@type": "Answer", "text": "No. The Core Web Vitals are Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift, and web.dev says plainly that TTFB isn't one of them. It still matters because it comes before every other loading metric. A slow first byte pushes back First Contentful Paint and LCP, which leaves less time for everything else on the page."}}, {"@type": "Question", "name": "Why is my TTFB so high?", "acceptedAnswer": {"@type": "Answer", "text": "High TTFB usually comes from one of four places: redirects before the real page, a long network path to a distant server, a cache miss that makes the server build the page from scratch, or slow code and database queries during that build. Time the same URL with and without the cache to see which one applies to your store."}}, {"@type": "Question", "name": "What does \"Waiting (TTFB)\" mean in Chrome DevTools?", "acceptedAnswer": {"@type": "Answer", "text": "Waiting (TTFB) is a row in the Timing tab of the Chrome DevTools Network panel. It covers the time when the browser is waiting for the first byte of the response, after the request is sent. DNS lookup and initial connection appear as separate rows above it, so a long Waiting (TTFB) bar points at the server."}}, {"@type": "Question", "name": "Does a CDN reduce initial server response time?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, in two ways. A CDN shortens DNS, connection and TLS time because shoppers connect to a nearby edge server, and when it caches HTML, those pages never wait on the origin. It can't speed up pages it doesn't cache, such as the cart, checkout or customer account pages, which still depend on how fast the origin server builds them."}}, {"@type": "Question", "name": "Why does PageSpeed Insights show a different TTFB than my own test?", "acceptedAnswer": {"@type": "Answer", "text": "PageSpeed Insights shows two different measurements. The field TTFB comes from real Chrome users over the last 28 days and includes redirects, DNS and connection time. The Lighthouse lab check times one simulated load and leaves DNS and redirect time out. Your own test adds its own location, network and cache state, so the three numbers rarely match."}}]}</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em>If one of your store&#x27;s pages keeps failing the server response check, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>send it to scandiweb</em></a><em> and we&#x27;ll tell you which layer is slow.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/reduce-initial-server-response-time/">Reduce Initial Server Response Time: A Guide for eCommerce Stores</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Audit Magento Performance: A Checklist to Measure Your Store&#8217;s Real Speed</title>
		<link>https://scandiweb.com/blog/how-to-audit-magento-performance/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 12:38:00 +0000</pubDate>
				<category><![CDATA[Collection]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[adobe commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[magento 2]]></category>
		<category><![CDATA[magento optimization]]></category>
		<category><![CDATA[Magento Support]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[pagespeed]]></category>
		<category><![CDATA[site performance]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26546</guid>

					<description><![CDATA[<p>How to audit Magento performance yourself: time every page type cached and uncached, read Core Web Vitals, and match each number to a fix.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/how-to-audit-magento-performance/">How to Audit Magento Performance: A Checklist to Measure Your Store&#8217;s Real Speed</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-mpaud wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/solutions/magento/expedio" target=_blank >
        2x Faster Magento with Expedio
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-performance-optimization" target=_blank >
        Magento Performance
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/magento-performance-audit" target=_blank >
        Magento Performance Audit
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">A speed test of your Magento homepage times one of the easiest pages your store has to serve. Most visitors arrive there logged out, so Magento (Adobe Commerce) can answer from its full page cache, a set of finished pages kept ready to send, without building anything. Shoppers wait on the pages a homepage test never reaches: a filtered category, a search nobody has run this week, the catalog a logged-in trade customer sees.</p>



<p class="wp-block-paragraph">Auditing Magento performance means timing those pages as well. It measures how long the server takes to start sending each page, called time to first byte (TTFB), both from the cache and built from scratch. It also reads Google&#8217;s Core Web Vitals, three scores for loading, responsiveness and visual stability, taken from real Chrome users&#8217; visits. In September 2026, only 23% of Magento sites had a good TTFB on mobile, against <a href="https://httparchive.org/reports/techreport/tech?tech=Magento" target="_blank" rel="noopener">46% of websites overall</a>.</p>



<h2 class="wp-block-heading">What does auditing Magento performance cover?</h2>



<p class="wp-block-paragraph">Auditing Magento performance means measuring how fast your store answers and renders for real shoppers, page type by page type, and ties each slow number to a cause. It times server response on cached and uncached pages, reads Core Web Vitals from real-user data, tests the server under rising traffic, and checks the setup behind all three.</p>



<p class="wp-block-paragraph">A speed score gives you one number for one URL on one run. The audit covers six page types in four states, and every slow number in it comes with a likely cause and the team that fixes it.</p>



<h3 class="wp-block-heading">Performance audit vs code audit</h3>



<p class="wp-block-paragraph">A code audit reads the code: security holes, coding standards, extension quality, slow database queries. A performance audit starts from measurements of what shoppers get and works back toward a cause. The two meet when the numbers point at a specific module, template or query. When they do, the next step is a <a href="https://scandiweb.com/blog/magento-code-audit-by-certified-magento-developers/" target="_blank" rel="noopener">Magento code audit</a>, which reads the code behind the slow page. A general Magento audit mixes both. This checklist covers the measurement half.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>One speed score covers one URL, one load and one test device. An audit covers every page type, from the cache and built from scratch, plus 28 days of real-user data.</p></div>



<h2 class="wp-block-heading">The Magento performance checklist</h2>



<p class="wp-block-paragraph">Use this checklist for a Magento store performance check in one pass. Each row is one measurement, how to take it, and what a healthy result looks like. Run it on one URL per page type: homepage, category, filtered category, product, search results and cart, logged out and logged in.</p>



<p class="wp-block-paragraph">Copy it into a spreadsheet and fill in a column per page type.</p>



<figure class="wp-block-table"><table><thead><tr><th>#</th><th>Check</th><th>How to run it</th><th>Healthy result</th></tr></thead><tbody><tr><td>1</td><td>Core Web Vitals, real users</td><td>PageSpeed Insights field data or Search Console, mobile and desktop</td><td>LCP 2.5 s or less, INP 200 ms or less, CLS 0.1 or less, at the 75th percentile</td></tr><tr><td>2</td><td>TTFB, real users</td><td>PageSpeed Insights field data, &#8220;TTFB (experimental)&#8221;</td><td>800 ms or less at the 75th percentile</td></tr><tr><td>3</td><td>Server response from the cache</td><td>Load each URL twice, time the second load (curl or DevTools)</td><td>Under 150 ms for cacheable pages with Varnish</td></tr><tr><td>4</td><td>Cache hit or miss</td><td><code>X-Magento-Cache-Debug</code> header, on staging in developer mode</td><td>HIT on the second load of category, product and CMS pages</td></tr><tr><td>5</td><td>Server response uncached</td><td>Same URL with a made-up query parameter, new value each run</td><td>No official target. Compare with row 3 and the 800 ms line</td></tr><tr><td>6</td><td>Logged in</td><td>Same URLs as a logged-in customer, one per main customer group</td><td>Close to the logged-out uncached time</td></tr><tr><td>7</td><td>Search results</td><td>A search term nobody has used since the last cache clean</td><td>Close to the uncached category time</td></tr><tr><td>8</td><td>Cart</td><td>Add a product and open the cart (always built by Magento)</td><td>Close to your other uncached times</td></tr><tr><td>9</td><td>Under load</td><td>Load test on a staging copy, raising requests per second</td><td>Flat response times past your real peak traffic</td></tr><tr><td>10</td><td>Application mode</td><td><code>bin/magento deploy:mode:show</code></td><td>production</td></tr><tr><td>11</td><td>Cache setup</td><td><code>bin/magento cache:status</code>, and Full Page Cache in the Admin</td><td>All cache types enabled, Varnish selected (Fastly on Commerce Cloud)</td></tr><tr><td>12</td><td>Indexers and PHP</td><td><code>bin/magento indexer:show-mode</code>, PHP version vs Adobe&#8217;s requirements</td><td>Update by Schedule, PHP 8.5 on 2.4.9, 8.4 or 8.3 on 2.4.8</td></tr></tbody></table><figcaption class="wp-element-caption">The Magento performance audit checklist: what to measure, how, and the healthy value</figcaption></figure>



<p class="wp-block-paragraph">For row 11, the Admin path is Stores &gt; Settings &gt; Configuration &gt; Advanced &gt; System &gt; Full Page Cache.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>To time an uncached page, add a made-up parameter such as ?audit=7 and change the number on each run. Don&#8217;t use utm_ or gclid parameters: Magento&#8217;s default Varnish configuration strips those, so the request can still be served from the cache.</p></div>



<h2 class="wp-block-heading">How to audit Magento performance, step by step</h2>



<p class="wp-block-paragraph">To audit Magento performance:</p>



<ol class="wp-block-list">
<li>List one URL per page type.</li>


<li>Read Core Web Vitals and TTFB from field data.</li>


<li>Time each page from the cache.</li>


<li>Time it uncached and logged in.</li>


<li>Test the server under rising traffic.</li>


<li>Check the setup behind every page.</li>

</ol>



<h3 class="wp-block-heading">1. List one URL for each page type</h3>



<p class="wp-block-paragraph">Pick six URLs from the live store: the homepage, the first page of a busy category, the same category with two filters applied, a best-selling product, a search for a term shoppers use, and the cart with one product in it. Then add the category and product URLs again as a logged-in customer, one test account per main customer group.</p>



<p class="wp-block-paragraph">Pick busy, real URLs. Google only keeps real-user data for pages with enough visitors, per the <a href="https://developer.chrome.com/docs/crux/methodology" target="_blank" rel="noopener">Chrome UX Report methodology</a>, and it doesn&#8217;t say how many. A rare filter combination or a fresh search usually has no page-level field data, so you time those yourself in steps 3 and 4.</p>



<h3 class="wp-block-heading">2. Read Core Web Vitals and TTFB in PageSpeed Insights</h3>



<p class="wp-block-paragraph">PageSpeed Insights is Google&#8217;s free speed test, and it also shows what real Chrome users experienced on the page. Its top section is that field data: the past 28 days of visits at the 75th percentile, the value three quarters of visits came in under. When a page has too few visits, <a href="https://developers.google.com/speed/docs/insights/v5/about" target="_blank" rel="noopener">PageSpeed Insights falls back</a> to data for the whole site and says so, so check the label first. TTFB appears there marked experimental.</p>



<p class="wp-block-paragraph">The lower section is one lab test on a simulated device. It helps you find causes and flags a server that took more than 600 ms to respond, but it is one run on one machine, so don&#8217;t treat it as the result.</p>



<p class="wp-block-paragraph">For each page type, record LCP, INP, CLS and TTFB on mobile and on desktop against <a href="https://web.dev/articles/vitals" target="_blank" rel="noopener">Google&#8217;s thresholds</a>. Your Magento 2 PageSpeed Insights results for a category page and a product page will often differ more than the homepage suggests.</p>



<p class="wp-block-paragraph">Search Console&#8217;s <a href="https://support.google.com/webmasters/answer/9205520" target="_blank" rel="noopener">Core Web Vitals report</a> shows the same real-user data with URLs grouped by similar experience, which often lines up with your page types, and a group takes the status of its slowest URL. For how to read both views without chasing the lab score, see <a href="https://scandiweb.com/blog/how-to-and-how-not-to-use-google-pagespeed-insights/" target="_blank" rel="noopener">what PageSpeed Insights can tell you</a>.</p>



<h3 class="wp-block-heading">3. Time each page from the cache</h3>



<p class="wp-block-paragraph">Load each URL twice and time the second request. From a terminal, curl prints the time to first byte and the total:</p>



<pre class="wp-block-code"><code>curl -s -o /dev/null -w "TTFB %{time_starttransfer}s  total %{time_total}s\n" "https://www.example.com/women/tops.html"</code></pre>



<p class="wp-block-paragraph">Without a terminal, open the page in Chrome DevTools, go to the Network tab, click the first request and read the &#8220;Waiting (TTFB)&#8221; line. Run each page 3–5 times and note the middle value. Our guide to <a href="https://scandiweb.com/blog/reduce-initial-server-response-time/" target="_blank" rel="noopener">reducing server response time</a> covers each timing in more depth, including the Server-Timing header.</p>



<p class="wp-block-paragraph">Varnish is the cache server Adobe recommends in front of Magento. Adobe&#8217;s line for a <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/config-varnish-final" target="_blank" rel="noopener">working Varnish setup</a> is that any page with cacheable blocks should load in less than 150 ms.</p>



<p class="wp-block-paragraph">To confirm the page came from the cache, check the <code>X-Magento-Cache-Debug</code> header: MISS on the first load, HIT on the second. The header only appears in developer mode, so do this on staging. Our guide to the <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">Magento full page cache</a> walks through the full check.</p>



<h3 class="wp-block-heading">4. Time each page uncached and logged in</h3>



<p class="wp-block-paragraph">A cache hides a slow page build from every visitor it can serve, so time the page with the cache out of the way. Three ways to do that: add a made-up query parameter such as <code>?audit=101</code> and change the number on each run, so Magento sees a new URL and builds the page again. Log in as each test customer and load the category and product URLs again, since each customer group keeps its own cached copies. Search for a term nobody has used since the last cache clean, because results are cached per term.</p>



<p class="wp-block-paragraph">The cart is always built by Magento, so its times are uncached by definition. If you clear the cache to force a miss, do it on staging, or at a quiet hour at worst: Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-admin/systems/tools/cache-management" target="_blank" rel="noopener">cache management guidance</a> says to schedule flushes outside peak times. On Adobe Commerce Cloud, full page caching uses Fastly, so check how your setup handles query strings with your team.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-page-type-matrix.png" alt="Magento performance check matrix: six page types timed from field data, from the cache, uncached and logged in" class="wp-image-26543" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-page-type-matrix.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-page-type-matrix-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-page-type-matrix-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-page-type-matrix-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-page-type-matrix-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-page-type-matrix-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-page-type-matrix-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Time each page type four ways. The uncached and logged-in columns are where a slow page build shows up.</figcaption></figure></div>



<h3 class="wp-block-heading">5. Test the server under rising traffic</h3>



<p class="wp-block-paragraph">Magento performance testing under load shows how many shoppers at once the server handles before every page slows down. Run it on a staging copy with production data, never on the live store. With a load-testing tool such as k6, JMeter or the one your host provides, raise the requests per second step by step and note the point where response times start to climb. Compare that point with your real peak, the busiest hour of your biggest sales day in your analytics. If the two are close, the server has no headroom for the next campaign.</p>



<h3 class="wp-block-heading">6. Check the setup behind every page</h3>



<p class="wp-block-paragraph">Five settings explain a lot of slow numbers, and a developer can check them in a few minutes: <code>bin/magento deploy:mode:show</code> should say production, since default mode is not optimized for production. <code>bin/magento cache:status</code> should show a 1 next to every cache type. Full Page Cache in the Admin should be set to Varnish, or Fastly on Commerce Cloud, because the built-in cache is much slower. <code>bin/magento indexer:show-mode</code> should show Update by Schedule, which moves reindexing to cron. And the PHP version should be one Adobe lists for your release in its <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/system-requirements" target="_blank" rel="noopener">system requirements</a>. A wrong answer here explains slow cached pages before you look anywhere else.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Google&#8217;s real-user data drops query strings from URLs, so filtered versions of a category that put their filters in the query string count toward the plain category URL. Time the filtered URLs yourself to see them on their own.</p></div>



<h2 class="wp-block-heading">What the numbers tell you, and what to fix</h2>



<p class="wp-block-paragraph">The pattern across your numbers points to the fix. A slow cached page points to the cache or the server setup. A fast cached page with slow uncached versions points to the page build. Good server times with poor Core Web Vitals point to the theme and the browser. Times that climb with traffic point to capacity.</p>



<p class="wp-block-paragraph">These are the patterns we see most often in our store health checks, with the fix that usually comes first and who owns it.</p>



<figure class="wp-block-table"><table><thead><tr><th>What you see</th><th>What it means</th><th>Fix first</th><th>Who fixes it</th></tr></thead><tbody><tr><td>Cached pages fast, uncached category, filter and search pages slow</td><td>Cache misses expose a slow page build</td><td>Profile the build, cut cache variants, speed up the page build</td><td>Magento developer</td></tr><tr><td>The same page slow on every load, header says MISS</td><td>The cache isn&#8217;t serving it: no Varnish, an uncacheable block, or a cache type turned off</td><td>Run Varnish, remove the uncacheable block, enable cache types</td><td>Magento developer</td></tr><tr><td>Every page slow, cached ones too, even at quiet hours</td><td>The setup under the store: developer mode, old PHP, a small or shared server</td><td>Production mode, supported PHP, dedicated resources</td><td>Developer and host</td></tr><tr><td>Fast at low traffic, response times climb with load</td><td>The server runs out of capacity at peak</td><td>More capacity, or less work per request</td><td>Host and developer</td></tr><tr><td>Logged-in pages slower than logged-out ones</td><td>Each customer group keeps its own cache copies, so misses are more frequent</td><td>Merge groups that share prices, speed up the build</td><td>Developer and store admin</td></tr><tr><td>Good TTFB, poor LCP or INP</td><td>The time goes in the browser: theme JavaScript, images, third-party tags</td><td>Hyvä, or trim scripts, images and tags</td><td>Frontend developer</td></tr><tr><td>Lab tests fast, field data poor</td><td>Shoppers have slower phones or networks, or visit pages you didn&#8217;t test</td><td>Test more URLs, check mobile on its own, add a CDN</td><td>Host and frontend developer</td></tr><tr><td>Slow right after deploys or cache flushes, then fine</td><td>The cache starts empty and refills from shopper visits</td><td>Flush by tag, deploy off-peak, warm the top pages</td><td>DevOps or host</td></tr></tbody></table><figcaption class="wp-element-caption">What the audit numbers tell you, what to fix first, and who owns the fix</figcaption></figure>



<p class="wp-block-paragraph">Start with the first row that matches, because the rows combine: a store in developer mode on old PHP shows slow uncached pages too, and that row&#8217;s fix comes after the setup fix. For the causes behind each pattern, read our guide to <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">why a Magento site gets slow</a>.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-what-the-numbers-mean.png" alt="Decision tree from cached TTFB, uncached TTFB, Core Web Vitals and load results to the fix each one points to" class="wp-image-26544" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-what-the-numbers-mean.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-what-the-numbers-mean-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-what-the-numbers-mean-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-what-the-numbers-mean-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-what-the-numbers-mean-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-what-the-numbers-mean-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-performance-audit-what-the-numbers-mean-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Read the numbers in this order. Each &quot;yes&quot; points to a different fix and a different team.</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>If the cached page is slow too, fix the cache and the server setup first. A faster page build only helps the requests that reach Magento&#8217;s PHP code.</p></div>



<h2 class="wp-block-heading">How to fix slow uncached Magento pages</h2>



<p class="wp-block-paragraph">When uncached pages are slow and cached ones are fast, the time goes into building the page: running PHP code, rendering layout blocks and querying the database. You can make that happen less often, with fewer cache variants, or make it take less time, with profiling, leaner code and a faster page build.</p>



<p class="wp-block-paragraph">The first route is fewer misses. Merge customer groups that exist only for reporting and share the same prices, and keep filter combinations out of crawl paths so crawlers don&#8217;t fill the cache with pages no shopper opens.</p>



<p class="wp-block-paragraph">The second route is a faster build. Profile one slow page with New Relic or Blackfire, which breaks the build into layout, blocks, templates and database queries, then remove or replace the blocks and modules that take the longest.</p>



<p class="wp-block-paragraph"><a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a>, scandiweb&#8217;s Magento module with an open-source core, takes the second route. It speeds up how Magento builds each page on the server by applying Liquid, the open-source template language created at Shopify, and makes that build at least 2x faster. It runs on Magento Open Source, Adobe Commerce and Commerce Cloud, with Luma, Hyvä or a custom theme, on any hosting, and leaves the theme, data, admin and checkout as they are.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png" alt="The Expedio page on scandiweb.com with the headline Magento. 2x faster. and buttons to get Expedio or try the demo" class="wp-image-25972" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Expedio makes Magento at least 2x faster without changing your theme or data</figcaption></figure></div>



<p class="wp-block-paragraph">We tested Expedio the way this checklist tests a store. In a benchmark on one merchant&#8217;s Hyvä store, measured as server response time, two copies of the store ran side by side on one server with no page cache, across eight page types. On 100 category pages, each opened once from cold, stock Magento took a median of 181 ms and Expedio 57 ms, and a full category page ran 30 database queries instead of 655. The same server also handled 3x the traffic before response times started to rise. The <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">Expedio benchmark</a> has the full method and its limits.</p>



<h2 class="wp-block-heading">When to bring in a professional audit</h2>



<p class="wp-block-paragraph">Bring in a professional <a href="https://scandiweb.com/services/magento-performance-audit" target="_blank" rel="noopener">Magento performance audit</a> when the checklist shows a problem you can&#8217;t trace, such as slow uncached pages with no obvious cause, or when you need firm numbers before a peak season, an upgrade or a hosting move. A professional audit adds code profiling, load testing on a copy of the store, and a ranked list of fixes.</p>



<p class="wp-block-paragraph">Where you timed a page, a professional audit profiles it, reads the MySQL slow query log, and runs load tests on a copy of the store with your real catalog. The report ranks every finding by severity and estimated effort, with a recommended fix for each, so your developers can start at the top.</p>



<p class="wp-block-paragraph">Server response time is a standard line in our store health checks, and our <a href="https://scandiweb.com/magento-support" target="_blank" rel="noopener">Magento support team</a> can run the deeper audit with you, from profiling to a ranked list of fixes. If your peak season is close, run the audit before your <a href="https://scandiweb.com/blog/black-friday-code-freeze/" target="_blank" rel="noopener">Black Friday code freeze</a>, so there is time to act on what it finds.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Keep each audit&#8217;s numbers. The next audit, after an upgrade, a new extension or a hosting move, is only useful if you can compare it with a baseline.</p></div>



<h2 class="wp-block-heading">Frequently asked questions about auditing Magento performance</h2>



<h3 class="wp-block-heading">What does a Magento performance check include?</h3>



<p class="wp-block-paragraph">A Magento performance check includes five steps: Core Web Vitals and TTFB from real-user data, server response time for each page type from the cache, the same pages built from scratch and logged in, response times under rising traffic, and the setup behind them, such as application mode, cache configuration, indexers and PHP version. A professional audit adds code profiling and a ranked list of fixes.</p>



<h3 class="wp-block-heading">How long does it take to audit Magento performance?</h3>



<p class="wp-block-paragraph">The checklist in this article takes a few hours: six page types, timed from the cache and without it, plus field data from PageSpeed Insights or Search Console. Load testing and code profiling take longer, because they need a staging copy of the store, a load-testing tool and application monitoring set up first. Plan that deeper work with your developer or hosting team.</p>



<h3 class="wp-block-heading">What is a good TTFB for a Magento store?</h3>



<p class="wp-block-paragraph">For real shoppers, <a href="https://web.dev/articles/ttfb" target="_blank" rel="noopener">Google calls</a> a TTFB of 0.8 seconds or less good and anything over 1.8 seconds poor, measured at the 75th percentile of page loads. For cached pages, Adobe says a page with cacheable blocks should load in less than 150 ms when Varnish works. Uncached pages have no official target, so compare them with your cached times and the 800 ms line.</p>



<h3 class="wp-block-heading">Is PageSpeed Insights enough for a Magento speed test?</h3>



<p class="wp-block-paragraph">No. PageSpeed Insights tests one URL at a time, and its lab test often gets a page the cache already holds. Its real-user section is the best free field data you have, but it covers the past 28 days and falls back to data for the whole site when a page has too few visits. Add your own uncached timings by page type to see the server side.</p>



<h3 class="wp-block-heading">Should you audit Magento performance on production or staging?</h3>



<p class="wp-block-paragraph">Use both. Field data and cached timings come from production, because that is what shoppers get. Run the disruptive steps on a staging copy with the same data: cache flushes, developer-mode header checks and load tests. Adobe advises flushing caches outside peak hours, because a flush at peak makes the server rebuild pages while shoppers are waiting for them.</p>



<h3 class="wp-block-heading">How often should you audit Magento performance?</h3>



<p class="wp-block-paragraph">Run a full audit before each peak season and after any major change: a Magento upgrade, a new theme, a new extension or integration, or a hosting move. Between audits, watch TTFB and Core Web Vitals at the 75th percentile so you notice a slowdown before shoppers report it. Keep each audit&#8217;s numbers as the baseline for the next one.</p>



<h2 class="wp-block-heading">What to do after you audit Magento performance</h2>



<p class="wp-block-paragraph">Auditing Magento performance turns one speed score into a set of numbers you can act on: every page type, from the cache and built from scratch, for real shoppers and under load. The pattern across those numbers tells you what to fix first and who should fix it.</p>



<p class="wp-block-paragraph">Start with the first decision-table row that matches your numbers, and fix that layer before the next one. If cold pages after a deploy are the problem, a <a href="https://scandiweb.com/blog/magento-cache-warmer/" target="_blank" rel="noopener">cache warmer</a> can refill the top ones, though not every filter, search and customer group. After each fix, re-run the same URLs with the same method, cached and uncached, so you compare like with like. Most stores find that one or two rows explain most of the wait, and the first fix is often a setting a developer changes in an afternoon. When you&#8217;re ready to work through the fixes from the server to the browser, our guide on how to <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">speed up Magento</a> puts all 15 in order.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does a Magento performance check include?", "acceptedAnswer": {"@type": "Answer", "text": "A Magento performance check includes five steps: Core Web Vitals and TTFB from real-user data, server response time for each page type from the cache, the same pages built from scratch and logged in, response times under rising traffic, and the setup behind them, such as application mode, cache configuration, indexers and PHP version. A professional audit adds code profiling and a ranked list of fixes."}}, {"@type": "Question", "name": "How long does it take to audit Magento performance?", "acceptedAnswer": {"@type": "Answer", "text": "The checklist in this article takes a few hours: six page types, timed from the cache and without it, plus field data from PageSpeed Insights or Search Console. Load testing and code profiling take longer, because they need a staging copy of the store, a load-testing tool and application monitoring set up first. Plan that deeper work with your developer or hosting team."}}, {"@type": "Question", "name": "What is a good TTFB for a Magento store?", "acceptedAnswer": {"@type": "Answer", "text": "For real shoppers, Google calls a TTFB of 0.8 seconds or less good and anything over 1.8 seconds poor, measured at the 75th percentile of page loads. For cached pages, Adobe says a page with cacheable blocks should load in less than 150 ms when Varnish works. Uncached pages have no official target, so compare them with your cached times and the 800 ms line."}}, {"@type": "Question", "name": "Is PageSpeed Insights enough for a Magento speed test?", "acceptedAnswer": {"@type": "Answer", "text": "No. PageSpeed Insights tests one URL at a time, and its lab test often gets a page the cache already holds. Its real-user section is the best free field data you have, but it covers the past 28 days and falls back to data for the whole site when a page has too few visits. Add your own uncached timings by page type to see the server side."}}, {"@type": "Question", "name": "Should you audit Magento performance on production or staging?", "acceptedAnswer": {"@type": "Answer", "text": "Use both. Field data and cached timings come from production, because that is what shoppers get. Run the disruptive steps on a staging copy with the same data: cache flushes, developer-mode header checks and load tests. Adobe advises flushing caches outside peak hours, because a flush at peak makes the server rebuild pages while shoppers are waiting for them."}}, {"@type": "Question", "name": "How often should you audit Magento performance?", "acceptedAnswer": {"@type": "Answer", "text": "Run a full audit before each peak season and after any major change: a Magento upgrade, a new theme, a new extension or integration, or a hosting move. Between audits, watch TTFB and Core Web Vitals at the 75th percentile so you notice a slowdown before shoppers report it. Keep each audit's numbers as the baseline for the next one."}}]}</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em>If your numbers point in more than one direction, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>share them with us</em></a><em> and we&#x27;ll help you decide what to fix first.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/how-to-audit-magento-performance/">How to Audit Magento Performance: A Checklist to Measure Your Store&#8217;s Real Speed</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Magento 2 Cache Warmer: Do You Need One, and What It Can&#8217;t Fix</title>
		<link>https://scandiweb.com/blog/magento-cache-warmer/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 09:52:00 +0000</pubDate>
				<category><![CDATA[Collection]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[adobe commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[magento 2]]></category>
		<category><![CDATA[magento optimization]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[site performance]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26511</guid>

					<description><![CDATA[<p>A Magento 2 cache warmer refills Varnish after a deploy or flush. See how warmers work, the crawl load they add, and when a faster cold build wins.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-cache-warmer/">Magento 2 Cache Warmer: Do You Need One, and What It Can&#8217;t Fix</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-magen wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/solutions/magento/expedio" target=_blank >
        2x Faster Magento with Expedio
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/aws-hosting-services-readymage" target=_blank >
        Magento Hosting (ReadyMage)
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-performance-optimization" target=_blank >
        Magento Performance
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">A Magento (Adobe Commerce) store keeps finished copies of its pages in a cache, so most shoppers get a page that is ready to send instead of waiting for Magento to build it. Those copies don&#8217;t last. Releasing a store update or flushing the cache deletes all of them, and catalog updates delete the pages they touch. A Magento 2 cache warmer refills the cache before shoppers notice the gap.</p>



<p class="wp-block-paragraph">Without one, the first shopper to open each page after a flush waits while Magento builds it from scratch, which takes far longer than sending a saved copy. Every popular page gets rebuilt this way, one slow first visit at a time.</p>



<p class="wp-block-paragraph">A warmer does that work in advance. It visits your pages automatically, usually working through the sitemap, so the first real visitor gets a saved copy. It only reaches pages it can predict, and each visit costs your server the same build a shopper would have triggered. Whether that trade pays off depends on your traffic and how often your cache empties.</p>



<h2 class="wp-block-heading">What does a Magento 2 cache warmer do?</h2>



<p class="wp-block-paragraph">A Magento 2 cache warmer requests your store&#8217;s pages before shoppers do, so the full page cache already holds a finished copy when the first visitor arrives. It runs after a deploy, a cache flush or a catalog change, when the cache is empty and every page would otherwise be built by PHP while a shopper waits.</p>



<p class="wp-block-paragraph">A cold cache is one that doesn&#8217;t hold the page a shopper asked for. Magento then builds that page from nothing: it resolves the layout, renders every block on it and runs the database queries behind them, and only then does any HTML exist. A warm cache already holds the finished page and hands it back without that work. Cache warming means filling the cache on purpose, before traffic arrives, so shoppers get the warm case rather than the cold one.</p>



<p class="wp-block-paragraph">The cache a warmer fills is the <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">full page cache</a>. In production that should be Varnish. Adobe strongly recommends Varnish and says the built-in full page cache, which writes to the file system or the database, is much slower. In the admin, this is the Page Cache type, tagged FPC, and Flush Cache Storage removes everything in it regardless of tag.</p>



<p class="wp-block-paragraph">We see the cold case after every release on the stores we support. The deploy finishes, the cache flushes, and the first request to each page carries the full build until the cache fills again. The cold cache vs warm cache question comes down to that first request against every one after it. A warmer is a program that sends those first requests itself.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Magento purges Varnish whenever its own cache is cleaned, flushed or refreshed. If your deploy runs a cache flush, every page your shoppers open next is a cold build.</p></div>



<h2 class="wp-block-heading">How a full page cache warmer works in Magento 2</h2>



<p class="wp-block-paragraph">A full page cache warmer works in three steps. It builds a list of URLs from the sitemap, a URL file or page popularity, queues them, and requests each one from cron or a CLI command. Most let you cap concurrent requests, add a delay between them, and choose the store views, currencies and customer groups to warm.</p>



<h3 class="wp-block-heading">Where the URL list comes from</h3>



<p class="wp-block-paragraph">Most warmers read your sitemap.xml, because it already lists the category, product and CMS URLs you want indexed. Some also accept a file of URLs, so you can add landing pages or leave out whole sections, and some rank pages by visits so the busiest URLs get warmed first.</p>



<p class="wp-block-paragraph">Warmers come as paid and free <a href="https://scandiweb.com/blog/best-magento-extensions/" target="_blank" rel="noopener">Magento extensions</a>, including open-source ones. Our comparison of <a href="https://scandiweb.com/blog/best-magento-speed-optimization-extensions/" target="_blank" rel="noopener">speed optimization extensions</a> includes the main warmers. A free Magento full page cache extension on GitHub, for example, reads sitemaps or URL files and is meant to be called from deployment scripts. Whichever you pick, the list is the whole job. A page that isn&#8217;t on it stays cold until a shopper opens it.</p>



<h3 class="wp-block-heading">When the warmer runs</h3>



<p class="wp-block-paragraph">A Magento cache warmer runs from cron, like the rest of Magento&#8217;s background work, or from a CLI command you call by hand. The useful moment is right after a deploy or a full cache flush, when every page is cold, so most setups call the warmer from the deploy script and let cron keep the queue moving afterwards.</p>



<p class="wp-block-paragraph">Adobe Commerce on Cloud has a built-in version of this. The <a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/configure/env/stage/variables-post-deploy" target="_blank" rel="noopener">post-deploy variables</a> include <code>WARM_UP_PAGES</code>, which lists the pages to preload once the deploy finishes. Its default is <code>index.php</code> alone. You can add categories, CMS pages, products and store pages by pattern, provided the post-deploy hook is configured.</p>



<h3 class="wp-block-heading">How it limits server load</h3>



<p class="wp-block-paragraph">Every request a warmer sends is a full page build, so the controls on a full page cache warmer for Magento 2 are all about pacing. Most warmers let you set how many requests run at once, add a delay between them, and cap how long a job may run. Some stop the crawl when system load passes a threshold you set. One manual puts the trade-off plainly: more threads finish the crawl sooner and increase the server load. Adobe&#8217;s <code>WARM_UP_CONCURRENCY</code> variable does the same job on Commerce Cloud, limiting simultaneous requests to reduce server load.</p>



<h3 class="wp-block-heading">Store views, currencies and customer groups</h3>



<p class="wp-block-paragraph">Magento doesn&#8217;t cache one copy of a URL. It caches one copy per context, and the context travels in the X-Magento-Vary cookie: the store, the selected language and currency, the customer group, and whether the shopper is logged in. Adobe&#8217;s <a href="https://developer.adobe.com/commerce/php/development/cache/page/public-content" target="_blank" rel="noopener">public content</a> documentation lists these as the variables that make each cached URL unique.</p>



<p class="wp-block-paragraph">A warmer only fills the contexts it requests, which is why most let you choose store views, currencies and customer groups. Each one you tick is another pass over the same URLs. The next section adds that up.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-request-flow.png" alt="Magento 2 cache warmer request flow: URL list, queue, Varnish miss, PHP page build, then a cached page for the shopper" class="wp-image-26507" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-request-flow.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-request-flow-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-request-flow-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-request-flow-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-request-flow-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-request-flow-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-request-flow-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">A cache warmer pays for the slow page build before the shopper arrives, so the shopper&#x27;s request is served from the cache.</figcaption></figure></div>



<h2 class="wp-block-heading">What a cache warmer costs your server</h2>



<p class="wp-block-paragraph">A cache warmer costs server time, because every URL it warms is a full uncached page build in PHP. One full pass equals your URLs multiplied by the store views, currencies and customer groups you warm. Magento also purges Varnish when products, categories, prices or promotion rules change, so the warmer keeps crawling the same pages.</p>



<p class="wp-block-paragraph">Take a store the size of the one in our Expedio benchmark, with around 1,000 categories and 20,000 products. That is about 21,000 URLs before any filters or search terms. Warm them for 2 store views, 1 currency and 3 customer groups, and one full pass is 21,000 × 2 × 1 × 3 = 126,000 page builds.</p>



<p class="wp-block-paragraph">This is an example, not a measurement, and your own numbers will differ. The shape holds, though: every one of those builds runs in PHP on your own server, competing with real shoppers for the same CPU. A Magento cache warmer doesn&#8217;t make a single build cheaper. It decides when the server does the work.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-crawl-load.png" alt="Crawl load of a cache warmer: URLs times store views times currencies times customer groups equals page builds per pass" class="wp-image-26508" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-crawl-load.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-crawl-load-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-crawl-load-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-crawl-load-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-crawl-load-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-crawl-load-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-crawl-load-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Every context you warm multiplies the crawl, and each request in it is a full page build on your own server.</figcaption></figure></div>



<h3 class="wp-block-heading">Why a warm cache keeps going cold</h3>



<p class="wp-block-paragraph">Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/use-varnish-cache" target="_blank" rel="noopener">cache clearing with Varnish</a> documentation lists the admin tasks that purge Varnish automatically: adding or editing categories, prices, products and promotional pricing rules. It also says that when you clean, flush or refresh the Commerce cache, Varnish purges as well.</p>



<p class="wp-block-paragraph">So a store that imports prices every morning, or edits promotion rules through the day, empties the pages it just warmed, and the warmer crawls them again. The crawl in the example above isn&#8217;t a one-off after each deploy. It repeats as often as your catalog changes.</p>



<p class="wp-block-paragraph">Some flushes are unavoidable. Sometimes <a href="https://scandiweb.com/blog/sometimes-flushing-the-whole-cache-storage-is-the-only-option/" target="_blank" rel="noopener">flushing the whole cache storage</a> is the only option, and then every page goes cold at once.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Before you buy a warmer, multiply your URLs by the store views, currencies and customer groups you would warm. That is the size of one full crawl on your own server.</p></div>



<h2 class="wp-block-heading">What a cache warmer can&#8217;t fix</h2>



<p class="wp-block-paragraph">A cache warmer can&#8217;t fix the misses it doesn&#8217;t predict. Logged-in customers get one cached copy per customer group, and each group misses until it is warmed. Filter combinations and search terms are each cached on their own, more than a crawl can list. Checkout and account pages are never cached, and purged pages wait for the next visit.</p>



<h3 class="wp-block-heading">Logged-in customers and B2B customer groups</h3>



<p class="wp-block-paragraph">Magento caches catalog pages for logged-in customers too. The customer group and the logged-in state are part of the X-Magento-Vary context, so the cache key includes them, and each group gets its own copy of every URL. Those copies miss more often than the guest copy for a plain reason: there are more of them, and all of them are empty after a deploy or flush.</p>



<p class="wp-block-paragraph">If you are working out how to go about prewarming the cache for logged-in users, the answer is per customer group. Some warmers let you pick the groups to warm, so check for that before buying, and remember that pre-warming the cache for all customer groups means one full pass over your URLs for each group. A B2B store with many groups multiplies the crawl again.</p>



<p class="wp-block-paragraph">Per-customer data such as the cart or wishlist isn&#8217;t in the page cache at all. Adobe&#8217;s <a href="https://developer.adobe.com/commerce/php/development/cache/page/private-content" target="_blank" rel="noopener">private content</a> documentation explains that the browser fetches it with an AJAX request and keeps it in local storage. And <code>/customer</code> and <code>/checkout</code> URLs bypass the cache in Magento 2.4&#8217;s default Varnish configuration, so no warmer touches them.</p>



<h3 class="wp-block-heading">Filtered category pages and search results</h3>



<p class="wp-block-paragraph">Every filter a shopper can click in <a href="https://scandiweb.com/blog/layered-navigation-causing-problems-deal-with-it/" target="_blank" rel="noopener">layered navigation</a> makes a URL, and filters combine, so a category with a handful of filters has far more filtered pages than plain ones. Magento 2.4 caches each combination as its own entry, and search results too: the default Varnish configuration has no bypass for the search URL, and the search results layout has no block marked uncacheable, so each search term gets its own entry.</p>



<p class="wp-block-paragraph">These pages are cacheable. They miss far more often than a plain category page, because most entries are still empty when a shopper asks for them. A crawl can&#8217;t list every filter combination, and search terms depend on what shoppers type, so a warmer covers only the few it has on its list. For a store where shoppers filter and search their way to products, that is a large share of catalog traffic.</p>



<h3 class="wp-block-heading">The build itself</h3>



<p class="wp-block-paragraph">A warmer moves the wait to a moment when no shopper is in the queue. The build takes as long as it did before, and every page outside the crawl, or purged since the crawl, still runs the full build in front of a shopper. Shoppers see that wait as slow <a href="https://scandiweb.com/blog/reduce-initial-server-response-time/" target="_blank" rel="noopener">server response time</a>. That is the part of the problem a warmer can&#8217;t reach.</p>



<p class="wp-block-paragraph">For scale, HTTP Archive&#8217;s <a href="https://httparchive.org/reports/techreport/tech?tech=Magento,Shopify" target="_blank" rel="noopener">technology report</a> for September 2026 puts the share of Magento origins with a good time to first byte at 23.0% on mobile and 22.7% on desktop, where good means 800 ms or less at the 75th percentile. A warmer raises the share of cached responses in figures like these. It does nothing for the uncached ones.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Check cache misses for logged-in sessions, filtered URLs and search results separately. Magento caches all three, but a warmer covers only a small share of their variants.</p></div>



<h2 class="wp-block-heading">Cache warmer vs a faster cold build</h2>



<p class="wp-block-paragraph">A cache warmer hides slow page builds by running them before shoppers arrive. A faster cold build shortens the build itself, so every cache miss costs less, including the ones a crawl doesn&#8217;t cover. Warmers suit guest-heavy stores with a predictable set of URLs. Faster builds suit stores with logged-in customers, heavy filtering, search and frequent catalog updates.</p>



<p class="wp-block-paragraph">The two fixes work on different parts of the same problem.</p>



<figure class="wp-block-table"><table><thead><tr><th></th><th>Cache warmer</th><th>Faster cold build (Expedio)</th></tr></thead><tbody><tr><td>What it changes</td><td>When the slow build happens</td><td>How long the build takes</td></tr><tr><td>Pages it helps</td><td>URLs on its list, in the contexts it warms</td><td>Storefront pages Magento builds on the server, cached or not</td></tr><tr><td>Logged-in and B2B customers</td><td>One copy per warmed customer group, nothing per customer</td><td>A faster build in every session</td></tr><tr><td>Filtered pages and search</td><td>Only the combinations and terms on its list</td><td>A faster build on every miss</td></tr><tr><td>Server load</td><td>Adds a crawl on top of real traffic</td><td>Less server time per page, and the same server handles 3x the traffic before response times start to rise</td></tr><tr><td>After a deploy or flush</td><td>Covers the pages it reaches, in crawl order</td><td>First visits are faster on every page</td></tr><tr><td>Setup</td><td>Extension, cron, tuning and monitoring</td><td>A module install with no theme or data changes, built into ReadyMage</td></tr><tr><td>What it doesn&#8217;t do</td><td>Shorten the build</td><td>Speed up the browser side, the admin or Magento 1</td></tr></tbody></table><figcaption class="wp-element-caption">Cache warmer vs a faster cold build</figcaption></figure>



<p class="wp-block-paragraph"><a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> is our module for making the cold build itself faster. It changes how Magento builds each page on the server by applying Liquid, the open-source template language created at Shopify, and its core is open source. It works with Magento 2 Open Source, Adobe Commerce and Commerce Cloud, with Luma, Hyvä and custom themes, on any hosting, and it leaves the theme, design, data, admin, catalog, prices, checkout and orders as they are.</p>



<p class="wp-block-paragraph">In a benchmark on one merchant&#8217;s Hyvä store, measured as server response time, 100 category pages opened once from cold took a median of 57 ms with Expedio against 181 ms on stock Magento, 3.2x faster. A full category page went from 655 database queries to 30. The full numbers and method are in the <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">benchmark write-up</a>. Expedio is built into <a href="https://scandiweb.com/services/aws-hosting-services-readymage" target="_blank" rel="noopener">ReadyMage</a>, our Magento hosting, and installs as a module on any other host.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png" alt="The Expedio page on scandiweb.com with the headline Magento. 2x faster. and buttons to get Expedio or try the demo" class="wp-image-25972" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Expedio makes Magento at least 2x faster without changing your theme or data</figcaption></figure></div>



<p class="wp-block-paragraph">The two can work together. A warmer on a faster build has fewer slow pages to hide, and each request it sends costs the server less.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>A warmer changes when the slow build happens. Only a faster build changes how long it takes, which is the one fix that reaches the pages a crawl never visits.</p></div>



<h2 class="wp-block-heading">How to run a cache warmer without slowing the store</h2>



<p class="wp-block-paragraph">To run a cache warmer without slowing the store, warm your busiest pages first, cap concurrent requests and pause the crawl when server load climbs. Start it from the deploy script or post-deploy hook, skip filter and sort parameters, and warm only the customer groups and currencies that bring real traffic.</p>



<p class="wp-block-paragraph">These cache warming strategies keep the crawl useful and the server free for shoppers.</p>



<ol class="wp-block-list">
<li><strong>Warm the pages that earn traffic first.</strong> Rank URLs by visits and let the long tail fill on its own.</li>


<li><strong>Start the warmer from the deploy.</strong> Call it from the deploy script, or list your top pages in <code>WARM_UP_PAGES</code> on Adobe Commerce Cloud.</li>


<li><strong>Cap concurrent requests and add a delay.</strong> More threads finish sooner and load the server harder.</li>


<li><strong>Pause the crawl when load climbs.</strong> Set a system-load threshold so shoppers always come first.</li>


<li><strong>Skip filter, sort and search URLs.</strong> Exclude them with pattern rules, because their combinations outnumber any crawl.</li>


<li><strong>Warm only the contexts with traffic.</strong> Pick the store views, currencies and customer groups that bring real visits.</li>


<li><strong>Keep deploys and full flushes away from peak days.</strong> A <a href="https://scandiweb.com/blog/black-friday-code-freeze/" target="_blank" rel="noopener">code freeze</a> before big sales keeps the cache warm when it matters.</li>


<li><strong>Check the cache hit rate after every change.</strong> If misses don&#8217;t fall, the warmer is crawling the wrong pages.</li>

</ol>



<p class="wp-block-paragraph">Expired pages are a separate case. For those, Varnish&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/config-varnish-advanced" target="_blank" rel="noopener">grace mode</a> already serves the stale copy while it fetches a new one, for 300 seconds by default in Adobe&#8217;s setup. A purged page is gone from the cache, so the warmer&#8217;s job is the pages emptied by flushes and purges.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Varnish grace mode serves an expired page while it fetches a new one, for 300 seconds by default in Adobe&#8217;s setup. A purged page is gone from the cache, so after a flush only a warmer or a faster build shortens the wait.</p></div>



<h2 class="wp-block-heading">Do you need a Magento 2 cache warmer? A decision framework</h2>



<p class="wp-block-paragraph">You need a Magento 2 cache warmer if most traffic is guests on a known set of category and product pages and you flush the cache on deploys. If revenue comes from logged-in customers, filtered pages or search, or the catalog changes all day, make the cold build faster first, then warm only your busiest pages.</p>



<p class="wp-block-paragraph"><strong>Use a cache warmer if:</strong></p>



<ul class="wp-block-list">
<li>You flush the full cache on deploys, and most traffic lands on a known set of category, product and CMS pages.</li>


<li>Most of your shoppers browse as guests, so one cached copy per URL serves nearly all of them.</li>


<li>You run few store views, currencies and customer groups, so one full crawl stays short.</li>


<li>Your server has spare capacity outside peak hours to absorb a crawl after each deploy.</li>


<li>Your catalog, prices and promotions change a few times a day at most, so warm pages stay warm.</li>

</ul>



<p class="wp-block-paragraph"><strong>Make the cold build fast instead if:</strong></p>



<ul class="wp-block-list">
<li>A large share of your revenue comes from logged-in or B2B customers, whose pages are cached separately for each group.</li>


<li>Your shoppers rely on layered navigation filters and site search, which produce more URLs than any crawl can cover.</li>


<li>You would need to warm many store views, currencies or customer groups, and a full pass takes hours of server time.</li>


<li>Catalog, price or promotion updates purge Varnish many times a day.</li>


<li>Your server already runs near capacity at peak, so a crawl would compete with paying shoppers.</li>

</ul>



<p class="wp-block-paragraph"><strong>Do both if:</strong> you deploy often, most traffic is guests, and you also sell to logged-in or B2B customers. Speed up the cold build, then warm your top pages after each deploy.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-decision-tree.png" alt="Decision tree for a Magento cache warmer or a faster cold build, based on guests, filters, search and catalog updates" class="wp-image-26509" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-decision-tree.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-decision-tree-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-decision-tree-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-decision-tree-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-decision-tree-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-decision-tree-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-cache-warmer-decision-tree-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">A warmer fits guest-heavy stores with predictable pages, and a faster cold build covers the misses a crawl leaves behind.</figcaption></figure></div>



<h2 class="wp-block-heading">Frequently asked questions about Magento 2 cache warmers</h2>



<h3 class="wp-block-heading">Does a cache warmer increase server load?</h3>



<p class="wp-block-paragraph">Yes, while it runs. Every URL a warmer requests is a full page build in PHP, the same work a shopper&#8217;s first visit would trigger. That is why warmers come with a concurrency limit and a delay between requests, and some pause when system load passes a threshold. Adobe describes its own post-deploy warm-up concurrency setting as a way to reduce server load.</p>



<h3 class="wp-block-heading">Can you warm the Magento cache for logged-in customers?</h3>



<p class="wp-block-paragraph">Yes, per customer group, if the warmer supports it. Magento caches catalog pages for logged-in shoppers with one copy per context, which includes the customer group, and some warmers let you choose the groups to warm. Per-customer data such as the cart isn&#8217;t in the page cache, because Magento loads it in the browser through an AJAX request. Each group you add means another full pass over your URLs.</p>



<h3 class="wp-block-heading">What is the difference between a cold cache and a warm cache?</h3>



<p class="wp-block-paragraph">A cold cache doesn&#8217;t hold the page a shopper asked for, so Magento builds it in PHP, runs the database queries behind it and stores the result. A warm cache already holds the finished page and returns it without running PHP. That is why the first visit to a page after a flush is slower than every visit after it, until the page expires or is purged.</p>



<h3 class="wp-block-heading">How does Adobe Commerce Cloud warm the cache after a deploy?</h3>



<p class="wp-block-paragraph">Adobe Commerce on Cloud warms the cache in the post-deploy stage. The WARM_UP_PAGES variable in .magento.env.yaml lists the pages to preload, and its default is index.php alone. You can add categories, CMS pages, products and store pages by pattern, and WARM_UP_CONCURRENCY limits simultaneous requests to reduce server load. The post-deploy hook has to be configured for this to run.</p>



<h3 class="wp-block-heading">How often should a Magento cache warmer run?</h3>



<p class="wp-block-paragraph">Run a cache warmer after every deploy or full cache flush, and on a schedule after that, because Magento purges Varnish whenever products, categories, prices or promotion rules change. Warmers run from cron, and one vendor&#8217;s setup guide recommends running cron every one to five minutes so the queue keeps moving. Schedule full crawls outside peak trading hours.</p>



<h3 class="wp-block-heading">Do you still need a cache warmer if the cold build is fast?</h3>



<p class="wp-block-paragraph">Less, but a light one still helps. A faster cold build cuts what every cache miss costs, including the misses a warmer rarely covers, such as filter combinations, unusual search terms and customer groups it doesn&#8217;t warm. A small warmer for your top pages after each deploy then covers the busiest URLs, and each request it sends takes less server time because the build behind it is faster.</p>



<h2 class="wp-block-heading">Before you install a Magento 2 cache warmer</h2>



<p class="wp-block-paragraph">Before you install a Magento 2 cache warmer, check how many page views the full page cache actually serves and where the misses come from. If most pages already come from the cache and the store still feels slow, look at <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">why a Magento store is slow</a>. If most misses are guests after deploys, a warmer is a quick fix. If they are logged-in customers, filters and search, speed up the cold build, because a crawl covers few of those pages.</p>



<p class="wp-block-paragraph">Measure that on your own store, by context: guest sessions after a deploy, logged-in sessions, filtered URLs and search results, each on its own. The split tells you which fix you are buying. A warmer is one fix among many, and our guide to <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">speed up Magento</a> puts it in order with the server, database and frontend fixes.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Does a cache warmer increase server load?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, while it runs. Every URL a warmer requests is a full page build in PHP, the same work a shopper's first visit would trigger. That is why warmers come with a concurrency limit and a delay between requests, and some pause when system load passes a threshold. Adobe describes its own post-deploy warm-up concurrency setting as a way to reduce server load."}}, {"@type": "Question", "name": "Can you warm the Magento cache for logged-in customers?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, per customer group, if the warmer supports it. Magento caches catalog pages for logged-in shoppers with one copy per context, which includes the customer group, and some warmers let you choose the groups to warm. Per-customer data such as the cart isn't in the page cache, because Magento loads it in the browser through an AJAX request. Each group you add means another full pass over your URLs."}}, {"@type": "Question", "name": "What is the difference between a cold cache and a warm cache?", "acceptedAnswer": {"@type": "Answer", "text": "A cold cache doesn't hold the page a shopper asked for, so Magento builds it in PHP, runs the database queries behind it and stores the result. A warm cache already holds the finished page and returns it without running PHP. That is why the first visit to a page after a flush is slower than every visit after it, until the page expires or is purged."}}, {"@type": "Question", "name": "How does Adobe Commerce Cloud warm the cache after a deploy?", "acceptedAnswer": {"@type": "Answer", "text": "Adobe Commerce on Cloud warms the cache in the post-deploy stage. The WARM_UP_PAGES variable in .magento.env.yaml lists the pages to preload, and its default is index.php alone. You can add categories, CMS pages, products and store pages by pattern, and WARM_UP_CONCURRENCY limits simultaneous requests to reduce server load. The post-deploy hook has to be configured for this to run."}}, {"@type": "Question", "name": "How often should a Magento cache warmer run?", "acceptedAnswer": {"@type": "Answer", "text": "Run a cache warmer after every deploy or full cache flush, and on a schedule after that, because Magento purges Varnish whenever products, categories, prices or promotion rules change. Warmers run from cron, and one vendor's setup guide recommends running cron every one to five minutes so the queue keeps moving. Schedule full crawls outside peak trading hours."}}, {"@type": "Question", "name": "Do you still need a cache warmer if the cold build is fast?", "acceptedAnswer": {"@type": "Answer", "text": "Less, but a light one still helps. A faster cold build cuts what every cache miss costs, including the misses a warmer rarely covers, such as filter combinations, unusual search terms and customer groups it doesn't warm. A small warmer for your top pages after each deploy then covers the busiest URLs, and each request it sends takes less server time because the build behind it is faster."}}]}</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em> </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>Send us your slowest pages</em></a><em> and how often your cache empties, and we&#x27;ll tell you whether a warmer, a faster cold build or both fits your store.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-cache-warmer/">Magento 2 Cache Warmer: Do You Need One, and What It Can&#8217;t Fix</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The 9 Best Magento Speed Optimization Extensions in 2026</title>
		<link>https://scandiweb.com/blog/best-magento-speed-optimization-extensions/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Thu, 29 Oct 2026 18:31:00 +0000</pubDate>
				<category><![CDATA[Collection]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[adobe commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[magento 2]]></category>
		<category><![CDATA[magento optimization]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[pagespeed]]></category>
		<category><![CDATA[site performance]]></category>
		<category><![CDATA[website optimization]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26551</guid>

					<description><![CDATA[<p>Compare 9 Magento speed optimization extensions by the layer they speed up: page build, cache, JavaScript, images and CDN. Prices checked October 2026.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/best-magento-speed-optimization-extensions/">The 9 Best Magento Speed Optimization Extensions in 2026</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-bmsoe wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/solutions/magento/expedio" target=_blank >
        2x Faster Magento with Expedio
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-performance-optimization" target=_blank >
        Magento Performance
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/aws-hosting-services-readymage" target=_blank >
        Magento Hosting (ReadyMage)
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">When a Magento (Adobe Commerce) store gets slow, the extension marketplace is often the first place a team looks, and dozens of modules promise faster pages and better PageSpeed scores. Each Magento speed optimization extension works on a different part of the page load: how the server builds the page, the cache that keeps finished copies of pages ready, or the images, scripts and styles the browser loads afterward. The right one depends on which part is slow on your store.</p>



<p class="wp-block-paragraph">That part is often the server. In Chrome&#8217;s real-user data for September 2026, published by HTTP Archive, only 23% of Magento sites on mobile had a good server response time, meaning the server started sending pages within 0.8 seconds on three out of four visits.</p>



<p class="wp-block-paragraph">Every extension here is on sale or free today. We read each vendor page or Adobe Commerce Marketplace listing on October 29, 2026, for price, Magento 2.4 support and Hyvä support. One extension per job is usually enough.</p>



<h2 class="wp-block-heading">Magento speed optimization extensions compared</h2>



<p class="wp-block-paragraph">The best Magento speed optimization extension depends on which part of the page load is slow. Expedio speeds up how the server builds each page. Mirasvit and Magefan warmers keep the full page cache filled. Amasty, Magefan and WeltPixel optimize JavaScript and CSS, Yireo and Mageplaza handle images, and Fastly delivers pages from servers near the shopper.</p>



<p class="wp-block-paragraph">Prices and versions were read on October 29, 2026.</p>



<figure class="wp-block-table"><table><thead><tr><th>#</th><th>Extension</th><th>Vendor</th><th>Layer it speeds up</th><th>Price</th><th>Magento 2.4 (as listed)</th><th>Hyvä (vendor&#8217;s statement)</th></tr></thead><tbody><tr><td>1</td><td>Expedio</td><td>scandiweb</td><td>Server page build</td><td>Open-source core free, Supported €990/year</td><td>Open Source, Adobe Commerce, Commerce Cloud</td><td>Yes, works under any theme</td></tr><tr><td>2</td><td>Full Page Cache Warmer</td><td>Mirasvit</td><td>Full page cache</td><td>$179 first year (Open Source edition), $108/year after</td><td>2.3 to 2.4.9</td><td><span style="display:inline-block;padding:4px 8px;background-color:#e7e9f8;color:#3f4aaf;border-radius:4px;font-weight:600;">Yes</span></td></tr><tr><td>3</td><td>Full Page Cache Warmer</td><td>Magefan</td><td>Full page cache</td><td>€161 one-time</td><td>2.3.0 to 2.4.9</td><td><span style="display:inline-block;padding:4px 8px;background-color:#e7e9f8;color:#3f4aaf;border-radius:4px;font-weight:600;">Yes</span></td></tr><tr><td>4</td><td>Google Page Speed Optimizer Pro</td><td>Amasty</td><td>JavaScript, CSS and images</td><td>$209/year (Community), free base edition</td><td>2.4.5-p15 to 2.4.9</td><td><span style="display:inline-block;padding:4px 8px;background-color:#e7e9f8;color:#3f4aaf;border-radius:4px;font-weight:600;">Yes</span></td></tr><tr><td>5</td><td>Google Page Speed Optimizer</td><td>Magefan</td><td>JavaScript, CSS and images</td><td>Basic $0 (regular $99), Plus $199, Extra $349, one-time</td><td>2.3.0 to 2.4.9</td><td><span style="display:inline-block;padding:4px 8px;background-color:#e7e9f8;color:#3f4aaf;border-radius:4px;font-weight:600;">Yes</span></td></tr><tr><td>6</td><td>Speed Optimization (Advanced JS Bundling)</td><td>WeltPixel</td><td>JavaScript and CSS</td><td>Free (MIT)</td><td>2.4.0 to 2.4.9</td><td>Not stated</td></tr><tr><td>7</td><td>Webp2</td><td>Yireo</td><td>Images (WebP)</td><td>Free, open source</td><td>2.4.6 and later</td><td><span style="display:inline-block;padding:4px 8px;background-color:#e7e9f8;color:#3f4aaf;border-radius:4px;font-weight:600;">Yes</span></td></tr><tr><td>8</td><td>Lazy Loading for Magento 2</td><td>Mageplaza</td><td>Images (lazy loading)</td><td>From $79</td><td>2.4.4 to 2.4.8</td><td>On request</td></tr><tr><td>9</td><td>Fastly CDN module</td><td>Fastly</td><td>Delivery (CDN)</td><td>Free module, Fastly included on Adobe Commerce Cloud</td><td>Installed on Adobe Commerce Cloud</td><td>Not stated</td></tr></tbody></table><figcaption class="wp-element-caption">Magento speed optimization extensions compared: layer, price and compatibility (read October 29, 2026)</figcaption></figure>



<p class="wp-block-paragraph">Prices and versions as listed on each vendor page or Marketplace listing on October 29, 2026. Marketplace prices for Adobe Commerce editions are higher.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-layer-map.png" alt="Magento speed optimization extension layers: server page build, full page cache, CDN, then images, JavaScript and CSS" class="wp-image-26548" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-layer-map.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-layer-map-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-layer-map-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-layer-map-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-layer-map-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-layer-map-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-layer-map-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Each speed extension works on one stage of the page load, from the server that builds the page to the images the browser downloads.</figcaption></figure></div>



<p class="wp-block-paragraph">The list follows a page request from the server to the shopper&#8217;s screen, and each Magento 2 speed optimization extension is placed on the stage it works on.</p>



<h2 class="wp-block-heading">Which part of your store is slow? Check before you buy</h2>



<p class="wp-block-paragraph">Test your slowest page in Google PageSpeed Insights before you buy an extension. If it reports &#8220;Server responded slowly&#8221;, the delay happens before the browser receives anything, so the fix belongs on the server or in the cache. If the server responds quickly but the page still loads slowly, look at images, JavaScript and CSS.</p>



<p class="wp-block-paragraph">PageSpeed Insights, Google&#8217;s free page test, runs that check for you. Since Lighthouse 13, it appears under the <a href="https://developer.chrome.com/docs/performance/insights/document-latency" target="_blank" rel="noopener">Document request latency</a> insight, and &#8220;Server responded slowly&#8221; means the browser waited more than 600 ms for the main request. Google calls a server response of 0.8 seconds or less good and more than 1.8 seconds poor. If yours is in the poor range, see how to <a href="https://scandiweb.com/blog/reduce-initial-server-response-time/" target="_blank" rel="noopener">reduce server response time</a>. Our guide on how to <a href="https://scandiweb.com/blog/how-to-and-how-not-to-use-google-pagespeed-insights/" target="_blank" rel="noopener">read Google PageSpeed Insights</a> covers the rest of the report, including the Core Web Vitals: Largest Contentful Paint, the time until the largest image or text block appears, response to taps, and layout shifts.</p>



<p class="wp-block-paragraph">A theme changes only the browser side. In <a href="https://httparchive.org/reports/techreport/tech?tech=Magento,Shopify" target="_blank" rel="noopener">HTTP Archive&#8217;s September 2026 report</a>, 66% of Hyvä sites passed all three Core Web Vitals on mobile, against 45% of Magento sites overall, while 23% of each group had a good server response time. More causes are in our post on <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">why a Magento store is slow</a>.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>PageSpeed Insights now lists the slow-server check under &#8220;Document request latency&#8221;. If it says &#8220;Server responded slowly&#8221;, fix the page build or the cache first. Image and JavaScript extensions work after that wait, so they can&#8217;t shorten it.</p></div>



<h2 class="wp-block-heading">Server page build: make Magento build each page faster</h2>



<p class="wp-block-paragraph">A server-side speed extension shortens the time Magento spends building a page in PHP before it sends anything. That build runs on every request the full page cache can&#8217;t answer, which happens more often on filtered, search and logged-in pages. Expedio works on this layer and keeps your theme, design and data as they are.</p>



<h3 class="wp-block-heading">1. Expedio by scandiweb</h3>



<p class="wp-block-paragraph"><a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> speeds up how Magento builds each page on the server: the PHP work of running code, querying the database and assembling the HTML before anything is sent. It applies Liquid, the open-source template language created at Shopify, underneath your theme, and the core is open source.</p>



<p class="wp-block-paragraph">In a benchmark on one merchant&#8217;s Hyvä store, measured as server response time, stock Magento took a median of 181 ms to build 100 category pages with all caches empty, and Expedio took 57 ms. A full category page went from 655 database queries to 30. The setup is in the <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">benchmark</a>.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores whose pages are slow before any image or script loads, with slow category, search and filtered pages, logged-in or B2B shoppers whose pages miss the cache more often, or a server that slows down at peak traffic.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>At least 2x faster page build, and 3x the traffic on the same server before response times start to rise</li>


<li>Works under Luma, Hyvä and custom themes, and keeps your design, catalog, prices, checkout, orders and data as they are</li>


<li>Install the core yourself, or ask Ari, scandiweb&#8217;s agent for Magento, to install it on a copy of your store for your team to review and release</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> Open Source free, major releases only. Supported €990 a year, with updates, compatibility fixes for Magento, Hyvä and other extensions, and support. Implementation Audit €4,900 the first year, then €990 a year. Done for you €19,900 the first year, then €990 a year, with 2x speed guaranteed by contract.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2 Open Source, Adobe Commerce and Adobe Commerce Cloud, on <a href="https://scandiweb.com/services/aws-hosting-services-readymage" target="_blank" rel="noopener">ReadyMage</a>, scandiweb&#8217;s Magento hosting, or any other Magento host.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png" alt="The Expedio page on scandiweb.com with the headline Magento. 2x faster. and buttons to get Expedio or try the demo" class="wp-image-25972" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Expedio makes Magento at least 2x faster without changing your theme or data</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Expedio works on the server, before the browser gets anything, so it combines with any browser-side extension further down this list. Fix the page build first, then the scripts and images.</p></div>



<h2 class="wp-block-heading">Full page cache and cache warming extensions</h2>



<p class="wp-block-paragraph">A cache warming extension requests your store&#8217;s pages before shoppers do, so Magento&#8217;s full page cache already holds a finished copy when someone arrives. Our guide to the <a href="https://scandiweb.com/blog/magento-cache-warmer/" target="_blank" rel="noopener">Magento 2 cache warmer</a> covers which pages a warmer refills and which it misses. It helps after deploys, cache flushes and catalog updates, which empty the cache. Each page it warms is still a full build on your server, so warmers let you limit threads and pause under load.</p>



<p class="wp-block-paragraph">The <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">Magento full page cache</a> keeps finished copies of pages, and Magento empties them when products, categories, prices or promotion rules change, and whenever the cache is cleaned or flushed. A Magento 2 cache extension of this kind refills it before shoppers arrive.</p>



<h3 class="wp-block-heading">2. Mirasvit Full Page Cache Warmer</h3>



<p class="wp-block-paragraph"><a href="https://commercemarketplace.adobe.com/mirasvit-module-cache-warmer-mp.html" target="_blank" rel="noopener">Mirasvit Full Page Cache Warmer</a> is a crawler that requests your pages after the cache empties, so the next shopper gets a stored copy.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores that deploy or flush the cache often.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>Warming sources from sitemap.xml, a CSV file or visitor behavior</li>


<li>Rules and priorities by customer group, currency and page type, with presets, custom threads and a system-load threshold</li>


<li>Detects flushes made outside Magento, such as a Redis or Varnish restart (release 1.11.16)</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> $179 for the first year on the Open Source edition, $108 a year to renew. Commerce editions cost more.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2.3 to 2.4.9, Hyvä ready per the vendor. Marketplace version 1.11.16, updated October 29, 2026.</p>



<h3 class="wp-block-heading">3. Magefan Full Page Cache Warmer</h3>



<p class="wp-block-paragraph"><a href="https://magefan.com/magento-2-full-page-cache-warmer" target="_blank" rel="noopener">Magefan Full Page Cache Warmer</a> warms the cache automatically or on a schedule, starting with the most visited pages.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores with several store views, currencies or customer groups that want to choose which ones to warm.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>Priority by page visits, with warmup profiles by store view, customer group and currency</li>


<li>Presets, plus a setting that stops warming when system load passes a limit</li>


<li>Exclusions by URL pattern, user agent or country, and reports on CPU use and cache hits</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> €161 one-time, as shown that day, with 365 days of updates and support. Also included in Magefan&#8217;s Page Speed Optimizer Extra plan.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2.3.0 to 2.4.9, Hyvä, Breeze, Mage-OS and Adobe Commerce Cloud. Version 2.1.5.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Before you buy a warmer, multiply your URLs by the store views, currencies and customer groups you would warm. That is how many full page builds one warming pass adds to your server.</p></div>



<h2 class="wp-block-heading">JavaScript and CSS: Google PageSpeed optimizer extensions</h2>



<p class="wp-block-paragraph">JavaScript and CSS optimizers change how the browser downloads your store&#8217;s code after the HTML arrives. They minify files, defer scripts the page doesn&#8217;t need to appear, bundle JavaScript by page type and preload styles. The two all-in-one Google PageSpeed optimizers below also convert images to WebP and lazy load them.</p>



<p class="wp-block-paragraph">Minify means stripping spaces and comments from code files. Defer means the browser downloads a script without pausing the page and runs it after the page is built. Bundling combines many small script files into a few, and preload tells the browser early which styles it will need. Most Magento page speed optimization on this layer comes down to those four settings. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/performance-best-practices/configuration" target="_blank" rel="noopener">performance best practices</a> call Magento&#8217;s built-in minification and bundling fallback alternatives, recommend third-party tools, advise against merging JavaScript and CSS files, and say not to bundle at all on HTTP/2.</p>



<h3 class="wp-block-heading">4. Amasty Google Page Speed Optimizer Pro</h3>



<p class="wp-block-paragraph"><a href="https://commercemarketplace.adobe.com/amasty-module-optimizer-pro.html" target="_blank" rel="noopener">Amasty Google Page Speed Optimizer Pro</a> is one module that minifies and bundles code, converts images to WebP or AVIF, and lazy loads them. Amasty calls it a Magento PageSpeed module.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores that want one module for code and image optimization, with a built-in diagnostic that reads PageSpeed results.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>JavaScript bundling, defer or async loading, HTML and CSS minification</li>


<li>AVIF and WebP conversion, compression, lazy loading and image preload</li>


<li>Back Forward Cache</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> $209 a year on the Community edition, $129 to extend. A free base edition covers lazy loading. Premium $629.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2.4.5-p15 to 2.4.9 as listed. Hyvä ready, with the Hyvä package on an active subscription. Image features need JPEG, PNG, GIF and WebP tools on the server. Version 3.10.0.</p>



<h3 class="wp-block-heading">5. Magefan Google Page Speed Optimizer</h3>



<p class="wp-block-paragraph"><a href="https://magefan.com/magento-2-google-page-speed-optimizer" target="_blank" rel="noopener">Magefan Google Page Speed Optimizer</a> defers and bundles JavaScript, minifies HTML and CSS, lazy loads images, and in higher plans converts images to WebP and warms the cache.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores that want to start free and add WebP and cache warming later with one vendor.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>JavaScript deferral and bundling, CSS merging and minification</li>


<li>Image lazy loading</li>


<li>WebP conversion in Plus, full page cache warming in Extra</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> Basic listed at $0 (regular price $99), Plus $199, Extra $349, one-time, with 365 days of support and updates.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2.3.0 to 2.4.9, Hyvä, Breeze, Mage-OS and Adobe Commerce Cloud. Version 2.0.4. Also available <a href="https://scandiweb.com/blog/ari-magefan-partnership/" target="_blank" rel="noopener">through Ari</a>, which installs the free version on a copy of your store.</p>



<h3 class="wp-block-heading">6. WeltPixel Speed Optimization with Advanced JS Bundling</h3>



<p class="wp-block-paragraph"><a href="https://weltpixel.com/products/magento-2-speed-optimization-advanced-js-bundling" target="_blank" rel="noopener">WeltPixel Advanced JS Bundling</a> builds JavaScript bundles by page type, a shared bundle plus one per page type, moves scripts to the bottom of the page and preloads CSS. In <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/performance-best-practices/concepts/advanced-js-bundling" target="_blank" rel="noopener">Adobe&#8217;s test of this approach</a>, bundling by page type made an empty homepage load twice as fast as native bundling.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores on Magento&#8217;s default frontend that want Adobe&#8217;s recommended bundling approach without building it by hand.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>Advanced bundling by page type</li>


<li>JavaScript moved to the page bottom, CSS preloading, optimization with Terser</li>


<li>CLI commands for Magento 2.4.8 CSP rules</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> free, MIT license, 12 months of support included.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2.4.0 to 2.4.9, Open Source, Commerce and Commerce Cloud. Version 1.16.0, January 7, 2026. Hyvä support isn&#8217;t stated.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Run one JavaScript optimizer at a time. Adobe advises against merging JavaScript and CSS files, and against bundling at all on HTTP/2, so check how your server delivers files before you switch bundling on.</p></div>



<h2 class="wp-block-heading">Magento image optimization extensions</h2>



<p class="wp-block-paragraph">Magento image optimization extensions make product and category images smaller or load them later. WebP converters serve a lighter copy of each JPEG or PNG to browsers that support it, and lazy loading waits to load images below the visible screen until the shopper scrolls. Keep the first visible image out of lazy loading so it appears without delay.</p>



<p class="wp-block-paragraph"><a href="https://developers.google.com/speed/webp" target="_blank" rel="noopener">Google&#8217;s WebP data</a> puts lossy WebP at 25 to 34% smaller than comparable JPEGs at equal quality, and lossless WebP at 26% smaller than PNG. In a 2026 <a href="https://web.dev/case-studies/nuvemshop" target="_blank" rel="noopener">web.dev case study</a>, Nuvemshop removed lazy loading from the first above-the-fold image, along with other changes, and improved Largest Contentful Paint by 68%. Entries 4 and 5 already convert to WebP and lazy load, so don&#8217;t add a second Magento 2 image optimization extension for the same job.</p>



<h3 class="wp-block-heading">7. Yireo Webp2</h3>



<p class="wp-block-paragraph"><a href="https://github.com/yireo/Yireo_Webp2" target="_blank" rel="noopener">Yireo Webp2</a> converts JPEG and PNG images to WebP and serves both inside a picture tag, so browsers that support WebP get the lighter file and the rest get the original.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores that want a Magento 2 WebP extension without a paid suite.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>On-the-fly WebP conversion</li>


<li>Picture tag with the original image as fallback</li>


<li>Hyvä support built in, GraphQL through a separate module</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> free, open source (OSL-3.0).</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2.4.6 and later per the GitHub badge. Needs the Yireo_NextGenImages module.</p>



<h3 class="wp-block-heading">8. Mageplaza Lazy Loading for Magento 2</h3>



<p class="wp-block-paragraph"><a href="https://www.mageplaza.com/magento-2-lazy-loading/" target="_blank" rel="noopener">Mageplaza Lazy Loading for Magento 2</a> is a Magento 2 lazy load extension that loads images below the visible screen only when the shopper scrolls toward them.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> long category and search pages with many product images.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>Category, product, CMS, search and checkout pages, plus related, cross-sell and up-sell blocks</li>


<li>Blur, low-resolution or custom placeholders, and a threshold to start loading just before an image appears</li>


<li>Exclusions by URL, CSS class or image name, which keep the first visible image out</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> from $79 (Enterprise $279), free installation, 60-day money-back.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2.4.4 to 2.4.8 as listed. Hyvä compatibility on request, free. Version 4.0.6, April 15, 2025.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>When the eCommerce platform Nuvemshop stopped lazy loading the first image above the fold, along with other changes, its Largest Contentful Paint improved by 68%, according to a 2026 web.dev case study.</p></div>



<h2 class="wp-block-heading">Other layers: a CDN that serves pages closer to shoppers</h2>



<p class="wp-block-paragraph">A content delivery network (CDN) keeps copies of your pages, images and files on servers around the world, so shoppers far from your hosting get them from a nearby location. On Adobe Commerce on Cloud, Fastly does this through the Fastly CDN module for Magento 2, and Adobe includes it at no additional cost.</p>



<p class="wp-block-paragraph">Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/cdn/fastly" target="_blank" rel="noopener">Fastly CDN documentation</a> describes it as a Varnish-based service that caches pages, assets and CSS, with image optimization and DDoS protection included.</p>



<h3 class="wp-block-heading">9. Fastly CDN module for Magento 2</h3>



<p class="wp-block-paragraph"><a href="https://github.com/fastly/fastly-magento2" target="_blank" rel="noopener">Fastly CDN module for Magento 2</a> connects Magento&#8217;s page cache to Fastly&#8217;s network, which keeps copies of pages, images and files on servers near shoppers.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores on Adobe Commerce on Cloud, where Fastly is included, and stores with shoppers spread across distant countries.</p>



<p class="wp-block-paragraph"><strong>Key features:</strong></p>



<ul class="wp-block-list">
<li>Edge caching that extends Magento&#8217;s Varnish setup</li>


<li>Image optimization at the edge</li>


<li>Serve stale content on error, and soft purging</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (October 29, 2026):</strong> the module is free and open source (BSD-3-Clause). Adobe includes the Fastly service with Adobe Commerce on cloud infrastructure at no additional cost.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Adobe Commerce on Cloud Pro and Starter production environments.</p>



<h2 class="wp-block-heading">Which Magento speed optimization extension do you need?</h2>



<p class="wp-block-paragraph">Choose the Magento speed optimization extension that matches the slow layer. A slow server response points to the page build, so start with Expedio. Pages that are fast on a repeat visit but slow on the first one point to cache misses and a warmer. A quick server with a slow page points to JavaScript, CSS or image extensions.</p>



<figure class="wp-block-table"><table><thead><tr><th>What you see</th><th>Slow layer</th><th>Extension type</th><th>On this list</th></tr></thead><tbody><tr><td>PageSpeed Insights says &#8220;Server responded slowly&#8221;, or pages take over 0.8 s to start arriving</td><td>Server page build</td><td>Server-side speed module</td><td>Expedio</td></tr><tr><td>Pages are slow on the first visit after a deploy or catalog update, then fast</td><td>Full page cache</td><td>Cache warmer, plus a faster build for every miss</td><td>Mirasvit, Magefan, Expedio</td></tr><tr><td>The server answers quickly, but the page is slow to appear or to respond to taps</td><td>JavaScript and CSS</td><td>PageSpeed optimizer, JS bundling</td><td>Amasty, Magefan, WeltPixel</td></tr><tr><td>Product photos are large JPEG or PNG files, or long pages load every image at once</td><td>Images</td><td>WebP converter, lazy loading</td><td>Yireo, Mageplaza (Amasty and Magefan include both)</td></tr><tr><td>Shoppers in distant countries wait longer than those near your server</td><td>Delivery</td><td>CDN</td><td>Fastly</td></tr></tbody></table><figcaption class="wp-element-caption">Match what you see to the slow layer and the extension type that fixes it</figcaption></figure>



<p class="wp-block-paragraph"><strong>Start with Expedio if:</strong></p>



<ul class="wp-block-list">
<li>PageSpeed Insights flags &#8220;Document request latency&#8221; with &#8220;Server responded slowly&#8221;.</li>


<li>Category, search and filtered pages are slow before any image appears.</li>


<li>Logged-in or B2B customers see slower pages than guests, because their pages miss the cache more often.</li>


<li>Your server slows down at peak traffic.</li>


<li>Pages stay slow after every deploy or cache flush.</li>

</ul>



<p class="wp-block-paragraph"><strong>Add a cache warmer if:</strong></p>



<ul class="wp-block-list">
<li>Pages are fast on a repeat visit and slow on the first.</li>


<li>Deploys, price imports or promotion changes empty the cache during the day.</li>


<li>Most of your traffic lands on a known set of category and product pages.</li>

</ul>



<p class="wp-block-paragraph"><strong>Add a JavaScript and CSS optimizer if:</strong></p>



<ul class="wp-block-list">
<li>The server responds in well under a second, but content takes long to show.</li>


<li>Your theme loads many separate script files on every page.</li>


<li>You aren&#8217;t running another tool that already bundles or minifies.</li>

</ul>



<p class="wp-block-paragraph"><strong>Add an image extension if:</strong></p>



<ul class="wp-block-list">
<li>Product and category images are still JPEG or PNG.</li>


<li>Long category pages load every image at once on mobile.</li>


<li>Your current optimizer doesn&#8217;t already convert to WebP or lazy load.</li>

</ul>



<p class="wp-block-paragraph"><strong>Add a CDN if:</strong></p>



<ul class="wp-block-list">
<li>You sell in countries far from your hosting.</li>


<li>You run Adobe Commerce on Cloud, where Fastly is included, and want to check it&#8217;s configured.</li>

</ul>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-decision-tree.png" alt="Decision tree for choosing a Magento speed extension by the slow layer: server, cache, JavaScript and CSS, images or CDN" class="wp-image-26549" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-decision-tree.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-decision-tree-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-decision-tree-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-decision-tree-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-decision-tree-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-decision-tree-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/best-magento-speed-optimization-extensions-decision-tree-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Find the slow layer first, then pick the extension type that works on it.</figcaption></figure></div>



<h2 class="wp-block-heading">How to add speed extensions without slowing the store</h2>



<p class="wp-block-paragraph">Install one extension per job, try it on a copy of your store first, and measure the same pages before and after. Two tools that both bundle JavaScript, convert images or lazy load change the same files and can conflict. Flush the cache after installing, as Adobe advises, then compare server response time and page load again.</p>



<ol class="wp-block-list">
<li>Measure the homepage, a category page and a product page before and after, noting server response time and page load.</li>


<li>Install one tool per job, on a copy of the store first.</li>


<li>Flush the cache after installing, which Adobe lists as a standing rule, then measure again.</li>

</ol>



<p class="wp-block-paragraph">Fewer, well-chosen modules are easier to keep fast, and our guide to the <a href="https://scandiweb.com/blog/best-magento-extensions/" target="_blank" rel="noopener">Magento 2 extensions every store needs</a> covers how to spot redundant ones.</p>



<h2 class="wp-block-heading">Frequently asked questions about Magento speed optimization extensions</h2>



<h3 class="wp-block-heading">What is the best Magento speed optimization extension?</h3>



<p class="wp-block-paragraph">It depends on which part of the page load is slow. For the server&#8217;s page build, the pick is Expedio, which makes Magento at least 2x faster without changing the theme or data. For cache misses after deploys, use a warmer such as Mirasvit&#8217;s or Magefan&#8217;s. For JavaScript, CSS and images, the Google Page Speed Optimizers from Amasty and Magefan cover the most ground in one module.</p>



<h3 class="wp-block-heading">Is there a free Magento speed optimization extension?</h3>



<p class="wp-block-paragraph">Yes. Expedio&#8217;s open-source core is free to download and run yourself. WeltPixel&#8217;s Advanced JS Bundling module is free under the MIT license, and Yireo&#8217;s Webp2 module is open source. Amasty&#8217;s base Google Page Speed Optimizer edition costs $0 and covers lazy loading, and Magefan listed its Basic edition at $0 on October 29, 2026. Paid editions add features and support.</p>



<h3 class="wp-block-heading">Can two Magento speed extensions conflict?</h3>



<p class="wp-block-paragraph">Yes, when they do the same job. Two modules that both bundle JavaScript, minify CSS, convert images to WebP or lazy load images change the same files and can break pages. Pick one tool per job, test it on a copy of the store, and flush the cache after installing. Extensions that work on different layers, such as a server-side module and an image optimizer, can run side by side.</p>



<h3 class="wp-block-heading">Do you need a page speed extension if you use Hyvä?</h3>



<p class="wp-block-paragraph">Usually, for the layers a theme doesn&#8217;t touch. In HTTP Archive&#8217;s September 2026 data, 66% of Hyvä sites passed all three Core Web Vitals on mobile, against 45% of Magento sites overall, yet only 23% of each group had a good server response time. A faster theme leaves the server&#8217;s page build as it was, so server-side and image extensions still apply.</p>



<h3 class="wp-block-heading">Is WebP better than JPEG for Magento product images?</h3>



<p class="wp-block-paragraph">For file size, yes. Google says lossy WebP images are 25 to 34% smaller than comparable JPEG images at equal quality on the SSIM index, and lossless WebP images are 26% smaller than PNGs. Smaller files download faster, which matters most on long category pages. Extensions such as Yireo&#8217;s Webp2 keep the original JPEG or PNG as a fallback inside a picture tag.</p>



<h3 class="wp-block-heading">Should you use Magento&#8217;s built-in JavaScript bundling instead of an extension?</h3>



<p class="wp-block-paragraph">Adobe calls Magento&#8217;s built-in minification and bundling &#8220;fallback alternatives&#8221; and recommends third-party tools instead. It also advises against merging JavaScript and CSS files, and says not to merge or bundle at all if your server uses HTTP/2. In Adobe&#8217;s own test, bundling by page type made an empty homepage load twice as fast as native bundling.</p>



<h2 class="wp-block-heading">Choose a Magento speed optimization extension by the slow layer</h2>



<p class="wp-block-paragraph">A Magento speed optimization extension works only on the layer it was built for. Measure first, then fix the slowest layer: Expedio for the server page build, a warmer for cache misses after deploys, an all-in-one optimizer for JavaScript and CSS, an image extension for heavy product photos and a CDN for distant shoppers.</p>



<p class="wp-block-paragraph">Extensions are one part of the work, and our guide on how to <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">speed up Magento</a> puts the server, cache, database and frontend fixes in order. Prices and versions above are what the vendor pages showed on October 29, 2026, so open the vendor page again before you buy. Where a module is free, put it on a copy of the store first, and measure the same pages before and after whatever you install.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What is the best Magento speed optimization extension?", "acceptedAnswer": {"@type": "Answer", "text": "It depends on which part of the page load is slow. For the server's page build, the pick is Expedio, which makes Magento at least 2x faster without changing the theme or data. For cache misses after deploys, use a warmer such as Mirasvit's or Magefan's. For JavaScript, CSS and images, the Google Page Speed Optimizers from Amasty and Magefan cover the most ground in one module."}}, {"@type": "Question", "name": "Is there a free Magento speed optimization extension?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Expedio's open-source core is free to download and run yourself. WeltPixel's Advanced JS Bundling module is free under the MIT license, and Yireo's Webp2 module is open source. Amasty's base Google Page Speed Optimizer edition costs $0 and covers lazy loading, and Magefan listed its Basic edition at $0 on October 29, 2026. Paid editions add features and support."}}, {"@type": "Question", "name": "Can two Magento speed extensions conflict?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, when they do the same job. Two modules that both bundle JavaScript, minify CSS, convert images to WebP or lazy load images change the same files and can break pages. Pick one tool per job, test it on a copy of the store, and flush the cache after installing. Extensions that work on different layers, such as a server-side module and an image optimizer, can run side by side."}}, {"@type": "Question", "name": "Do you need a page speed extension if you use Hyvä?", "acceptedAnswer": {"@type": "Answer", "text": "Usually, for the layers a theme doesn't touch. In HTTP Archive's September 2026 data, 66% of Hyvä sites passed all three Core Web Vitals on mobile, against 45% of Magento sites overall, yet only 23% of each group had a good server response time. A faster theme leaves the server's page build as it was, so server-side and image extensions still apply."}}, {"@type": "Question", "name": "Is WebP better than JPEG for Magento product images?", "acceptedAnswer": {"@type": "Answer", "text": "For file size, yes. Google says lossy WebP images are 25 to 34% smaller than comparable JPEG images at equal quality on the SSIM index, and lossless WebP images are 26% smaller than PNGs. Smaller files download faster, which matters most on long category pages. Extensions such as Yireo's Webp2 keep the original JPEG or PNG as a fallback inside a picture tag."}}, {"@type": "Question", "name": "Should you use Magento's built-in JavaScript bundling instead of an extension?", "acceptedAnswer": {"@type": "Answer", "text": "Adobe calls Magento's built-in minification and bundling \"fallback alternatives\" and recommends third-party tools instead. It also advises against merging JavaScript and CSS files, and says not to merge or bundle at all if your server uses HTTP/2. In Adobe's own test, bundling by page type made an empty homepage load twice as fast as native bundling."}}]}</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em>Send us </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>the URL of your slowest page</em></a><em>, and we&#x27;ll tell you which layer is holding it back and which fix comes first.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/best-magento-speed-optimization-extensions/">The 9 Best Magento Speed Optimization Extensions in 2026</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Why Is My Magento Site So Slow? 12 Causes and How to Fix Each</title>
		<link>https://scandiweb.com/blog/why-is-magento-slow/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Thu, 29 Oct 2026 17:43:00 +0000</pubDate>
				<category><![CDATA[Collection]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[adobe commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[magento 2]]></category>
		<category><![CDATA[magento optimization]]></category>
		<category><![CDATA[Magento Support]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[site performance]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26521</guid>

					<description><![CDATA[<p>Magento performance issues show up as symptoms first. Match what you see to one of 12 causes, the fix, and who on your team should own it.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/why-is-magento-slow/">Why Is My Magento Site So Slow? 12 Causes and How to Fix Each</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-why-i wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/solutions/magento/expedio" target=_blank >
        2x Faster Magento with Expedio
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-performance-optimization" target=_blank >
        Magento Performance
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/aws-hosting-services-readymage" target=_blank >
        Magento Hosting (ReadyMage)
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">One morning, a merchant wrote to our support team that the Magento (Adobe Commerce) admin had been slow for a couple of days, and asked whether an index needed clearing. It was a reasonable guess. The cause was a large bulk job running in the background, and the admin was back to normal once the job finished. Magento performance issues often work like that. You notice the slowness in one place, and the cause is somewhere else.</p>



<p class="wp-block-paragraph">Slow server response is also widespread on the platform. In <a href="https://httparchive.org/reports/techreport/tech?tech=Magento" target="_blank" rel="noopener">HTTP Archive&#8217;s September 2026 data</a>, 23% of Magento sites had a good time to first byte on mobile, against 46% of websites overall. That figure counts origins, so it says nothing about your store in particular. It is a reason to measure before you assume the platform is at fault.</p>



<h2 class="wp-block-heading">What causes Magento performance issues?</h2>



<p class="wp-block-paragraph">Magento performance issues come from a short list of causes: pages that miss the cache, a cache that isn&#8217;t working, stalled cron jobs, bots, heavy extensions, setup mistakes, small servers, a bloated database, a heavy theme, and work running in the admin. The symptom points to the cause, so start from what you see.</p>



<p class="wp-block-paragraph">Find the row that matches what you see, then read that cause below. These are the twelve causes we meet most in Magento support work, and the last column names who on your side usually owns the fix.</p>



<figure class="wp-block-table"><table><thead><tr><th>#</th><th>What you see</th><th>Likely cause</th><th>Fix</th><th>Who fixes it</th></tr></thead><tbody><tr><td>1</td><td>Fast homepage, slow logged-in, filtered, search or page 2+</td><td>Frequent cache misses expose a slow page build</td><td>Faster page build, fewer cache variants</td><td>Magento developer</td></tr><tr><td>2</td><td>The same anonymous page is slow every time</td><td>A <code>cacheable="false"</code> block or no Varnish</td><td>Varnish in front, remove <code>cacheable="false"</code> blocks</td><td>Magento developer</td></tr><tr><td>3</td><td>Slow for everyone after a deploy or flush</td><td>Cold or undersized cache</td><td>Flush by tag, deploy off-peak, size the cache</td><td>DevOps or host</td></tr><tr><td>4</td><td>Prices, stock or new products update late</td><td>Cron stopped, indexers behind</td><td>Restart cron, Update by Schedule</td><td>DevOps and developer</td></tr><tr><td>5</td><td>Slow at odd hours with no sales spike</td><td>Bots and crawlers using server capacity</td><td>Rate-limit or block at the CDN and in robots.txt</td><td>Host or DevOps</td></tr><tr><td>6</td><td>Slow since a new module, integration or upgrade</td><td>Extra work on every request</td><td>Profile on staging, remove or replace</td><td>Magento developer</td></tr><tr><td>7</td><td>Every page slow, cached ones too, even at night</td><td>Developer mode or old PHP in production</td><td>Production mode, supported PHP, OPcache</td><td>Magento developer</td></tr><tr><td>8</td><td>Fine at low traffic, slow at peaks</td><td>Undersized or shared server</td><td>Dedicated resources, separate tiers, autoscaling</td><td>Host</td></tr><tr><td>9</td><td>Category and search slow, database CPU high</td><td>Bloated tables and slow queries</td><td>Prune tables, tune MySQL, OpenSearch</td><td>Developer or DBA</td></tr><tr><td>10</td><td>A cache flush logs customers out, add to cart slows at busy times</td><td>Cache and sessions in one instance</td><td>Separate Valkey instances</td><td>DevOps or host</td></tr><tr><td>11</td><td>Good TTFB, but the page appears late or lags</td><td>Heavy theme, images and third-party scripts</td><td>Hyvä, or trim JS, images and tags</td><td>Frontend developer</td></tr><tr><td>12</td><td>Storefront fine, admin slow</td><td>Reindex on save, large grids, bulk jobs</td><td>Update by Schedule, smaller grids, off-hours jobs</td><td>Developer and store admin</td></tr></tbody></table><figcaption class="wp-element-caption">Twelve causes of Magento performance issues: symptom, cause, fix and owner</figcaption></figure>



<p class="wp-block-paragraph">Two checks come before you pick a row. First, time the server response on a page that is almost always cached, such as the homepage while logged out, and on one that misses more often, such as a filtered category while logged in or a search term nobody has used. The gap between the two tells you whether the server or the browser is losing the time. Our guide on how to <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">audit Magento performance</a> turns that check into a routine for every page type. Second, list what changed in the last few weeks: deploys, modules, upgrades, traffic. Use field data where you have it, and our guide on how to <a href="https://scandiweb.com/blog/how-to-and-how-not-to-use-google-pagespeed-insights/" target="_blank" rel="noopener">read PageSpeed Insights</a> explains why one lab score can mislead.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-symptom-decision-tree.png" alt="Decision tree for diagnosing Magento performance issues by symptom: some pages, sudden, every page, browser side, or admin" class="wp-image-26517" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-symptom-decision-tree.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-symptom-decision-tree-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-symptom-decision-tree-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-symptom-decision-tree-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-symptom-decision-tree-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-symptom-decision-tree-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-symptom-decision-tree-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Start from where and when the store is slow. Each branch leads to a short list of causes.</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Before anyone opens the code, write down four answers: which pages are slow, whether logged in or out, since when, and at what traffic. Those answers narrow the 12 causes to two or three.</p></div>



<h2 class="wp-block-heading">Is your Magento 2 site slow on only some pages?</h2>



<p class="wp-block-paragraph">If the homepage loads quickly but logged-in, filtered, search, or deeper category pages are slow, those pages are missing the cache, and each miss exposes a slow page build. A cache hit comes back from memory. A miss makes Magento build the page in PHP, and that build is where the time goes.</p>



<p class="wp-block-paragraph">Two causes produce this pattern. The first is a page build that is too slow to survive without the cache. The second is a cache that fails to serve pages it should.</p>



<h3 class="wp-block-heading">1. Pages that miss the cache take too long to build</h3>



<p class="wp-block-paragraph">Logged-in, filtered and search pages are cacheable. Magento keeps one copy of a logged-in catalog page per customer group and context, and one copy of a search results page per search term. These pages simply miss far more often than the homepage, and every miss sends the request to PHP.</p>



<p class="wp-block-paragraph">Adobe&#8217;s <a href="https://developer.adobe.com/commerce/php/development/cache/page/public-content" target="_blank" rel="noopener">public content documentation</a> lists what goes into the cache key: customer group, selected language, selected store, selected currency, and whether the customer is logged in. Each combination is a separate copy of the page. Filter combinations from <a href="https://scandiweb.com/blog/layered-navigation-causing-problems-deal-with-it/" target="_blank" rel="noopener">layered navigation</a> multiply the copies again, a new search term has no copy yet, and page 2 and onward of a category are visited far less than page 1. Right after a deploy or a flush, everything misses.</p>



<p class="wp-block-paragraph">In our support work, slow pagination and a slow catalog for logged-in customers are the two most common forms of this. Each miss makes Magento run the layout, render every block through its template, and query a database that spreads one product across many tables.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-cache-hit-vs-miss.png" alt="Cached Magento request served from memory next to a cache miss that PHP builds from layout, blocks and database" class="wp-image-26518" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-cache-hit-vs-miss.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-cache-hit-vs-miss-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-cache-hit-vs-miss-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-cache-hit-vs-miss-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-cache-hit-vs-miss-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-cache-hit-vs-miss-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-cache-hit-vs-miss-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">A cache hit skips PHP. Customer-group variants, filter combinations, new search terms and the first visit after a flush miss more often.</figcaption></figure></div>



<p class="wp-block-paragraph">There are two fixes. Cut the number of variants, for example by merging customer groups that share the same prices and keeping filter combinations out of crawl paths. Or make the build itself faster.</p>



<p class="wp-block-paragraph"><a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> is scandiweb&#8217;s open-source module that does this for Magento 2: it speeds up how Magento builds each page on the server, at least 2x, under Luma, Hyvä or a custom theme. It applies Liquid, the open-source template language created at Shopify, and runs on Magento Open Source, Adobe Commerce and Commerce Cloud, on any hosting, with ReadyMage shipping it built in. In a benchmark on one merchant&#8217;s Hyvä store, measured as server response time, category pages built with all caches empty took a median of 57 ms with Expedio instead of 181 ms, and a full category page ran 30 database queries instead of 655. The full method and numbers are in the <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">Expedio benchmark</a>.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png" alt="The Expedio page on scandiweb.com with the headline Magento. 2x faster. and buttons to get Expedio or try the demo" class="wp-image-25972" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Expedio makes Magento at least 2x faster without changing your theme or data</figcaption></figure></div>



<p class="wp-block-paragraph">Who fixes it: a Magento developer.</p>



<h3 class="wp-block-heading">2. The full page cache isn&#8217;t serving pages it should</h3>



<p class="wp-block-paragraph">Load the same category URL twice while logged out. If the second load is as slow as the first, that page isn&#8217;t coming from the cache at all. The most common cause we find is a block marked <code>cacheable="false"</code> in a custom or third-party layout file. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-knowledge-base/kb/troubleshooting/miscellaneous/slow-performance-due-to-non-cacheable-pages" target="_blank" rel="noopener">knowledge base article</a> on non-cacheable pages spells out the effect: one uncacheable block makes the entire page uncacheable, so every visitor waits for the build every time. Compare, cart and checkout are uncacheable on purpose. A catalog page should never be, and this is worth checking on any slow store.</p>



<p class="wp-block-paragraph">The other cause is the built-in file or database cache in place of Varnish, which Adobe describes as much slower. Only /customer and /checkout pages and POST requests are meant to bypass the Magento full page cache.</p>



<p class="wp-block-paragraph">Fix: run Varnish (Fastly on Commerce Cloud), search the layout XML for <code>cacheable="false"</code> outside cart, checkout and compare, and move that block to private content. Our guide to the <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">Magento full page cache</a> shows how to check which pages miss it. Who fixes it: a Magento developer.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Adobe&#8217;s page cache keys each URL by customer group, store, currency, language, and whether the shopper is logged in. A B2B store with many customer groups keeps many copies of every page, so more requests miss the cache and wait for the page build.</p></div>



<h2 class="wp-block-heading">Why did my Magento site suddenly get slow?</h2>



<p class="wp-block-paragraph">A Magento site that was fine last month and is slow now has usually changed somewhere. The common triggers are an empty cache after a deploy or flush, a stopped cron job, a wave of bots, and a new extension, integration, or upgrade. List what changed in the last few weeks before anyone touches the server.</p>



<p class="wp-block-paragraph">When a Magento site is very slow all of a sudden, the cause is usually one of the four below. Each leaves a trace somewhere: a deploy log, a cron log, a server log, or a module that wasn&#8217;t installed last month.</p>



<h3 class="wp-block-heading">3. A deploy or cache flush left the cache empty</h3>



<p class="wp-block-paragraph">Magento has two flush buttons, and they do different things. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-admin/systems/tools/cache-management" target="_blank" rel="noopener">cache management guide</a> explains that Flush Magento Cache removes items according to their tags, while Flush Cache Storage removes everything regardless of tag. After a full flush or a deploy, every page has to be rebuilt by PHP until the cache fills again, and shoppers feel that for as long as it takes.</p>



<p class="wp-block-paragraph">A cache instance with too little memory causes the same thing all day. Valkey evicts keys once memory use passes the <code>maxmemory</code> limit, so a store whose pages don&#8217;t fit never gets fully warm.</p>



<p class="wp-block-paragraph">Fix: prefer Flush Magento Cache, deploy outside peak hours, give the cache enough memory, and <a href="https://scandiweb.com/blog/magento-cache-warmer/" target="_blank" rel="noopener">warm the top pages</a> after each deploy. Sometimes <a href="https://scandiweb.com/blog/sometimes-flushing-the-whole-cache-storage-is-the-only-option/" target="_blank" rel="noopener">flushing the whole cache storage</a> is the only option, and then the timing is what you control. Who fixes it: DevOps or the hosting team.</p>



<h3 class="wp-block-heading">4. Cron stopped, so indexes fell behind</h3>



<p class="wp-block-paragraph">Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cli/configure-cron-jobs" target="_blank" rel="noopener">cron guide</a> lists what depends on cron: reindexing, all Commerce emails, currency rate updates, sitemaps, catalog price rules and newsletters. Adobe states that Commerce will not work as expected if cron is set up badly.</p>



<p class="wp-block-paragraph">With indexers on Update by Schedule, a stopped cron shows up first as stale prices, stale stock and missing new products. When cron comes back, the backlog of indexing and queued jobs hits the server at once. In our support work that is often the moment a store that was only out of date becomes slow as well.</p>



<p class="wp-block-paragraph">Check it with <code>bin/magento indexer:status</code> and <code>bin/magento indexer:show-mode</code>, and look at when cron last ran. Our guide to <a href="https://scandiweb.com/blog/magento-indexers-known-issues-and-fixes/" target="_blank" rel="noopener">Magento indexer issues and their fixes</a> covers the failure modes. Fix: restart cron, keep the indexers on Update by Schedule, and repair the job that failed instead of reindexing by hand. Who fixes it: DevOps and a developer.</p>



<h3 class="wp-block-heading">5. Bots and crawlers are using up server capacity</h3>



<p class="wp-block-paragraph">Imperva&#8217;s <a href="https://www.imperva.com/blog/2025-imperva-bad-bot-report-how-ai-is-supercharging-the-bot-threat/" target="_blank" rel="noopener">2025 Bad Bot Report</a> found that automated traffic made up 51% of all web traffic in 2024 and malicious bots 37%. That is one security vendor&#8217;s data, and it doesn&#8217;t measure server load. What we see in support work is that crawlers go after deep and filtered URLs the cache rarely holds, so each request takes a PHP worker that a shopper could have used.</p>



<p class="wp-block-paragraph">The symptom is a store that is slow at odd hours with no matching spike in sales. Fix: read the server logs for the top user agents and regions, rate-limit or block the heavy ones at the CDN or WAF, and block regions you don&#8217;t sell to. The <code>Crawl-delay</code> line in robots.txt only helps with crawlers that follow it. <a href="https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt" target="_blank" rel="noopener">Google&#8217;s robots.txt documentation</a> says Google doesn&#8217;t support it, while <a href="https://support.claude.com/en/articles/8896518" target="_blank" rel="noopener">Anthropic&#8217;s ClaudeBot</a> does. Leave Googlebot and Bingbot alone, then retest TTFB once the bot load is off. Who fixes it: the hosting team or DevOps.</p>



<h3 class="wp-block-heading">6. A new extension or integration adds work to every request</h3>



<p class="wp-block-paragraph">Every extension adds something: observers, plugins, layout blocks, JavaScript. An integration that calls an ERP or a pricing service while the page builds makes every cache miss wait for that call as well. An upgrade can bring both at once, so a store that got slow after a migration or upgrade belongs in this row as much as in row 7.</p>



<p class="wp-block-paragraph">Fix: profile one slow page on staging with New Relic or Magento&#8217;s profiler, disable the suspects one at a time, and remove whatever nobody uses. If you are replacing modules rather than removing them, our list of the <a href="https://scandiweb.com/blog/best-magento-extensions/" target="_blank" rel="noopener">best Magento extensions</a> is a starting point. Who fixes it: a Magento developer.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Google ignores the Crawl-delay line in robots.txt, but some AI crawlers follow it, Anthropic&#8217;s ClaudeBot among them. Use it for those, and rate-limit everything else at the CDN.</p></div>



<h2 class="wp-block-heading">Why is my Magento site running slow on every page?</h2>



<p class="wp-block-paragraph">When every page is slow, cached pages included, and it stays slow at night with little traffic, the problem is in the layers under the store: developer mode or an old PHP version in production, a server that is too small or shared, a database that keeps growing, or cache and sessions crowded into one instance.</p>



<p class="wp-block-paragraph">Rule out the four causes below before anyone changes a line of code.</p>



<h3 class="wp-block-heading">7. Production runs in developer mode or on an old PHP version</h3>



<p class="wp-block-paragraph"><code>bin/magento deploy:mode:show</code> answers this in seconds. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/setup/application-modes" target="_blank" rel="noopener">application modes guide</a> says production mode serves static view files from the cache only, and that default mode is not optimized for production because of the performance cost of static files. A store left in default or developer mode pays that cost on every request.</p>



<p class="wp-block-paragraph">PHP matters too. Adobe lists PHP 8.5 for 2.4.9 and PHP 8.4 or 8.3 for 2.4.8. Run the version Adobe lists for your release and size OPcache for the whole codebase. Of all the Magento 2 performance issues in this list, this one is the cheapest to check. Who fixes it: a Magento developer.</p>



<h3 class="wp-block-heading">8. The server is undersized or shared</h3>



<p class="wp-block-paragraph">The symptom is a store that is fine at low traffic and slow at peaks, with CPU or memory at its limit. Shared hosting adds other sites&#8217; load to yours. Adobe&#8217;s guidance separates the tiers, with Varnish on its own server in front of the web tier.</p>



<p class="wp-block-paragraph">Fix: dedicated resources, separate tiers for a larger catalog, and autoscaling for peaks, which we describe in <a href="https://scandiweb.com/blog/server-autoscaling-in-magento-2/" target="_blank" rel="noopener">server autoscaling in Magento 2</a>. Our managed Magento hosting, <a href="https://scandiweb.com/services/aws-hosting-services-readymage" target="_blank" rel="noopener">ReadyMage</a>, runs on AWS with that tuning done and Expedio built in. More hardware helps only when hardware is the limit, which is why this row comes after the ones above it. Who fixes it: the hosting team.</p>



<h3 class="wp-block-heading">9. The database has grown and slow queries pile up</h3>



<p class="wp-block-paragraph">Magento&#8217;s <a href="https://scandiweb.com/blog/magento-series-the-eav-model/" target="_blank" rel="noopener">EAV model</a> spreads one product across many tables, so catalog pages are query-heavy by design. Log and quote tables grow without limit unless someone prunes them. The symptom is slow category and search pages with high database CPU.</p>



<p class="wp-block-paragraph">Fix: prune the log and quote tables, size the InnoDB buffer pool to the server&#8217;s memory, watch the slow query log, and match MySQL <code>max_connections</code> to the number of PHP threads, as Adobe recommends. Keep catalog search and layered navigation on OpenSearch or Elasticsearch, which <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/search/overview-search" target="_blank" rel="noopener">Adobe has required</a> since 2.4.4. Who fixes it: a developer or a DBA.</p>



<h3 class="wp-block-heading">10. Cache and sessions share one instance</h3>



<p class="wp-block-paragraph">The symptom is easy to recognize. A cache flush logs every customer out, and login, add to cart and checkout slow down together at busy times. Slow add to cart at peak hours is the complaint that usually brings this one to light.</p>



<p class="wp-block-paragraph">Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/implementation-playbook/best-practices/planning/redis-valkey-service-configuration" target="_blank" rel="noopener">Valkey and Redis best practices</a> say that separating the cache from the sessions reduces contention between cache and session traffic, and Adobe&#8217;s setup guide calls for a dedicated instance each for sessions, the Commerce cache and the full page cache. On 2.4.9, and on 2.4.8 patches after p4, use Valkey, since Redis cache isn&#8217;t supported there. Who fixes it: DevOps or the hosting team.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Run bin/magento deploy:mode:show on the production server. If it answers developer, switch to production before anyone spends money on hardware.</p></div>



<h2 class="wp-block-heading">Why does a Magento page feel slow when the server is fast?</h2>



<p class="wp-block-paragraph">If the server answers quickly but the page appears late or reacts slowly to taps, the time is going in the shopper&#8217;s browser. On Magento that usually means the Luma theme&#8217;s JavaScript, large images, and third-party tags. A lighter theme such as Hyvä fixes this half of the load, and server-side work leaves it as it is.</p>



<p class="wp-block-paragraph">This kind of Magento slow performance is measured in the browser, and the fix is in the theme.</p>



<h3 class="wp-block-heading">11. The theme makes the browser do too much</h3>



<p class="wp-block-paragraph">Google&#8217;s <a href="https://web.dev/articles/vitals" target="_blank" rel="noopener">Web Vitals</a> thresholds are the measure here: LCP within 2.5 seconds, INP of 200 ms or less, and CLS of 0.1 or less, at the 75th percentile of visits. On Luma, the main costs are dozens of RequireJS modules, large images, and third-party tags.</p>



<p class="wp-block-paragraph">Hyvä rebuilds the frontend with far less JavaScript, and our guide on <a href="https://scandiweb.com/blog/how-to-work-with-hyva/" target="_blank" rel="noopener">how to work with Hyvä</a> covers what the move involves. If a rebuild isn&#8217;t on the table, trim Luma instead: bundle JS by page type and never merge it, serve WebP with width and height set, lazy-load images below the fold only, and audit every third-party tag.</p>



<p class="wp-block-paragraph">One check before you start. If the store already moved to Hyvä and is still slow, the remaining time is on the server, which points back to cause 1. Who fixes it: a frontend developer.</p>



<h2 class="wp-block-heading">Why is the Magento admin slow?</h2>



<p class="wp-block-paragraph">A slow Magento admin usually comes from work the admin starts or waits on: indexers that rebuild on every save, product grids that load a large catalog, bulk imports and mass updates during office hours, and extensions that load on every admin page. Storefront fixes, Expedio included, don&#8217;t change the admin.</p>



<h3 class="wp-block-heading">12. Indexing, grids and bulk jobs slow down the admin</h3>



<p class="wp-block-paragraph">Magento 2 admin loading slow usually traces back to work the admin itself starts. With indexers on Update on Save, every change in the admin triggers a reindex, so saving a product can stall while the indexer runs. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/performance-best-practices/configuration" target="_blank" rel="noopener">configuration best practices</a> recommend Update on Schedule instead.</p>



<p class="wp-block-paragraph">Large catalogs make the product grid heavy, and Adobe recommends limiting the number of products in the grid. Two more settings on that page move work to the background: asynchronous email notifications and asynchronous order grid indexing. Bulk imports, mass updates and content jobs belong outside office hours, which is what the merchant in our intro found out the slow way. Extensions that load on every admin page add up as well.</p>



<p class="wp-block-paragraph">The admin panel and the storefront are different workloads, so a fast storefront tells you nothing about a slow backend. Expedio doesn&#8217;t change the admin, and neither do Hyvä or the page cache. Who fixes it: a developer, plus the store admin who schedules the bulk jobs.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-what-each-fix-changes.png" alt="Three lanes of a Magento store, server build, browser render and admin, with the fixes that change each one" class="wp-image-26519" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-what-each-fix-changes.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-what-each-fix-changes-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-what-each-fix-changes-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-what-each-fix-changes-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-what-each-fix-changes-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-what-each-fix-changes-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/why-is-magento-slow-what-each-fix-changes-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Each fix changes one lane. Expedio speeds up the server build, Hyvä the browser render, and neither changes the admin.</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>If the admin is slow and the storefront isn&#8217;t, storefront fixes won&#8217;t help. Check which indexers run on save and which bulk jobs ran that day before you change the server.</p></div>



<h2 class="wp-block-heading">Frequently asked questions about Magento performance issues</h2>



<h3 class="wp-block-heading">Why is Magento so slow?</h3>



<p class="wp-block-paragraph">Magento does a lot of work to build each page. It runs the layout, renders every block through its template, and queries a database that spreads each product across many tables. A full page cache hides that work whenever it already holds the page. When it misses, or an extension adds to the build, shoppers wait. On well-tuned hosting stock Magento answers quickly, so most slowness comes from setup, extensions, and hosting.</p>



<h3 class="wp-block-heading">Why is my Magento store still slow after moving to Hyvä?</h3>



<p class="wp-block-paragraph">Hyvä speeds up the browser side of a page load and leaves server response time where it was. In HTTP Archive&#8217;s September 2026 data, 66% of Hyvä sites passed all three Core Web Vitals on mobile, against 45% of all Magento sites, yet both had the same 23% share of good time to first byte. If the store is still slow after Hyvä, measure server response on pages that miss the cache.</p>



<h3 class="wp-block-heading">Can bots and AI crawlers slow down a Magento store?</h3>



<p class="wp-block-paragraph">Yes. Crawlers often request pages the cache doesn&#8217;t hold, so each request makes Magento build a page in PHP and ties up a worker that a shopper could have used. Imperva&#8217;s 2025 Bad Bot Report found that automated traffic made up 51% of all web traffic in 2024. Check server logs for the busiest user agents, rate-limit or block heavy crawlers at the CDN, and use robots.txt for the ones that follow it.</p>



<h3 class="wp-block-heading">How can I tell if the server is making my Magento site slow?</h3>



<p class="wp-block-paragraph">Measure time to first byte (TTFB), the wait before the first byte of the page arrives. <a href="https://web.dev/articles/ttfb" target="_blank" rel="noopener">Google&#8217;s guidance</a> calls 0.8 seconds or less good and more than 1.8 seconds poor. Test pages that miss the cache more often, such as a filtered category page while logged in, or a new search term. If TTFB is high there and low on the cached homepage, the server&#8217;s page build is the bottleneck. Our guide to <a href="https://scandiweb.com/blog/reduce-initial-server-response-time/" target="_blank" rel="noopener">reducing server response time</a> covers each fix.</p>



<h3 class="wp-block-heading">Will a bigger server fix a slow Magento site?</h3>



<p class="wp-block-paragraph">Only when the server is the constraint, for example when the store slows down at peaks while CPU or memory runs at its limit. More hardware lets more pages build at the same time. It doesn&#8217;t make each page build faster, so a cache miss that is slow at night stays slow. Making the build faster helps with both. Expedio, for example, lets the same server handle 3x the traffic before response times start to rise.</p>



<h3 class="wp-block-heading">What should I check first when my Magento site is slow?</h3>



<p class="wp-block-paragraph">Start with the checks that take minutes. Run <code>bin/magento deploy:mode:show</code> to confirm the store is in production mode, run <code>bin/magento indexer:status</code> and check that cron is running, and compare TTFB on a cached page with a filtered or logged-in page. Then list the deploys, new modules and upgrades from the last few weeks, and check the server logs for crawler traffic.</p>



<h2 class="wp-block-heading">Fixing Magento performance issues starts with the symptom</h2>



<p class="wp-block-paragraph">Magento performance issues are quicker to fix once you know which kind you have. Start from the symptom, check what changed, and separate server time from browser time before anyone buys hardware or rebuilds a theme.</p>



<p class="wp-block-paragraph">Slow on some pages only points to causes 1 and 2. A sudden change points to causes 3 to 6. Slow everywhere, all day, points to causes 7 to 10. A fast server with a page that appears late is cause 11, and a slow admin with a fine storefront is cause 12. Most stores match one or two rows, and a fix aimed at the wrong row costs money without moving the numbers.</p>



<p class="wp-block-paragraph">Once you know the cause, our guide on how to <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">speed up Magento</a> lists all 15 fixes in the order we apply them, from the server to the browser.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Why is Magento so slow?", "acceptedAnswer": {"@type": "Answer", "text": "Magento does a lot of work to build each page. It runs the layout, renders every block through its template, and queries a database that spreads each product across many tables. A full page cache hides that work whenever it already holds the page. When it misses, or an extension adds to the build, shoppers wait. On well-tuned hosting stock Magento answers quickly, so most slowness comes from setup, extensions, and hosting."}}, {"@type": "Question", "name": "Why is my Magento store still slow after moving to Hyvä?", "acceptedAnswer": {"@type": "Answer", "text": "Hyvä speeds up the browser side of a page load and leaves server response time where it was. In HTTP Archive's September 2026 data, 66% of Hyvä sites passed all three Core Web Vitals on mobile, against 45% of all Magento sites, yet both had the same 23% share of good time to first byte. If the store is still slow after Hyvä, measure server response on pages that miss the cache."}}, {"@type": "Question", "name": "Can bots and AI crawlers slow down a Magento store?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Crawlers often request pages the cache doesn't hold, so each request makes Magento build a page in PHP and ties up a worker that a shopper could have used. Imperva's 2025 Bad Bot Report found that automated traffic made up 51% of all web traffic in 2024. Check server logs for the busiest user agents, rate-limit or block heavy crawlers at the CDN, and use robots.txt for the ones that follow it."}}, {"@type": "Question", "name": "How can I tell if the server is making my Magento site slow?", "acceptedAnswer": {"@type": "Answer", "text": "Measure time to first byte (TTFB), the wait before the first byte of the page arrives. Google's guidance calls 0.8 seconds or less good and more than 1.8 seconds poor. Test pages that miss the cache more often, such as a filtered category page while logged in, or a new search term. If TTFB is high there and low on the cached homepage, the server's page build is the bottleneck."}}, {"@type": "Question", "name": "Will a bigger server fix a slow Magento site?", "acceptedAnswer": {"@type": "Answer", "text": "Only when the server is the constraint, for example when the store slows down at peaks while CPU or memory runs at its limit. More hardware lets more pages build at the same time. It doesn't make each page build faster, so a cache miss that is slow at night stays slow. Making the build faster helps with both. Expedio, for example, lets the same server handle 3x the traffic before response times start to rise."}}, {"@type": "Question", "name": "What should I check first when my Magento site is slow?", "acceptedAnswer": {"@type": "Answer", "text": "Start with the checks that take minutes. Run bin/magento deploy:mode:show to confirm the store is in production mode, run bin/magento indexer:status and check that cron is running, and compare TTFB on a cached page with a filtered or logged-in page. Then list the deploys, new modules and upgrades from the last few weeks, and check the server logs for crawler traffic."}}]}</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em>If your store matches more than one row, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>tell us what you&#x27;re seeing</em></a><em> and we&#x27;ll help you work out which cause to fix first.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/why-is-magento-slow/">Why Is My Magento Site So Slow? 12 Causes and How to Fix Each</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Magento Full Page Cache: How It Works, What It Can&#8217;t Cache, and How to Fix Misses</title>
		<link>https://scandiweb.com/blog/magento-full-page-cache/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Thu, 29 Oct 2026 14:17:00 +0000</pubDate>
				<category><![CDATA[Collection]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[adobe commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[magento 2]]></category>
		<category><![CDATA[magento optimization]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[site performance]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26506</guid>

					<description><![CDATA[<p>See how the Magento full page cache works, Varnish vs built-in, the key settings, and which requests still reach PHP: filters, search, logins and deploys.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-full-page-cache/">Magento Full Page Cache: How It Works, What It Can&#8217;t Cache, and How to Fix Misses</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-magen wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/solutions/magento/expedio" target=_blank >
        2x Faster Magento with Expedio
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-performance-optimization" target=_blank >
        Magento Performance
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/aws-hosting-services-readymage" target=_blank >
        Magento Hosting (ReadyMage)
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">Magento (Adobe Commerce) builds every page from scratch: it runs PHP code, queries the database and assembles the HTML, and all of that takes time. The Magento full page cache saves a finished copy of each page and hands that copy to the next shopper, so Magento can skip the build.</p>



<p class="wp-block-paragraph">Most stores keep that cache in Varnish, a caching server placed in front of Magento. Varnish answers repeat requests itself, so they never reach Magento at all, and Adobe strongly recommends it for live stores.</p>



<p class="wp-block-paragraph">A saved copy only helps when one exists for that exact page and that kind of visitor, and on a busy store more requests miss it than most teams expect. Slow catalog pages for logged-in customers and slow category pagination both came up in Magento support requests we handled over the past year, and both trace back to how the cache works.</p>



<h2 class="wp-block-heading">What is the Magento full page cache?</h2>



<p class="wp-block-paragraph">The Magento full page cache stores the finished HTML of a page so the next visitor with the same context gets it without Magento building the page again. It holds category, product and CMS pages, keyed by URL and context, for guests and logged-in shoppers alike. Cart, checkout and account pages are always built fresh.</p>



<p class="wp-block-paragraph">The rest of Magento caching stores smaller pieces, such as merged configuration. The admin grid lists this one as Page Cache.</p>



<h3 class="wp-block-heading">How Magento cache works on a single request</h3>



<p class="wp-block-paragraph">A shopper requests a category URL. Varnish, or the built-in cache, builds a key from that URL and a hash of the HTTP context: customer group, store, language, currency and whether the shopper is logged in. Magento carries that context in the <code>X-Magento-Vary</code> cookie, and Adobe&#8217;s page on <a href="https://developer.adobe.com/commerce/php/development/cache/page/public-content" target="_blank" rel="noopener">HTTP context variables</a> lists the full set.</p>



<p class="wp-block-paragraph">If a saved page matches the key, the cache returns its HTML and Magento does not run. If nothing matches, the request goes to Magento, which builds the page in PHP: it loads the layout, renders each block and runs the database queries behind them. The finished HTML is saved with its cache tags and a TTL, then returned. The next visitor with the same URL and context gets the saved copy.</p>



<p class="wp-block-paragraph">Only <code>GET</code> and <code>HEAD</code> requests can be cached. A form post goes to PHP every time.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-request-flow.png" alt="Magento full page cache request flow: Varnish answers a hit, a miss goes to Magento to build the page in PHP" class="wp-image-26502" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-request-flow.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-request-flow-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-request-flow-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-request-flow-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-request-flow-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-request-flow-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-request-flow-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">A hit is answered by Varnish. A miss goes to Magento, which builds the page in PHP and saves a copy for the next visitor with the same context.</figcaption></figure></div>



<h3 class="wp-block-heading">Public and private content: hole punching in Magento 2</h3>



<p class="wp-block-paragraph">Everyone in the same context gets the same cached HTML, so Magento keeps personal data out of it. Public content, the page itself, is stored server side in the cache. Private content such as the customer name, cart, wishlist and address is stored client side and loads in the browser after the page arrives, from customer-data sections. A POST or PUT request invalidates those sections, so the cart updates after an add to cart without touching the cached page.</p>



<p class="wp-block-paragraph">With Varnish, a block can also carry its own TTL. The top menu in the default theme is marked <code>ttl="3600"</code>, so Varnish can cache it apart from the page through ESI and refresh it on its own schedule.</p>



<p class="wp-block-paragraph">Adobe warns against adding a context variable per user. Every context variable is part of the cache key, so a per-user variable gives each user a separate copy of every page, and the cache stops sharing anything.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>Two shoppers on the same category URL share one cached copy only when their customer group, store, currency and login state match. Every other combination is built and saved separately.</p></div>



<h2 class="wp-block-heading">Magento full page cache vs Varnish</h2>



<p class="wp-block-paragraph">Magento&#8217;s built-in full page cache is a PHP reverse proxy that stores pages in the file system, the database or Valkey/Redis, so every hit still runs PHP. Varnish is a separate caching server in front of the web server, and a hit never reaches the web server. Adobe strongly recommends Varnish in production. Commerce Cloud uses Fastly.</p>



<p class="wp-block-paragraph">The table shows where the two options differ.</p>



<figure class="wp-block-table"><table><thead><tr><th></th><th>Built-in full page cache</th><th>Varnish</th></tr></thead><tbody><tr><td>Where it runs</td><td>Inside Magento, as a PHP reverse proxy</td><td>Separate server in front of the web server</td></tr><tr><td>A cache hit</td><td>Still runs PHP</td><td>Never reaches the web server</td></tr><tr><td>Storage</td><td>File system, database or Valkey/Redis</td><td>Varnish&#8217;s own cache storage</td></tr><tr><td>Purging</td><td>Magento cleans entries by cache tag</td><td>Magento sends purges, VCL bans by tag</td></tr><tr><td>Setup</td><td>Works out of the box</td><td>Install Varnish, export the VCL, set purge hosts</td></tr><tr><td>Adobe&#8217;s guidance</td><td>Development and testing</td><td>Strongly recommended in production</td></tr></tbody></table><figcaption class="wp-element-caption">Magento built-in full page cache vs Varnish</figcaption></figure>



<p class="wp-block-paragraph">The built-in option is fine on a laptop or a staging server. Production gets Varnish: a repeat request for a cacheable page costs no PHP, database or web server time, and Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/config-varnish" target="_blank" rel="noopener">Varnish configuration page</a> calls the built-in cache much slower.</p>



<p class="wp-block-paragraph">Magento Varnish is a separate HTTP cache that Magento purges by tag whenever it cleans, flushes or refreshes its own cache. The Caching Application setting is the only switch between the two.</p>



<h3 class="wp-block-heading">Where Fastly fits on Adobe Commerce Cloud</h3>



<p class="wp-block-paragraph">On Adobe Commerce Cloud, full page caching uses Fastly instead of Varnish, so there is no Varnish to install or configure. The cache key and the private-content rules in this article still apply, because Magento sets the headers and the context cookie in the same way.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>Open Stores &gt; Settings &gt; Configuration &gt; Advanced &gt; System &gt; Full Page Cache on production. If Caching Application says Built-in, every cache hit still runs PHP.</p></div>



<h2 class="wp-block-heading">Magento cache management: cache types, clean and flush</h2>



<p class="wp-block-paragraph">Magento cache management happens in System &gt; Tools &gt; Cache Management or with <code>bin/magento cache</code> commands. The admin lists every cache type, such as Configuration, Layouts, Blocks HTML output and Page Cache, with its status. Refresh any type marked invalidated, clean caches after code or configuration changes, and flush the whole storage only when cleaning fails.</p>



<h3 class="wp-block-heading">The cache types that matter for page speed</h3>



<p class="wp-block-paragraph">Five types decide most of what a shopper waits for in Magento 2 cache management.</p>



<figure class="wp-block-table"><table><thead><tr><th>Admin name</th><th>CLI code</th><th>What it holds</th><th>Clean it after</th></tr></thead><tbody><tr><td>Configuration</td><td><code>config</code></td><td>Merged configuration</td><td>Configuration changes</td></tr><tr><td>Layouts</td><td><code>layout</code></td><td>Compiled layouts</td><td>Layout XML changes</td></tr><tr><td>Blocks HTML output</td><td><code>block_html</code></td><td>HTML fragments per block</td><td>Template changes</td></tr><tr><td>Page Cache</td><td><code>full_page</code></td><td>Whole pages</td><td>Code changes that affect HTML output</td></tr><tr><td>Translations</td><td><code>translate</code></td><td>Translation files</td><td>Translation changes</td></tr></tbody></table><figcaption class="wp-element-caption">The Magento cache types that matter for page speed</figcaption></figure>



<p class="wp-block-paragraph">The Cache Management grid lists more types than these, and the exact set depends on the edition and the modules installed. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-admin/systems/tools/cache-management" target="_blank" rel="noopener">Cache Management page</a> describes each one.</p>



<h3 class="wp-block-heading">Clean vs flush: which one to run</h3>



<p class="wp-block-paragraph">The two buttons at the top of the grid do different things. Flush Magento Cache runs <code>cache:clean</code>: it removes items by their Commerce tag, from enabled types only, and leaves anything else in the storage alone. Flush Cache Storage runs <code>cache:flush</code>: it empties the whole storage, including files that other applications keep in the same place.</p>



<p class="wp-block-paragraph">Clean after routine changes, such as a template or configuration edit. Flush only when cleaning does not fix the problem, and schedule it off-peak, because Adobe warns that clearing caches at peak can raise the load enough to take the site down until the operation completes. If you need to clear the cache in Magento 2 from the admin, refresh the affected type rather than everything, and read our post on when to <a href="https://scandiweb.com/blog/sometimes-flushing-the-whole-cache-storage-is-the-only-option/" target="_blank" rel="noopener">flush the whole cache storage</a> before doing it on a live store.</p>



<h3 class="wp-block-heading">What &#8220;One or more of the Cache Types are invalidated&#8221; means</h3>



<p class="wp-block-paragraph">The red banner in the admin reads &#8220;One or more of the Cache Types are invalidated&#8221;, followed by the list of types, and asks you to go to Cache Management and refresh them. It means the stored data for those types may no longer match the database. Catalog changes are the usual cause, because an edit to one entity can affect other pages and invalidate several caches at once. Configuration saves and deploys do the same.</p>



<p class="wp-block-paragraph">To fix it, open Cache Management, tick the invalidated types, set Actions to Refresh and click Submit, or run <code>bin/magento cache:clean full_page</code>. Reindexing does not require a cache flush, so leave the cache alone when you reindex. If the banner comes back every few minutes, find what keeps invalidating it, such as an import, a cron job or frequent product saves, instead of refreshing all day. Keeping the <a href="https://scandiweb.com/blog/magento-indexers-known-issues-and-fixes/" target="_blank" rel="noopener">Magento indexers</a> on Update on Schedule, which Adobe recommends for performance, removes one common cause.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>Flush Magento Cache runs <code>cache:clean</code>. Flush Cache Storage runs <code>cache:flush</code> and empties the whole storage, including anything other applications keep there.</p></div>



<h2 class="wp-block-heading">How to enable, disable and configure full page cache in Magento 2</h2>



<p class="wp-block-paragraph">To enable full page cache in Magento 2:</p>



<ol class="wp-block-list">
<li>Go to System &gt; Tools &gt; Cache Management, select Page Cache, set Actions to Enable and click Submit.</li>


<li>Or run <code>bin/magento cache:enable full_page</code>.</li>


<li>Under Stores &gt; Settings &gt; Configuration &gt; Advanced &gt; System &gt; Full Page Cache, set Caching Application to Varnish Caching.</li>


<li>Save the configuration.</li>

</ol>



<h3 class="wp-block-heading">Enable full page cache in the admin</h3>



<p class="wp-block-paragraph">Go to System &gt; Tools &gt; Cache Management, tick Page Cache, set Actions to Enable and click Submit. Then open Stores &gt; Settings &gt; Configuration &gt; Advanced &gt; System &gt; Full Page Cache and set Caching Application to Built-in or Varnish Caching.</p>



<p class="wp-block-paragraph">If Enable and Disable are missing from the Actions dropdown, the store is in production mode. Since Magento 2.2, production mode allows enabling and disabling cache types from the command line only, so the admin offers Refresh and nothing else.</p>



<h3 class="wp-block-heading">Enable or disable full page cache from the command line</h3>



<p class="wp-block-paragraph">Run the commands as the file system owner, from the Magento root:</p>



<pre class="wp-block-code"><code>bin/magento cache:status
bin/magento cache:enable full_page
bin/magento cache:disable full_page</code></pre>



<p class="wp-block-paragraph"><code>cache:status</code> lists every type with 1 for enabled and 0 for disabled. Enabling a type clears it, so expect the first requests after <code>cache:enable</code> to miss. Omitting the type applies the command to all types.</p>



<p class="wp-block-paragraph">Disable full page cache in Magento 2 only to turn off the cache during development, when every change has to show at once. Never do it on a live store: every request then goes to PHP, and the server carries the full build cost for every page. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cli/manage-cache" target="_blank" rel="noopener">Manage the cache</a> page lists the remaining options.</p>



<h3 class="wp-block-heading">Magento full page cache settings worth checking</h3>



<p class="wp-block-paragraph">All of these live under Stores &gt; Settings &gt; Configuration &gt; Advanced &gt; System &gt; Full Page Cache.</p>



<p class="wp-block-paragraph">Caching Application: Varnish Caching for production. From the CLI, run <code>bin/magento config:set --scope=default --scope-code=0 system/full_page_cache/caching_application 2</code>.</p>



<p class="wp-block-paragraph">TTL for public content: 86400 seconds by default, the longest a page stays in the cache without a purge.</p>



<p class="wp-block-paragraph">Varnish Configuration: access list and backend host (both default to localhost), backend port (8080), grace period (300 seconds, how long Varnish may serve an expired copy while Magento builds a fresh one) and handles param size (100, the most layout handles the ESI endpoint processes). Export the VCL from the same screen and install it on the Varnish host. Then set purge hosts with <code>bin/magento setup:config:set --http-cache-hosts</code> so Magento can purge Varnish when its own cache cleans. Varnish 8 is the version for Magento 2.4.9.</p>



<p class="wp-block-paragraph">If you stay on the built-in cache, give it its own storage. Adobe recommends a dedicated instance each for sessions, the default cache and the full page cache. To use Redis for the full page cache on 2.4.8 and earlier, run <code>bin/magento setup:config:set --page-cache=redis --page-cache-redis-server=127.0.0.1 --page-cache-redis-db=1</code>, with a database number no other cache uses. On 2.4.9, Valkey replaced Redis in the CLI tooling, so use the Valkey options in Adobe&#8217;s CLI reference.</p>



<h2 class="wp-block-heading">What the Magento full page cache can&#8217;t serve</h2>



<p class="wp-block-paragraph">The Magento full page cache never serves cart, checkout or customer account pages, POST requests, or any page with a block marked <code>cacheable="false"</code>. It can hold filtered category pages, search results and customer-group versions, but each URL and context needs its own entry, so many of them miss. Every miss goes to PHP.</p>



<h3 class="wp-block-heading">Requests that always skip the cache</h3>



<p class="wp-block-paragraph">Three groups never touch the cache. Cart, checkout and customer account pages: the <a href="https://raw.githubusercontent.com/magento/magento2/2.4-develop/app/code/Magento/PageCache/etc/varnish6.vcl" target="_blank" rel="noopener">default Varnish configuration</a> that comes with Magento passes any URL containing <code>/customer</code> or <code>/checkout</code> straight to the backend, and Adobe&#8217;s own examples of uncacheable pages are cart, checkout and compare. POST and every other method besides GET and HEAD: the same VCL only caches those two, so an add to cart or a form submit always runs PHP. Any page with one block marked <code>cacheable="false"</code>: Adobe&#8217;s rule is that one uncacheable block makes the whole page uncacheable, and that attribute often arrives in a third-party module&#8217;s layout file rather than your own code.</p>



<p class="wp-block-paragraph">The first two groups are by design. The third is the one to check, because it can quietly turn a category or CMS page into one that builds in PHP on every request.</p>



<h3 class="wp-block-heading">Requests the cache can hold but often misses</h3>



<p class="wp-block-paragraph">Four kinds of request are cacheable and still miss often.</p>



<p class="wp-block-paragraph">The first request after a deploy, flush or TTL expiry. Cleaning, flushing and refreshing the Magento cache all purge Varnish too, and so does editing a category, price, product or promotional pricing rule. After each one, the first shopper on each page waits for the build and the second gets the copy.</p>



<p class="wp-block-paragraph">Filtered category pages. Each filter combination is its own URL, so it gets its own cache entry, and combinations multiply with every attribute you expose in <a href="https://scandiweb.com/blog/layered-navigation-causing-problems-deal-with-it/" target="_blank" rel="noopener">layered navigation</a>. The default VCL strips gclid, gbraid, gclsrc and utm_ parameters, so an ad click shares the cache with a direct visit. Filter parameters stay in the key because they change the page.</p>



<p class="wp-block-paragraph">Search results. In Magento 2.4 the default VCL has no bypass for search URLs and the search results layout has no uncacheable block, so results pages are cacheable, one entry per search term. Popular terms hit. Rare terms miss, and a first-time search always does.</p>



<p class="wp-block-paragraph">Logged-in customers and B2B customer groups. The context hash gives each customer group, store and currency its own copy of every page. A B2B store that puts companies or price lists in separate customer groups fills many small caches rather than one big one, and a buyer in a quiet group gets a miss on pages that guests see from the cache all day.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-what-reaches-php.png" alt="Which Magento requests always skip the full page cache, which often miss it, and which are usually cache hits" class="wp-image-26503" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-what-reaches-php.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-what-reaches-php-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-what-reaches-php-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-what-reaches-php-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-what-reaches-php-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-what-reaches-php-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-what-reaches-php-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Cart, checkout and account pages never use the cache. Filtered pages, rare searches, customer-group versions and post-deploy requests can be cached, but each needs its own entry, so many of them miss.</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>One block marked <code>cacheable="false"</code> makes the whole page uncacheable. Search your custom modules and theme layouts for it before you tune anything else. If the cache checks out, look at the other <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">causes of a slow Magento site</a>.</p></div>



<h2 class="wp-block-heading">How to find and fix full page cache misses</h2>



<p class="wp-block-paragraph">To fix Magento full page cache misses:</p>



<ol class="wp-block-list">
<li>Confirm Page Cache is enabled and set to Varnish.</li>


<li>Check the <code>X-Magento-Cache-Debug</code> header for MISS, then HIT.</li>


<li>Remove <code>cacheable="false"</code> from catalog and CMS layouts.</li>


<li>Stop flushing caches at peak hours.</li>


<li>Warm key URLs after deploys.</li>


<li>Make the uncached page build faster.</li>

</ol>



<h3 class="wp-block-heading">Check whether a page came from the cache</h3>



<p class="wp-block-paragraph">Magento adds its debug headers in developer mode only, so run this on staging or in a short developer-mode window, never on a live production store. Request the page twice with <code>curl -I</code> and read two headers. <code>X-Magento-Cache-Debug</code> shows MISS on the first request and HIT on the second. If the Magento 2 full page cache is not working at all, it shows MISS every time. <code>X-Magento-Cache-Control</code> shows the TTL, for example <code>max-age=86400, public, s-maxage=86400</code>. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/config-varnish-final" target="_blank" rel="noopener">Verify Varnish configuration</a> page says a cacheable page should load in less than 150 ms when Varnish works, and that <code>var/page_cache</code> should stay empty.</p>



<p class="wp-block-paragraph">Then test the miss path: log in, open a filtered category URL right after a cache clean, and run a rare search. Compare those timings with field data from <a href="https://scandiweb.com/blog/how-to-and-how-not-to-use-google-pagespeed-insights/" target="_blank" rel="noopener">PageSpeed Insights</a> and Google&#8217;s guide of 0.8 seconds or less for a good TTFB. If a page misses that mark, our guide to <a href="https://scandiweb.com/blog/reduce-initial-server-response-time/" target="_blank" rel="noopener">reducing server response time</a> covers the fixes. To run the same comparison on every page type, see how to <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">audit Magento performance</a>. If the header says HIT and the page is still slow, the wait is in the browser, in the theme, images or JavaScript, and a frontend such as <a href="https://scandiweb.com/blog/how-to-work-with-hyva/" target="_blank" rel="noopener">Hyvä</a> is the place to look.</p>



<h3 class="wp-block-heading">Fix the misses you can remove</h3>



<p class="wp-block-paragraph">Work through these in order.</p>



<ol class="wp-block-list">
<li>Remove <code>cacheable="false"</code> from blocks on catalog, product and CMS pages. Move whatever personal data the block showed into private content, so it loads in the browser.</li>


<li>Switch production from Built-in to Varnish Caching. A built-in hit still runs PHP.</li>


<li>Clean by type instead of flushing, and schedule any flush off-peak.</li>


<li>Find what keeps invalidating the cache. Imports, mass product saves and cron jobs that touch the catalog purge pages all day.</li>


<li>Keep custom cookies and context variables out of the cache key. Each new variable multiplies the number of copies.</li>


<li>Warm the top URLs after each deploy, briefly. A warmer refills the most visited pages so the first shoppers get hits, and it has done its job once the cache is full. Our guide to the <a href="https://scandiweb.com/blog/magento-cache-warmer/" target="_blank" rel="noopener">Magento 2 cache warmer</a> covers how to run one without slowing the store.</li>

</ol>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-miss-decision-tree.png" alt="Decision tree for fixing Magento full page cache misses, from checking the cache header to speeding up the page build" class="wp-image-26504" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-miss-decision-tree.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-miss-decision-tree-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-miss-decision-tree-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-miss-decision-tree-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-miss-decision-tree-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-miss-decision-tree-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-full-page-cache-miss-decision-tree-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Start with the X-Magento-Cache-Debug header. A page that never caches needs a layout or setup fix, a page that is purged too often needs a better deploy routine, and a page with too many versions needs a faster build.</figcaption></figure></div>



<h3 class="wp-block-heading">Make the uncached page build faster</h3>



<p class="wp-block-paragraph">Some misses stay. Rare searches, filter combinations and customer groups cannot all be warmed, because there are too many of them and the list changes every day. Our comparison of <a href="https://scandiweb.com/blog/best-magento-speed-optimization-extensions/" target="_blank" rel="noopener">Magento speed optimization extensions</a> sorts the options by the layer each one speeds up. For those requests, the time Magento takes to build the page is the time the shopper waits, and no cache setting changes it.</p>



<p class="wp-block-paragraph"><a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> is scandiweb&#8217;s software for that part of the request. It speeds up how Magento builds each page on the server by applying Liquid, the open-source template language created at Shopify, and its core is open source. It works on Magento 2 Open Source, Adobe Commerce and Commerce Cloud, with Luma, Hyvä or a custom theme, on any hosting, and it leaves the theme, design, data, admin, catalog, prices, checkout and orders as they are. The page build gets at least 2x faster, and the same server handles 3x the traffic before response times start to rise. In a benchmark on one merchant&#8217;s Hyvä store, measured as server response time with no full page cache, category pages opened with all caches empty took a median of 57 ms instead of 181 ms, 3.2x faster. At peak traffic, filtered category pages answered 3.0x faster and search results 3.8x faster. The method and caveats are in the <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">Expedio benchmark</a>.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png" alt="The Expedio page on scandiweb.com with the headline Magento. 2x faster. and buttons to get Expedio or try the demo" class="wp-image-25972" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Expedio makes Magento at least 2x faster without changing your theme or data</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>Test a page twice: once as a guest on a cached URL, once logged in on a filtered URL right after a cache clean. The gap between the two is the work the cache was hiding.</p></div>



<h2 class="wp-block-heading">Frequently asked questions about Magento full page cache</h2>



<h3 class="wp-block-heading">Does the Magento full page cache work for logged-in customers?</h3>



<p class="wp-block-paragraph">Yes, for catalog and CMS pages. Magento keys each cached page by URL plus a context hash from the X-Magento-Vary cookie, which covers the customer group, store, currency and whether the shopper is logged in. Personal details such as the name and cart load separately in the browser. Each customer group fills its own copy, so stores with many B2B groups see more misses.</p>



<h3 class="wp-block-heading">Should I use Varnish or the built-in full page cache in production?</h3>



<p class="wp-block-paragraph">Use Varnish. Adobe strongly recommends Varnish in production and calls the built-in full page cache, whether it writes to the file system or the database, much slower. A Varnish hit is answered without reaching the web server, while the built-in cache still runs PHP for every hit. On Adobe Commerce Cloud, Fastly does the full page caching instead.</p>



<h3 class="wp-block-heading">How long does Magento keep a page in the full page cache?</h3>



<p class="wp-block-paragraph">For 86,400 seconds, or 24 hours, by default. That is the TTL for public content under Stores &gt; Settings &gt; Configuration &gt; Advanced &gt; System &gt; Full Page Cache. A page can leave the cache sooner: editing a product, category, price or promotional pricing rule purges the related pages, and cleaning or flushing the Magento cache purges Varnish too.</p>



<h3 class="wp-block-heading">Are search results pages cached in Magento 2?</h3>



<p class="wp-block-paragraph">They can be. In Magento 2.4, the default Varnish configuration does not bypass search URLs, and the search results layout has no uncacheable block. Each search term is a separate URL, though, so only repeated searches find a cached copy. A rare or first-time search misses, and Magento builds the results page in PHP.</p>



<h3 class="wp-block-heading">Does flushing the Magento cache slow the store down?</h3>



<p class="wp-block-paragraph">For a while, yes. After a flush, PHP has to build every page again until shoppers or a cache warmer refill the cache, so server load and response times rise. Adobe advises scheduling cache flushes for non-peak times. Use <code>cache:clean</code> for routine changes, and keep <code>cache:flush</code>, which empties the whole cache storage, for cases where cleaning does not help.</p>



<h3 class="wp-block-heading">Do I need a cache warmer if I already run Varnish?</h3>



<p class="wp-block-paragraph">A warmer helps after deploys and flushes, when Varnish starts empty. It requests your most visited URLs so the first shoppers get cached pages. It adds server load while it runs and cannot reach every filter combination, search term or customer group. For those requests, shoppers wait for the uncached page build, so its speed still matters.</p>



<h2 class="wp-block-heading">Magento full page cache: what to fix first</h2>



<p class="wp-block-paragraph">The Magento full page cache is the first speed fix for any store with real traffic, and the order of work after turning it on matters more than any single setting. Run Varnish in production rather than the built-in cache. Remove the misses you cause yourself: uncacheable blocks that a module added, flushes at peak, imports that invalidate the cache every few minutes. Warm the pages that matter after each deploy. Then look at the requests that will always miss, filtered pages, rare searches and quiet customer groups, and make the uncached build itself faster, because that is the time those shoppers wait.</p>



<p class="wp-block-paragraph">The full page cache is one layer of the work to <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">speed up Magento</a>, alongside the server, database and frontend.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Does the Magento full page cache work for logged-in customers?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, for catalog and CMS pages. Magento keys each cached page by URL plus a context hash from the X-Magento-Vary cookie, which covers the customer group, store, currency and whether the shopper is logged in. Personal details such as the name and cart load separately in the browser. Each customer group fills its own copy, so stores with many B2B groups see more misses."}}, {"@type": "Question", "name": "Should I use Varnish or the built-in full page cache in production?", "acceptedAnswer": {"@type": "Answer", "text": "Use Varnish. Adobe strongly recommends Varnish in production and calls the built-in full page cache, whether it writes to the file system or the database, much slower. A Varnish hit is answered without reaching the web server, while the built-in cache still runs PHP for every hit. On Adobe Commerce Cloud, Fastly does the full page caching instead."}}, {"@type": "Question", "name": "How long does Magento keep a page in the full page cache?", "acceptedAnswer": {"@type": "Answer", "text": "For 86,400 seconds, or 24 hours, by default. That is the TTL for public content under Stores > Settings > Configuration > Advanced > System > Full Page Cache. A page can leave the cache sooner: editing a product, category, price or promotional pricing rule purges the related pages, and cleaning or flushing the Magento cache purges Varnish too."}}, {"@type": "Question", "name": "Are search results pages cached in Magento 2?", "acceptedAnswer": {"@type": "Answer", "text": "They can be. In Magento 2.4, the default Varnish configuration does not bypass search URLs, and the search results layout has no uncacheable block. Each search term is a separate URL, though, so only repeated searches find a cached copy. A rare or first-time search misses, and Magento builds the results page in PHP."}}, {"@type": "Question", "name": "Does flushing the Magento cache slow the store down?", "acceptedAnswer": {"@type": "Answer", "text": "For a while, yes. After a flush, PHP has to build every page again until shoppers or a cache warmer refill the cache, so server load and response times rise. Adobe advises scheduling cache flushes for non-peak times. Use cache:clean for routine changes, and keep cache:flush, which empties the whole cache storage, for cases where cleaning does not help."}}, {"@type": "Question", "name": "Do I need a cache warmer if I already run Varnish?", "acceptedAnswer": {"@type": "Answer", "text": "A warmer helps after deploys and flushes, when Varnish starts empty. It requests your most visited URLs so the first shoppers get cached pages. It adds server load while it runs and cannot reach every filter combination, search term or customer group. For those requests, shoppers wait for the uncached page build, so its speed still matters."}}]}</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em>If the cache is on and logged-in, filtered or search pages are still slow, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>ask our Magento team</em></a><em> to measure which requests miss and what each one costs your store.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-full-page-cache/">Magento Full Page Cache: How It Works, What It Can&#8217;t Cache, and How to Fix Misses</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Black Friday Code Freeze: 2026 Timeline, Load Testing, and Incident Plan</title>
		<link>https://scandiweb.com/blog/black-friday-code-freeze/</link>
		
		<dc:creator><![CDATA[Aigars Pavlovics]]></dc:creator>
		<pubDate>Thu, 29 Oct 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[Digital Growth]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[24/7 support]]></category>
		<category><![CDATA[Black Friday]]></category>
		<category><![CDATA[code freeze]]></category>
		<category><![CDATA[cyber monday]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[eCommerce operations]]></category>
		<category><![CDATA[load testing]]></category>
		<category><![CDATA[peak traffic]]></category>
		<category><![CDATA[site performance]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26181</guid>

					<description><![CDATA[<p>Plan your Black Friday code freeze with 2026 dates, load testing targets, an incident runbook, on-call cover, and safe test orders.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/black-friday-code-freeze/">Black Friday Code Freeze: 2026 Timeline, Load Testing, and Incident Plan</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-BfCfz wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/ecommerce-support-services" target=_blank >
        eCommerce Support
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/performance-optimization" target=_blank >
        Performance Optimization
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-support" target=_blank >
        Magento Support
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">If your team is still merging features in late October and someone has just asked when the code freeze starts, the answer for Black Friday 2026 is: new features stop on Monday, November 2, and the last planned deployment goes out on Friday, November 13. Black Friday falls on November 27 and Cyber Monday on November 30. Count back the time you need to load test, fix what breaks, and test again, and the window for risky changes closes in early November.</p>



<p class="wp-block-paragraph">The outage you&#8217;re trying to prevent rarely comes from a big release. One of our support clients launched a large campaign on a Friday, traffic climbed, and the whole site went down. Restarts didn&#8217;t help. The cause was a product label rule meant to cover the whole catalog except five products, set up by selecting every brand, and it made the platform fetch items in a loop. Nobody had deployed code that day.</p>



<p class="wp-block-paragraph">That&#8217;s why this guide treats Black Friday readiness as three engineering jobs: a code freeze that also covers configuration, a load test with a target you can defend, and an incident plan with named people on call. Marketing, merchandising, and promo planning are covered in our <a href="https://scandiweb.com/blog/black-friday-checklist/" target="_blank" rel="noopener">Black Friday and Cyber Monday checklist</a>.</p>



<h2 class="wp-block-heading">What is a code freeze, and what should it cover?</h2>



<p class="wp-block-paragraph">A code freeze is a period when a team stops deploying changes to production, so the live system stays in a known, tested state. For an online store before Black Friday, a code freeze should cover more than application code: configuration, extension and app updates, infrastructure changes, tracking scripts, and price or promotion rules can all take a store down, and none of them needs a developer to deploy.</p>



<p class="wp-block-paragraph">Software teams use the term in two ways. Before a release, a code freeze means no new features, only bug fixes. Before a peak, it means no changes to production at all unless an agreed process approves them. Some teams call the second one a change freeze, which is the more accurate name for eCommerce, because outages like the one above start with changes that never go through a code review.</p>



<p class="wp-block-paragraph">The freeze also protects your test results. A load test only describes the store you tested. Every change after it, even a small one, makes the result less true.</p>



<h3 class="wp-block-heading">What the freeze allows, and what it blocks</h3>



<p class="wp-block-paragraph">A freeze that blocks everything gets ignored by the third day. Agree in writing which changes are allowed, who approves them, and how they&#8217;re tested.</p>



<figure class="wp-block-table"><table><thead><tr><th>Change</th><th>During the freeze</th><th>How it goes live</th></tr></thead><tbody><tr><td>New features, refactoring, dependency upgrades</td><td>Blocked</td><td>After Cyber Monday</td></tr><tr><td>Extension, app, and plugin updates</td><td>Blocked</td><td>After Cyber Monday, unless it&#8217;s a security fix</td></tr><tr><td>Infrastructure, CDN, DNS, and hosting changes</td><td>Blocked</td><td>Only the agreed scale-up, on a scheduled date</td></tr><tr><td>Tag manager containers and third-party scripts</td><td>Blocked</td><td>Publish final versions before the freeze</td></tr><tr><td>Security patches and hotfixes for live bugs</td><td>Allowed</td><td>Emergency change process: staging test, approval, rollback ready</td></tr><tr><td>Catalog, price, and promotion rules</td><td>Allowed, with limits</td><td>Built and tested on staging, applied at an agreed time</td></tr><tr><td>CMS content, banners, and landing pages</td><td>Allowed</td><td>Through the CMS, with no new templates or scripts</td></tr></tbody></table><figcaption class="wp-element-caption">What a Black Friday code freeze blocks and what it allows</figcaption></figure>



<p class="wp-block-paragraph">Tag manager containers belong on the blocked list. A new marketing pixel is code running in every shopper&#8217;s browser, and a slow third-party script can hold up the checkout as effectively as a bad deploy.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/code-freeze-frozen-vs-allowed-changes.png" alt="Two columns listing changes blocked by the code freeze and changes allowed through an emergency change process" class="wp-image-26176" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/code-freeze-frozen-vs-allowed-changes.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/code-freeze-frozen-vs-allowed-changes-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/code-freeze-frozen-vs-allowed-changes-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/code-freeze-frozen-vs-allowed-changes-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/code-freeze-frozen-vs-allowed-changes-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/code-freeze-frozen-vs-allowed-changes-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/code-freeze-frozen-vs-allowed-changes-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">What a Black Friday code freeze blocks and what it allows through a process</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>The changes that break stores in November often come from the admin panel and the tag manager, with no deploy at all. If your freeze only stops the deployment pipeline, it covers the smaller risk.</p></div>



<h2 class="wp-block-heading">When should the code freeze start for Black Friday 2026?</h2>



<p class="wp-block-paragraph">For Black Friday 2026, start the feature freeze on Monday, November 2, and allow no major deployments after Friday, November 13, two weeks before Black Friday. That leaves two weeks for load testing and fixes before the strict freeze, and two weeks of stable production before the peak. Keep the freeze in place through Cyber Monday, November 30, and lift it no earlier than Tuesday, December 1.</p>



<p class="wp-block-paragraph">These dates match what our team has seen work for years. In a scandiweb Black Friday panel, Glebs Vrevskis described the usual pattern: &#8220;A common thing we see is code freeze starting from the first days of November, with no new features being released.&#8221; Reinis Groskops added that &#8220;the latest time to do any major deployments is probably 2 weeks before Black Friday.&#8221; The full <a href="https://scandiweb.com/blog/black-friday-how-not-to-f-up-q-and-a/" target="_blank" rel="noopener">Black Friday Q&amp;A with our team</a> covers the rest of their advice.</p>



<figure class="wp-block-table"><table><thead><tr><th>Date (2026)</th><th>Milestone</th><th>What happens</th></tr></thead><tbody><tr><td>Thu–Fri, Oct 29–30</td><td>Scope locked, load testing starts</td><td>Last features picked, everything else moves to December. First test round on a production-sized environment</td></tr><tr><td>Mon, Nov 2</td><td>Feature freeze</td><td>No new features. Bug fixes and test findings only</td></tr><tr><td>Fri, Nov 6</td><td>Capacity booked</td><td>Hosting scale-up requested (Adobe Commerce on cloud: 10 business days ahead is Nov 12 at the latest)</td></tr><tr><td>Fri, Nov 13</td><td>Strict freeze</td><td>Last planned deployment. After this, emergency changes only</td></tr><tr><td>Mon–Fri, Nov 16–20</td><td>Rehearsal week</td><td>Final verification test, runbook walk-through, on-call rota confirmed</td></tr><tr><td>Wed, Nov 25</td><td>Rules applied</td><td>Pre-tested price and promotion rules switched on in the evening</td></tr><tr><td>Thu, Nov 26 – Mon, Nov 30</td><td>Peak</td><td>War room, 24/7 on-call, hourly checks</td></tr><tr><td>Tue, Dec 1</td><td>Review and thaw</td><td>Post-peak review, then the release backlog opens again</td></tr></tbody></table><figcaption class="wp-element-caption">Code freeze timeline for Black Friday 2026</figcaption></figure>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-code-freeze-timeline-2026.png" alt="Timeline of the 2026 Black Friday code freeze with feature freeze on November 2 and strict freeze on November 13" class="wp-image-26177" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-code-freeze-timeline-2026.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-code-freeze-timeline-2026-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-code-freeze-timeline-2026-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-code-freeze-timeline-2026-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-code-freeze-timeline-2026-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-code-freeze-timeline-2026-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-code-freeze-timeline-2026-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Code freeze timeline for Black Friday 2026, from scope lock to review</figcaption></figure></div>



<p class="wp-block-paragraph">Two dates in the table are easy to miss. If you&#8217;re on Adobe Commerce on cloud infrastructure, <a href="https://experienceleague.adobe.com/en/docs/support-resources/adobe-support-tools-guide/adobe-commerce-support/adobe-commerce-holiday-readiness/holiday-readiness-overview" target="_blank" rel="noopener">Adobe recommends</a> requesting a temporary compute upsize at least 10 business days before a major promotion, and finishing all patching before the code freeze. Promotions don&#8217;t count as emergencies, and Adobe notes that capacity during Black Friday and Cyber Monday is limited, so book early. If you&#8217;re still on a release line close to end of support, check our <a href="https://scandiweb.com/blog/magento-end-of-life/" target="_blank" rel="noopener">Magento end-of-life guide</a> before the freeze, because a patch you can&#8217;t apply in November waits until December.</p>



<p class="wp-block-paragraph">The other date is November 25. Our support team recommends building price and promotion rules on staging, testing them there, and switching them on the evening before the sale, without a customer email going out at the same moment. On high-load stores, that gives the platform a night to reindex before the traffic arrives, and any problem shows up while there&#8217;s still time to fix it. It&#8217;s the lesson from the outage in the introduction: once the rule was rebuilt to exclude five SKUs, it applied in two to three minutes instead of taking the site down for about an hour, and the fix was worth $500,000 in extra sales for that client.</p>



<p class="wp-block-paragraph"><strong>Read more:</strong> <a href="https://scandiweb.com/blog/how-scandiweb-support-saved-sales-event/" target="_blank" rel="noopener">How scandiweb Support Saved a Client&#8217;s Sales Event</a></p>



<p class="wp-block-paragraph">If your sales start earlier, as many now do, move the whole calendar back by the same number of days. Date the freeze from the first day of heavy traffic, whatever the banner says.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>Set the freeze date from the load-testing plan. Two test rounds with fixes in between take about two weeks, so a store that starts testing in mid-November has already run out of time.</p></div>



<h2 class="wp-block-heading">Black Friday load testing: targets, scenarios, and pass criteria</h2>



<p class="wp-block-paragraph">eCommerce load testing for Black Friday means simulating your expected peak traffic, measured at the busiest minute, on an environment sized like production, and checking that shoppers can still search, add to cart, and pay within agreed response times. Set the target from your own data, script the full buying journey including checkout, and run at least two rounds with fixes in between.</p>



<h3 class="wp-block-heading">Can the site take 5× traffic?</h3>



<p class="wp-block-paragraph">It depends on what the 5 multiplies. Five times an average day is often below a real Black Friday peak. On one Black Friday we supported, visits were up 10,955% on an average day, and concurrent visitors went from a couple of hundred to more than 17,000 as the first campaigns went out.</p>



<p class="wp-block-paragraph">Build the target from numbers you already have:</p>



<ol class="wp-block-list">
<li><strong>Find last year&#8217;s peak minute.</strong> Take the busiest hour from GA4 or your server logs, then look for the minute-level spikes inside it. Email sends and campaign launches create bursts that an hourly average hides.</li>


<li><strong>Apply this year&#8217;s forecast.</strong> Multiply by the growth the business expects and add any new traffic sources, such as a bigger email list or paid budget.</li>


<li><strong>Translate it into load.</strong> Express the target as concurrent sessions, page requests per second, and orders per minute. Orders per minute is the number that matters most, because checkout is the most expensive journey to serve.</li>


<li><strong>Add headroom.</strong> Test at the forecast peak, then at double it, then keep raising the load until something breaks, so you know where the ceiling is and what fails first.</li>

</ol>



<p class="wp-block-paragraph">Black Friday traffic is also different from normal traffic. Most days, shoppers browse cached category pages. After the last deploy before the freeze, <a href="https://scandiweb.com/blog/magento-cache-warmer/" target="_blank" rel="noopener">warm the cache</a> for your top pages so peak traffic doesn&#8217;t start on cold ones. On Black Friday, they add to cart and check out, and those pages aren&#8217;t cached, so the same number of visitors puts far more load on the application and the database.</p>



<h3 class="wp-block-heading">Which scenarios to test</h3>



<p class="wp-block-paragraph">A test that hammers the homepage measures your CDN, and not much else. Script the journeys that make money and the background jobs that run at the same time:</p>



<figure class="wp-block-table"><table><thead><tr><th>Scenario</th><th>Share of simulated users</th><th>Why it matters</th></tr></thead><tbody><tr><td>Browse category and product pages</td><td>50–60%</td><td>Checks caching, images, and search under load</td></tr><tr><td>Search and filtered navigation</td><td>15–20%</td><td>Search and faceted filters often skip the page cache</td></tr><tr><td>Add to cart and view cart</td><td>15–20%</td><td>Uncached, writes to the database</td></tr><tr><td>Checkout with payment</td><td>5–10%</td><td>The slowest journey, plus calls to payment, tax, and shipping services</td></tr><tr><td>Log in and view account or orders</td><td>5%</td><td>Session and customer data under load</td></tr><tr><td>Background: order export, stock sync, imports, cron</td><td>Running throughout</td><td>Shows whether back-office jobs slow the storefront</td></tr><tr><td>Back office: staff processing orders in the admin</td><td>A realistic number of users</td><td>Admin queries compete with shoppers for the same database</td></tr></tbody></table><figcaption class="wp-element-caption">Load testing scenarios and a starting traffic split</figcaption></figure>



<p class="wp-block-paragraph">Point payments at a sandbox or a stub. A load test that sends thousands of real authorizations to your payment provider may trip its fraud checks, and nobody wants to explain that on November 20.</p>



<h3 class="wp-block-heading">Pass criteria that make the result useful</h3>



<p class="wp-block-paragraph">Agree the pass criteria before the first run, so the result is a clear pass or fail. The thresholds below are a starting point to adapt, not a standard:</p>



<figure class="wp-block-table"><table><thead><tr><th>Measure</th><th>Example pass criterion at forecast peak</th></tr></thead><tbody><tr><td>Orders per minute</td><td>Sustained at the forecast peak for at least 30 minutes</td></tr><tr><td>Checkout and cart response time</td><td>95th percentile under 2 seconds per step</td></tr><tr><td>Error rate</td><td>Under 1% of requests, and zero failed orders that the store accepted</td></tr><tr><td>Apdex (Adobe Commerce on cloud, New Relic)</td><td>0.85 or higher, Adobe&#8217;s own target</td></tr><tr><td>Database and application CPU</td><td>Headroom left at the forecast peak, not pinned at 100%</td></tr><tr><td>Queues (orders, emails, stock updates)</td><td>Drain as fast as they fill, with no growing backlog</td></tr></tbody></table><figcaption class="wp-element-caption">Example pass criteria for a Black Friday load test</figcaption></figure>



<p class="wp-block-paragraph">The last row is the one teams forget. On the Black Friday above, the servers held, but orders arrived faster than the order queue could process them, and confirmation emails would have been delayed by days. The fix was a script that moved orders into separate batches on a dedicated instance. A queue-depth check in the load test would have found it earlier.</p>



<p class="wp-block-paragraph"><strong>Read more:</strong> <a href="https://scandiweb.com/blog/scaling-up-to-accommodate-a-40000-increase-in-sales/" target="_blank" rel="noopener">Scaling Up to Accommodate a 40000% Increase in Sales</a></p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/ecommerce-load-testing-ramp-forecast-peak.png" alt="Chart of a load test ramping from forecast peak to double and then to failure, with checkout response time against a 2-second limit" class="wp-image-26178" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/ecommerce-load-testing-ramp-forecast-peak.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ecommerce-load-testing-ramp-forecast-peak-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ecommerce-load-testing-ramp-forecast-peak-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ecommerce-load-testing-ramp-forecast-peak-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ecommerce-load-testing-ramp-forecast-peak-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ecommerce-load-testing-ramp-forecast-peak-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ecommerce-load-testing-ramp-forecast-peak-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">A stepped eCommerce load test, from forecast peak to the break point</figcaption></figure></div>



<h3 class="wp-block-heading">Where to run the load test</h3>



<p class="wp-block-paragraph">Run the main rounds on an environment with the same size, configuration, and CDN setup as production. A staging server with half the CPU tells you little about Black Friday.</p>



<p class="wp-block-paragraph">How you test depends on the platform:</p>



<ul class="wp-block-list">
<li><strong>Adobe Commerce on cloud:</strong> test on a production-sized environment, watch the results in New Relic, and request the temporary upsize you need for the peak. Adobe&#8217;s checklist also covers read replicas, indexers set to Update on Schedule, and asynchronous order processing.</li>


<li><strong>Self-hosted Magento or headless:</strong> you own every layer, so the test has to cover the web servers, database, cache, search engine, message queue, and CDN. Agree any test against production with your host first, and run it at night.</li>


<li><strong>Shopify and Shopify Plus:</strong> Shopify runs and scales the platform, so your test surface is everything you added, such as a headless storefront, custom apps, checkout extensions, and the middleware that connects Shopify to your ERP. Ask Shopify before you point a load generator at the live storefront.</li>

</ul>



<p class="wp-block-paragraph">If the test exposes a slow storefront, our <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">guide to speeding up Magento</a> and <a href="https://scandiweb.com/blog/shopify-performance-optimization/" target="_blank" rel="noopener">Shopify performance playbook</a> cover the usual fixes. For drops and limited releases where demand can exceed any capacity you&#8217;d buy, a <a href="https://scandiweb.com/blog/the-waiting-room-virtual-queuing-for-ecommerce/" target="_blank" rel="noopener">virtual waiting room</a> keeps checkout working for the shoppers already inside.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>A load test that passes on the first run usually tested too little. Plan for the first round to find the bottleneck, the second to confirm the fix, and the third to find the ceiling.</p></div>



<h3 class="wp-block-heading">What to do when the test finds the ceiling</h3>



<p class="wp-block-paragraph">The ceiling is the traffic level where response times climb and errors start. You can move it before Black Friday in two ways: add capacity, so more servers share the work, or make each request cheaper, so the same servers handle more shoppers.</p>



<p class="wp-block-paragraph">Adding capacity is the quicker lever on most hosting. On Shopify, the platform handles this part for you. On Adobe Commerce on cloud, it is the temporary upsize in the timeline above. On self-hosted Magento, it means more web servers behind the load balancer, and our guide to <a href="https://scandiweb.com/blog/server-autoscaling-in-magento-2/" target="_blank" rel="noopener">server autoscaling in Magento 2</a> explains how to add them automatically. Extra servers cost money for as long as they run, and the database still has to keep up with all of them.</p>



<p class="wp-block-paragraph">Making each request cheaper raises the ceiling without new hardware. Many Black Friday requests reach Magento uncached, such as filtered category pages, searches and the first visits after a cache flush, and Magento builds each of those pages on the server. <a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> makes that page build at least 2x faster, so the same servers handle 3x the traffic before response times start to rise. The <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">Expedio benchmark</a> shows how we measured it on one merchant&#8217;s Hyvä store.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png" alt="The Expedio page on scandiweb.com with the headline Magento. 2x faster. and buttons to get Expedio or try the demo" class="wp-image-25972" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-to-shopify-migration-expedio-magento-2x-faster-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Expedio makes Magento at least 2x faster without changing your theme or data</figcaption></figure></div>



<p class="wp-block-paragraph">Treat Expedio like any other release. It installs as a module without changing your theme or data, but it still needs a load test, so put it in before the strict freeze on November 13. If that&#8217;s too tight, plan it for the next peak.</p>




<h2 class="wp-block-heading">The incident plan: runbook, roles, and on-call rotation</h2>



<p class="wp-block-paragraph">An eCommerce incident plan for Black Friday is a short document that says who is on call, how an incident is declared, who decides, and what the first action is for each likely failure. It should name people, list phone numbers for every outside provider, define severity levels, and include a tested rollback, so that at 9 p.m. on Black Friday nobody has to work out the process while the checkout is down.</p>



<p class="wp-block-paragraph">The order of steps matters more than the detail. During an incident, restore sales first, through a rollback, a disabled extension, or a switched payment method. Find the root cause afterward.</p>



<h3 class="wp-block-heading">Roles to name before the peak</h3>



<p class="wp-block-paragraph">Each role needs a named person and a backup for every shift:</p>



<ul class="wp-block-list">
<li><strong>Incident lead:</strong> declares the incident, sets the severity, and keeps the timeline. This person coordinates and doesn&#8217;t debug.</li>


<li><strong>On-call developer:</strong> investigates and applies the fix or rollback.</li>


<li><strong>Infrastructure or hosting contact:</strong> scales, restarts, or fails over servers, and talks to the host.</li>


<li><strong>Business owner:</strong> decides on trade-offs, such as pausing a campaign email or switching off a payment method.</li>


<li><strong>Communications:</strong> posts updates to the team every 30 minutes and decides what customers see, such as a site banner.</li>

</ul>



<h3 class="wp-block-heading">On-call rotation from Thanksgiving to Cyber Monday</h3>



<p class="wp-block-paragraph">Write the on-call rotation down, with names, shifts, and phone numbers, and keep a copy outside Slack, because the person you need may be offline. For the peak weekend, plan for 24/7 cover with handovers at fixed times, a second person on call for severity 1 incidents, and no one on call for more than 12 hours in a row.</p>



<p class="wp-block-paragraph">List the outside contacts in the runbook too: hosting, CDN, payment provider, ERP and warehouse integrations, search, and your agency, each with an emergency number and the account ID they&#8217;ll ask for. If you&#8217;re agreeing response times with an agency for the first time, our guide to <a href="https://scandiweb.com/blog/website-maintenance-cost/">support SLA tiers and 24/7 cover</a> explains what to ask for.</p>



<h3 class="wp-block-heading">Playbooks for the failures you can predict</h3>



<p class="wp-block-paragraph">Most Black Friday website crashes follow a few patterns. Write a first action for each one before the peak:</p>



<figure class="wp-block-table"><table><thead><tr><th>Failure</th><th>First signal</th><th>First action</th></tr></thead><tbody><tr><td>Checkout or payments failing</td><td>Payment success rate drops, checkout errors rise</td><td>Switch to a backup payment method, check the provider&#8217;s status page</td></tr><tr><td>Site slow or down under load</td><td>Response time and error rate climb</td><td>Scale up, switch non-essential extensions and recommendations off, enable the waiting room</td></tr><tr><td>A promo rule misfires</td><td>Wrong prices, or load spikes right after a rule change</td><td>Disable the rule, restore the tested version</td></tr><tr><td>Stock sync or ERP integration stops</td><td>Orders oversell, export queue grows</td><td>Pause the affected products, switch the sync to batch mode</td></tr><tr><td>Order or email queue backs up</td><td>Queue depth grows, confirmation emails delayed</td><td>Add workers or move processing to a separate instance</td></tr><tr><td>Bot traffic or card testing</td><td>Traffic spike with no orders, many failed payments</td><td>Turn on CDN bot rules and rate limits, add a checkout challenge</td></tr></tbody></table><figcaption class="wp-element-caption">Incident playbooks for predictable Black Friday failures</figcaption></figure>



<p class="wp-block-paragraph">Each playbook needs a kill switch: a configuration flag or admin setting that turns the risky feature off without a deploy. Test every one of them during rehearsal week.</p>



<h3 class="wp-block-heading">What to watch on the dashboard</h3>



<p class="wp-block-paragraph">Put the measures that show lost revenue on one screen, compared with the forecast for that hour:</p>



<ul class="wp-block-list">
<li>Orders per minute against the forecast</li>


<li>Payment success rate by method</li>


<li>Checkout and cart error rate</li>


<li>Server response time and error rate</li>


<li>Queue depth for orders, emails, and stock updates</li>


<li>Purchase events arriving in GA4 and your ad platforms</li>

</ul>



<p class="wp-block-paragraph">The last line catches a quiet failure. If purchase events stop arriving, the ad platforms keep spending on the busiest days of the year with no conversion data. If your tracking runs through a <a href="https://scandiweb.com/blog/server-side-tracking/" target="_blank" rel="noopener">server-side tracking setup</a>, add the server container&#8217;s error rate to the same screen.</p>



<p class="wp-block-paragraph">Practice the plan once before it&#8217;s needed. In rehearsal week, simulate one incident, such as a failed payment provider on staging, and time how long it takes from the alert to the workaround.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-incident-runbook-roles-escalation.png" alt="Escalation path from a checkout alert to the on-call developer, incident lead, business owner, hosting contact and payment provider" class="wp-image-26179" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-incident-runbook-roles-escalation.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-incident-runbook-roles-escalation-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-incident-runbook-roles-escalation-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-incident-runbook-roles-escalation-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-incident-runbook-roles-escalation-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-incident-runbook-roles-escalation-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/black-friday-incident-runbook-roles-escalation-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">How an incident is escalated during the Black Friday peak</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>The incident lead and the person fixing the problem should be two different people. When one person does both, nobody updates the business, and nobody decides whether to pause the email that is still sending traffic to a broken checkout.</p></div>



<h2 class="wp-block-heading">Test orders on production during peak</h2>



<p class="wp-block-paragraph">Yes, you can place test orders on production during the peak, and you should, as long as they follow agreed rules. A small number of real test orders each morning of the peak and after every approved change is the most direct proof that checkout, payment, stock, and order export still work end to end. Agree who places them, how they&#8217;re marked, and how they&#8217;re cancelled and refunded.</p>



<figure class="wp-block-table"><table><thead><tr><th>Method</th><th>Best for</th><th>Watch for</th></tr></thead><tbody><tr><td>Real card, small order, then cancel and refund</td><td>Confirming the live payment path end to end</td><td>Processor fees, and the order reaching the warehouse unless it&#8217;s flagged</td></tr><tr><td>Hidden test product or test customer group</td><td>Order export, emails, and ERP sync</td><td>It must stay hidden from search, feeds, and sitemaps</td></tr><tr><td>Payment provider test mode</td><td>Staging, not live stores</td><td>Shopify says not to switch Shopify Payments test mode on in a store that&#8217;s in production</td></tr><tr><td>Shopify Bogus Gateway</td><td>Shopify test stores</td><td>Other card providers have to be deactivated first, which isn&#8217;t practical on a live store</td></tr></tbody></table><figcaption class="wp-element-caption">Ways to place test orders on a live store</figcaption></figure>



<p class="wp-block-paragraph">Mark every test order clearly, for example with a test customer email and an order note, and tell the warehouse and finance teams which orders to ignore. Exclude them from reporting, or your peak-day numbers will be slightly wrong in every dashboard.</p>



<h2 class="wp-block-heading">FAQ about the Black Friday code freeze</h2>



<h3 class="wp-block-heading">What is a code freeze?</h3>



<p class="wp-block-paragraph">A code freeze is a set period when no changes are deployed to a production system, so it stays in a tested, known state. Before Black Friday, eCommerce teams use a code freeze to protect the store during the peak. A good one also covers configuration, extension updates, tag manager changes, and infrastructure, with an emergency process for security fixes.</p>



<h3 class="wp-block-heading">When should the code freeze start for Black Friday?</h3>



<p class="wp-block-paragraph">For Black Friday 2026, on November 27, start a feature freeze on November 2 and make the last planned deployment on November 13, two weeks before the peak. Use the time in between for load testing and fixes. If your sales start earlier in November, move each date back by the same number of days.</p>



<h3 class="wp-block-heading">How long should a Black Friday code freeze last?</h3>



<p class="wp-block-paragraph">Most stores keep the strict freeze for about two to three weeks: from two weeks before Black Friday until the day after Cyber Monday. For 2026, that means November 13 to December 1. Stores with heavy December trade often keep a lighter freeze until their last Christmas delivery date.</p>



<h3 class="wp-block-heading">Can we deploy a fix during the code freeze?</h3>



<p class="wp-block-paragraph">Yes, through an emergency change process. Security patches (such as the October 2026 <a href="https://scandiweb.com/blog/php2shell/">PHP2Shell fix</a>) and fixes for bugs that hurt sales can go live during the freeze if they&#8217;re tested on staging, approved by a named person, deployed at a quiet hour, and have a rollback ready. Everything else waits until the freeze lifts.</p>



<h3 class="wp-block-heading">Can the site take 5× traffic?</h3>



<p class="wp-block-paragraph">Only a load test can answer that, and only once you define what 5× means. Base the target on last year&#8217;s busiest minute, multiplied by this year&#8217;s forecast, then test at that level, at double it, and up to the break point. Five times an average day is often less than a real Black Friday peak.</p>



<h3 class="wp-block-heading">Should we load test on production?</h3>



<p class="wp-block-paragraph">Run the main load tests on an environment that matches production in size and configuration. Test production itself only with your hosting provider&#8217;s agreement, at a low-traffic hour, with payments pointed at a sandbox. On Shopify, check with Shopify before running load against the live storefront.</p>



<h3 class="wp-block-heading">Can we place test orders on production?</h3>



<p class="wp-block-paragraph">Yes, with rules. Place a few real test orders each morning of the peak and after any approved change, using a small real payment you cancel and refund, or a hidden test product. Mark the orders clearly, tell the warehouse and finance teams, and exclude them from reporting. Don&#8217;t switch payment test modes on in a live store.</p>



<h3 class="wp-block-heading">Who should be on call during Black Friday?</h3>



<p class="wp-block-paragraph">At minimum, an incident lead, an on-call developer, a hosting or infrastructure contact, and a business owner who can pause campaigns or switch payment methods. Cover the full Thanksgiving to Cyber Monday window around the clock, name a backup for each shift, and keep phone numbers for every outside provider in the runbook.</p>



<h2 class="wp-block-heading">Plan the code freeze this week</h2>



<p class="wp-block-paragraph">A Black Friday code freeze works when it starts from the load-testing plan, covers configuration as well as code, and ends with a team that knows who answers the phone. For 2026, that means locking scope this week, testing from late October, freezing features on November 2, and keeping production stable from November 13 through Cyber Monday. Write the runbook now, while there&#8217;s time to rehearse it.</p>



<script type="application/ld+json">
{
 "@context": "https://schema.org",
 "@type": "FAQPage",
 "mainEntity": [
  {
   "@type": "Question",
   "name": "What is a code freeze?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "A code freeze is a set period when no changes are deployed to a production system, so it stays in a tested, known state. Before Black Friday, eCommerce teams use a code freeze to protect the store during the peak. A good one also covers configuration, extension updates, tag manager changes, and infrastructure, with an emergency process for security fixes."
   }
  },
  {
   "@type": "Question",
   "name": "When should the code freeze start for Black Friday?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "For Black Friday 2026, on November 27, start a feature freeze on November 2 and make the last planned deployment on November 13, two weeks before the peak. Use the time in between for load testing and fixes. If your sales start earlier in November, move each date back by the same number of days."
   }
  },
  {
   "@type": "Question",
   "name": "How long should a Black Friday code freeze last?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "Most stores keep the strict freeze for about two to three weeks: from two weeks before Black Friday until the day after Cyber Monday. For 2026, that means November 13 to December 1. Stores with heavy December trade often keep a lighter freeze until their last Christmas delivery date."
   }
  },
  {
   "@type": "Question",
   "name": "Can we deploy a fix during the code freeze?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "Yes, through an emergency change process. Security patches and fixes for bugs that hurt sales can go live during the freeze if they're tested on staging, approved by a named person, deployed at a quiet hour, and have a rollback ready. Everything else waits until the freeze lifts."
   }
  },
  {
   "@type": "Question",
   "name": "Can the site take 5× traffic?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "Only a load test can answer that, and only once you define what 5× means. Base the target on last year's busiest minute, multiplied by this year's forecast, then test at that level, at double it, and up to the break point. Five times an average day is often less than a real Black Friday peak."
   }
  },
  {
   "@type": "Question",
   "name": "Should we load test on production?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "Run the main load tests on an environment that matches production in size and configuration. Test production itself only with your hosting provider's agreement, at a low-traffic hour, with payments pointed at a sandbox. On Shopify, check with Shopify before running load against the live storefront."
   }
  },
  {
   "@type": "Question",
   "name": "Can we place test orders on production?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "Yes, with rules. Place a few real test orders each morning of the peak and after any approved change, using a small real payment you cancel and refund, or a hidden test product. Mark the orders clearly, tell the warehouse and finance teams, and exclude them from reporting. Don't switch payment test modes on in a live store."
   }
  },
  {
   "@type": "Question",
   "name": "Who should be on call during Black Friday?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "At minimum, an incident lead, an on-call developer, a hosting or infrastructure contact, and a business owner who can pause campaigns or switch payment methods. Cover the full Thanksgiving to Cyber Monday window around the clock, name a backup for each shift, and keep phone numbers for every outside provider in the runbook."
   }
  }
 ]
}
</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em>Not sure your store will hold at the peak? </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>Talk to our team about load testing and on-call cover</em></a><em> before the freeze starts.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/black-friday-code-freeze/">Black Friday Code Freeze: 2026 Timeline, Load Testing, and Incident Plan</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>We Ranked 5,548 Baltic Brands for AI Search: Meet the Winners</title>
		<link>https://scandiweb.com/blog/baltic-ai-brand-ranking-winners/</link>
		
		<dc:creator><![CDATA[Lina Ivanova]]></dc:creator>
		<pubDate>Wed, 28 Oct 2026 16:04:56 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Digital Growth]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[AEO]]></category>
		<category><![CDATA[AI search optimization]]></category>
		<category><![CDATA[answer engine optimization]]></category>
		<category><![CDATA[AnswerRank]]></category>
		<category><![CDATA[Baltic AI Brand Ranking]]></category>
		<category><![CDATA[Baltic Brand Forum]]></category>
		<category><![CDATA[chatgpt]]></category>
		<category><![CDATA[perplexity]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26463</guid>

					<description><![CDATA[<p>scandiweb's Baltic AI brand ranking scored 5,548 brands by how often ChatGPT, Gemini and Perplexity recommend them. See the top 10 and country winners.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/baltic-ai-brand-ranking-winners/">We Ranked 5,548 Baltic Brands for AI Search: Meet the Winners</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-BaltR wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/solutions/aeo-rankings" target=_blank >
        Baltic AI Brand Ranking
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/ai-search-optimization" target=_blank >
        AI Search Optimization
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/ai-content-strategy-for-ecommerce" target=_blank >
        AI Content Strategy
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">When a buyer asks ChatGPT, Gemini or Perplexity which bank, airline or pharmacy to choose, the answer names a short list of brands, and the order of that list decides who gets chosen. Knowing where your brand stands in those answers is the first step to being recommended more often.</p>



<p class="wp-block-paragraph">To see where Baltic brands stand, we built the Baltic AI brand ranking. We asked the three assistants 3,419 buyer questions over a month and scored 5,548 companies in 113 industries across Latvia, Estonia and Lithuania, using AnswerRank. Lina Ivanova, our Head of Traffic Acquisition, presented the results at Baltic Brand Forum 2026 in Riga and announced the winners on the main stage.</p>



<p class="wp-block-paragraph">Banks, an airline, a bookstore and a fuel retailer are among this year&#8217;s winners and finalists, and one brand came out on top in three of the four rankings.</p>




<h2 class="wp-block-heading">The top 10 most AI recommended brands in the Baltics</h2>



<p class="wp-block-paragraph">Circle K leads the Baltic list with a score of 92.6, followed by Swedbank at 88.1 and Revolut at 87.8. The Baltic list only includes brands AI names in all three countries. A company that ChatGPT recommends in Latvia alone appears in the Latvian ranking instead. Two banks, a fuel retailer, a car rental company and an airline make up the top five.</p>



<figure class="wp-block-table"><table><thead><tr><th>#</th><th>Company</th><th>Industry</th><th>LV</th><th>EE</th><th>LT</th><th>Score</th></tr></thead><tbody><tr><td>1</td><td>Circle K</td><td>Fuel Retail</td><td>91.5</td><td>93.3</td><td>93.2</td><td>92.6</td></tr><tr><td>2</td><td>Swedbank</td><td>Banking</td><td>89.8</td><td>84.8</td><td>87.8</td><td>88.1</td></tr><tr><td>3</td><td>Revolut</td><td>Digital Banking</td><td>88.4</td><td>83.4</td><td>91.6</td><td>87.8</td></tr><tr><td>4</td><td>SIXT</td><td>Car Rental</td><td>84.0</td><td>89.2</td><td>81.0</td><td>84.7</td></tr><tr><td>5</td><td>airBaltic</td><td>Airlines</td><td>80.0</td><td>86.8</td><td>83.8</td><td>83.5</td></tr><tr><td>6</td><td>DPD</td><td>Parcel Delivery</td><td>88.9</td><td>90.9</td><td>–</td><td>83.3</td></tr><tr><td>7</td><td>Bolt</td><td>Taxi</td><td>87.2</td><td>83.8</td><td>89.0</td><td>82.3</td></tr><tr><td>8</td><td>ERGO</td><td>Insurance</td><td>78.6</td><td>81.2</td><td>86.4</td><td>82.1</td></tr><tr><td>9</td><td>Red Bull</td><td>Energy Drinks</td><td>78.5</td><td>84.3</td><td>82.7</td><td>81.9</td></tr><tr><td>10</td><td>adidas</td><td>Sportswear Manufacturing</td><td>87.5</td><td>70.5</td><td>87.5</td><td>81.8</td></tr></tbody></table><figcaption class="wp-element-caption">Top 10 brands in the Baltic AI Brand Ranking (scores out of 100)</figcaption></figure>



<p class="wp-block-paragraph">DPD has no Lithuania score in the published table, so its LT cell shows a dash.</p>



<p class="wp-block-paragraph">The list continues past these ten, and every industry has its own page with results per country. You can <a href="https://scandiweb.com/solutions/aeo-rankings" target="_blank" rel="noopener">see the full Baltic AI Brand Ranking</a> and search it for any company.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/baltic-ai-brand-ranking-top-10-chart.png" alt="Bar chart of the top 10 brands in the Baltic AI Brand Ranking, led by Circle K at 92.6" class="wp-image-26459" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/baltic-ai-brand-ranking-top-10-chart.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/baltic-ai-brand-ranking-top-10-chart-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/baltic-ai-brand-ranking-top-10-chart-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/baltic-ai-brand-ranking-top-10-chart-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/baltic-ai-brand-ranking-top-10-chart-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/baltic-ai-brand-ranking-top-10-chart-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/baltic-ai-brand-ranking-top-10-chart-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">The top 10 brands in the Baltic AI Brand Ranking, by score out of 100</figcaption></figure></div>



<h2 class="wp-block-heading">Winners and finalists in Latvia, Estonia and Lithuania</h2>



<p class="wp-block-paragraph">Circle K won in Latvia and Lithuania. Rahva Raamat, a bookstore, won in Estonia with 93.5, the highest score among the four winners. The winner of each ranking is the brand ChatGPT, Gemini and Perplexity recommend most, and the finalists hold places 2 to 5. The country lists also include brands AI names in only one or two countries, so the finalists differ from the Baltic top 10.</p>



<h3 class="wp-block-heading">Latvia</h3>



<p class="wp-block-paragraph">Circle K won Latvia with 91.5. The finalists follow.</p>



<ul class="wp-block-list">
<li>2nd place: Jānis Roze, Bookstore, 90.2</li>


<li>3rd place: Swedbank, Banking, 89.8</li>


<li>4th place: Stockmann, Department Store, 89.5</li>


<li>5th place: Tet, IPTV, 89.2</li>

</ul>



<h3 class="wp-block-heading">Estonia</h3>



<p class="wp-block-paragraph">Rahva Raamat won Estonia with 93.5. The finalists follow.</p>



<ul class="wp-block-list">
<li>2nd place: Circle K, Fuel Retail, 93.3</li>


<li>3rd place: DPD, Parcel Delivery, 90.9</li>


<li>4th place: Benu, Pharmacy, 89.7</li>


<li>5th place: Selver, Online Grocery Delivery, 89.4</li>

</ul>



<h3 class="wp-block-heading">Lithuania</h3>



<p class="wp-block-paragraph">Circle K won Lithuania with 93.2. The finalists follow.</p>



<ul class="wp-block-list">
<li>2nd place: Revolut, Digital Banking, 91.6</li>


<li>3rd place: Pigu, eCommerce Platform, 91.1</li>


<li>4th place: Maxima, Grocery / Supermarket, 90.7</li>


<li>5th place: Verslo Žinios, Business News, 90.6</li>

</ul>



<p class="wp-block-paragraph">Two things stand out in the country results. Circle K won three of the four rankings and finished second in Estonia, 0.2 points behind Rahva Raamat. Bookstores also do well: Rahva Raamat won Estonia, Jānis Roze is second in Latvia and Pegasas leads the Lithuanian bookstore category with 86.5. You can see <a href="https://scandiweb.com/solutions/aeo-rankings/winners" target="_blank" rel="noopener">all winners and finalists</a>, including the company AI names first in each of the 113 industries, on the winners page.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="1114" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-ai-ranking-winners-announcement.png" alt="Lina Ivanova and the event host on the Baltic Brand Forum stage in front of the Baltic Brand Forum screen" class="wp-image-26481" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-ai-ranking-winners-announcement.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-ai-ranking-winners-announcement-300x200.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-ai-ranking-winners-announcement-1024x682.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-ai-ranking-winners-announcement-150x100.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-ai-ranking-winners-announcement-768x512.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-ai-ranking-winners-announcement-1536x1023.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-ai-ranking-winners-announcement-1600x1066.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Lina Ivanova and the host announcing the AI ranking winners on stage at Baltic Brand Forum in Riga</figcaption></figure></div>



<h2 class="wp-block-heading">How the Baltic AI Brand Ranking was measured</h2>



<p class="wp-block-paragraph">We ran the study in <a href="https://scandiweb.com/blog/answerrank-brand-visibility-ai-search-leaderboard/" target="_blank" rel="noopener">AnswerRank</a>, our AI search monitoring tool. Over a month, AnswerRank put the same buyer questions to ChatGPT, Gemini and Perplexity for each industry in Latvia, Estonia and Lithuania, 3,419 questions across 113 industries, and recorded every company named in the answers. For each company it tracks how often the answers mention it, how they describe it and where in the answer it appears. A brand only appears in the ranking if AI named it, and the questions behind each industry are listed on that industry&#8217;s page of the ranking.</p>



<h3 class="wp-block-heading">Three measures in one score</h3>



<p class="wp-block-paragraph">Each company gets one score out of 100, built from three measures.</p>



<figure class="wp-block-table"><table><thead><tr><th>Measure</th><th>What it means</th><th>Weight</th></tr></thead><tbody><tr><td>Visibility</td><td>Share of answers that name the brand</td><td>Counts most</td></tr><tr><td>Sentiment</td><td>How favorably the answers describe the brand</td><td>Second</td></tr><tr><td>Average position</td><td>Where the brand appears in the answer, 1 = first</td><td>Separates close scores</td></tr></tbody></table><figcaption class="wp-element-caption">The three measures behind the AI brand score</figcaption></figure>



<p class="wp-block-paragraph">The ranking is independent and built by scandiweb. Baltic Brand Forum does not operate the ranking, and it is separate from the forum&#8217;s own Baltic Brand Awards, which are based on Norstat&#8217;s Brand Capital research.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/ai-brand-score-visibility-sentiment-position.png" alt="Diagram of visibility, sentiment and average position combining into one AI brand score out of 100" class="wp-image-26460" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/ai-brand-score-visibility-sentiment-position.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ai-brand-score-visibility-sentiment-position-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ai-brand-score-visibility-sentiment-position-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ai-brand-score-visibility-sentiment-position-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ai-brand-score-visibility-sentiment-position-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ai-brand-score-visibility-sentiment-position-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/ai-brand-score-visibility-sentiment-position-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">How the AI brand score combines visibility, sentiment and position</figcaption></figure></div>



<h2 class="wp-block-heading">Why AI recommendations matter for your brand</h2>



<p class="wp-block-paragraph">When a buyer asks an assistant which bank or pharmacy to use, the answer is a short list, and the order of that list decides who gets seen. Across our industry rankings, the brand named first appears in 67% of answers on average. The brand in fifth place appears in 22%. First place is close to the default answer, while fifth place is an occasional mention.</p>



<p class="wp-block-paragraph">The ranking page breaks results down by industry and by country, and the same question often gets a different answer in each market. Maxima is the grocery chain AI names first in Latvia and Lithuania, while Prisma leads in Estonia. In parcel delivery, Omniva leads Latvia, DPD leads Estonia and Venipak leads Lithuania. A brand that is well placed in one country needs its own check in the other two.</p>



<p class="wp-block-paragraph">Visibility in AI answers is the subject of answer engine optimization, or AEO. If the term is new to you, read our post on <a href="https://scandiweb.com/blog/what-is-answer-engine-optimization-aeo/" target="_blank" rel="noopener">what answer engine optimization is</a> first. The short version is that assistants build answers from the pages and third-party sources they can read, and a brand can change what those sources say about it.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>If ChatGPT, Gemini or Perplexity leave your brand out of an answer, the buyer who asked never sees it as an option. Being named at all is the first thing to check, before position or sentiment.</p></div>



<h2 class="wp-block-heading">Announced on stage at Baltic Brand Forum</h2>



<p class="wp-block-paragraph">scandiweb was an official partner of Baltic Brand Forum 2026, held on September 24–25, 2026 at Riga Circus under the theme &#8220;Stand Out&#8221;. Lina Ivanova, our Head of Traffic Acquisition, spoke on the main stage with the talk &#8220;When Buyers Ask AI What to Buy, Is Your Brand in the Answer?&#8221; and announced the winners of the AI ranking from that stage.</p>



<p class="wp-block-paragraph">Brands that heard their name in the hall can find their full industry results on the ranking page.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="1115" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-speaking-baltic-brand-forum.png" alt="Lina Ivanova on stage at Baltic Brand Forum in front of a slide on the battle for brand visibility" class="wp-image-26468" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-speaking-baltic-brand-forum.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-speaking-baltic-brand-forum-300x200.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-speaking-baltic-brand-forum-1024x683.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-speaking-baltic-brand-forum-150x100.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-speaking-baltic-brand-forum-768x512.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-speaking-baltic-brand-forum-1536x1024.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/lina-ivanova-speaking-baltic-brand-forum-1600x1067.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Lina Ivanova speaking about AI search on the main stage at Baltic Brand Forum in Riga</figcaption></figure></div>



<h2 class="wp-block-heading">How to move your brand up in AI answers</h2>



<p class="wp-block-paragraph">AI search optimization builds on SEO. Assistants that search the web read pages that search engines can find, so the technical work you already do for Google still counts. Two more things need attention on top of it: the full-sentence questions buyers ask and the third-party sources AI quotes. Our guide on <a href="https://scandiweb.com/solutions/aeo-rankings/how-to-rank-in-ai-search" target="_blank" rel="noopener">how to rank in AI search</a> covers each step in detail. The short version follows.</p>



<ol class="wp-block-list">
<li>Find the questions buyers ask, such as which bank in Lithuania has the lowest fees.</li>


<li>Check where AI places you today by searching the ranking for your company and noting your visibility, sentiment, average position and the competitors named ahead of you.</li>


<li>Answer those questions on your own site, covering what you sell, where you deliver and what it costs, with one page per market in its own language.</li>


<li>Get mentioned in the sources AI reads, including review sites, comparison articles, directories and news coverage.</li>


<li>Make your site readable for AI crawlers, with key content in HTML, structured data in place and a robots.txt that does not block GPTBot, OAI-SearchBot, PerplexityBot or Google-Extended.</li>


<li>Keep your facts the same everywhere, so your company name, address and product details match across your site, Google Business Profile, social profiles and directories.</li>


<li>Work on what AI says about you by answering reviews, fixing the problems customers keep mentioning and correcting outdated facts on third-party pages.</li>


<li>Measure the same questions every month, because AI answers change as the assistants update their sources.</li>

</ol>



<p class="wp-block-paragraph">For the measurement in step 8, see our post on <a href="https://scandiweb.com/blog/tracking-brand-mentions-in-llm-ai-generated-answers/" target="_blank" rel="noopener">tracking brand mentions in AI-generated answers</a>.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Quick takeaway</strong></p>  <p>Open your robots.txt and check that it does not block GPTBot, OAI-SearchBot, PerplexityBot or Google-Extended. It is the quickest item on the list to verify.</p></div>



<h2 class="wp-block-heading">Where does your brand stand?</h2>



<p class="wp-block-paragraph">Search the <a href="https://scandiweb.com/solutions/aeo-rankings" target="_blank" rel="noopener">Baltic AI Brand Ranking</a> for your company name. The result shows your visibility, sentiment and average position, and the competitors named ahead of you. If your brand is missing from the Baltic list, check the country rankings first, since they include brands named in fewer than three countries. If it is still not there, use the <a href="https://scandiweb.com/solutions/aeo-rankings/dont-see-your-brand" target="_blank" rel="noopener">Don&#8217;t see your brand?</a> page.</p>



<h2 class="wp-block-heading">FAQ</h2>



<h3 class="wp-block-heading">What is the Baltic AI Brand Ranking?</h3>



<p class="wp-block-paragraph">It is an independent ranking of 5,548 companies in 113 industries across Latvia, Estonia and Lithuania, ordered by how often ChatGPT, Gemini and Perplexity recommend them. scandiweb built it and gathered the data with AnswerRank, asking 3,419 buyer questions over a month. Each company gets one score out of 100 based on visibility, sentiment and average position.</p>



<h3 class="wp-block-heading">Which brand does AI recommend most in the Baltics?</h3>



<p class="wp-block-paragraph">Circle K, with a Baltic score of 92.6. Swedbank is second at 88.1 and Revolut third at 87.8. By country, Circle K also won Latvia with 91.5 and Lithuania with 93.2, while Rahva Raamat won Estonia with 93.5. Each of the 113 industries has its own leader per country, listed on the winners page.</p>



<h3 class="wp-block-heading">How is the AI brand score calculated?</h3>



<p class="wp-block-paragraph">Visibility is the share of answers that mention the company. Sentiment is how favorably the answers describe it. Average position is where the company appears in the answer, with 1 meaning first. The score rolls the three into one number out of 100. Visibility is weighted most, sentiment second, and position separates brands whose scores are close.</p>



<h3 class="wp-block-heading">Is the ranking connected to the Baltic Brand Awards?</h3>



<p class="wp-block-paragraph">No. The Baltic AI Brand Ranking is independent, built by scandiweb and announced at Baltic Brand Forum, where scandiweb was an official partner. The forum&#8217;s Baltic Brand Awards are a separate program based on Norstat&#8217;s Brand Capital research. A brand can win one and not appear in the other, so the two should not be read as a single result.</p>



<h3 class="wp-block-heading">Why is my brand not in the ranking?</h3>



<p class="wp-block-paragraph">There are four common reasons. AI did not name your brand for your industry&#8217;s questions. Your brand is listed under another name, as Rimi Eesti Food is in Estonia. Your brand is named in only one or two countries, which keeps it off the Baltic list but still in the country rankings. Or your industry was not among the 113 tested.</p>



<h3 class="wp-block-heading">How long does it take to move up in AI answers?</h3>



<p class="wp-block-paragraph">There is no fixed timeline. Each assistant refreshes its sources at its own pace, so a change on your site or in a third-party source shows up in ChatGPT, Gemini and Perplexity at different times. That is why the last step in our guide is to measure the same questions every month and compare the results.</p>



<h2 class="wp-block-heading">What the ranking means for your brand</h2>



<p class="wp-block-paragraph">The Baltic AI brand ranking gives you a measured answer to a question most brand teams have only guessed at: whether ChatGPT, Gemini and Perplexity name you when a buyer in Latvia, Estonia or Lithuania asks what to choose. Circle K, Swedbank and Revolut lead the Baltic list, Rahva Raamat leads Estonia, and 113 industries have their own leaders in each country. The gap between first and fifth place, 67% of answers against 22%, is the number to keep in mind. Congratulations again to the winners and finalists. For everyone else, the eight steps above are where to start, and the ranking page is where to check your position today.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "Article", "headline": "We Ranked 5,548 Baltic Brands for AI Search: Meet the Winners", "author": {"@type": "Person", "name": "Lina Ivanova", "jobTitle": "Head of Traffic Acquisition"}, "publisher": {"@type": "Organization", "name": "scandiweb", "url": "https://scandiweb.com"}, "about": {"@type": "Dataset", "name": "Baltic AI Brand Ranking", "url": "https://scandiweb.com/solutions/aeo-rankings"}, "mainEntityOfPage": "https://scandiweb.com/blog/baltic-ai-brand-ranking-winners/"}</script>
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What is the Baltic AI Brand Ranking?", "acceptedAnswer": {"@type": "Answer", "text": "It is an independent ranking of 5,548 companies in 113 industries across Latvia, Estonia and Lithuania, ordered by how often ChatGPT, Gemini and Perplexity recommend them. scandiweb built it and gathered the data with AnswerRank, asking 3,419 buyer questions over a month. Each company gets one score out of 100 based on visibility, sentiment and average position."}}, {"@type": "Question", "name": "Which brand does AI recommend most in the Baltics?", "acceptedAnswer": {"@type": "Answer", "text": "Circle K, with a Baltic score of 92.6. Swedbank is second at 88.1 and Revolut third at 87.8. By country, Circle K also won Latvia with 91.5 and Lithuania with 93.2, while Rahva Raamat won Estonia with 93.5. Each of the 113 industries has its own leader per country, listed on the winners page."}}, {"@type": "Question", "name": "How is the AI brand score calculated?", "acceptedAnswer": {"@type": "Answer", "text": "Visibility is the share of answers that mention the company. Sentiment is how favorably the answers describe it. Average position is where the company appears in the answer, with 1 meaning first. The score rolls the three into one number out of 100. Visibility is weighted most, sentiment second, and position separates brands whose scores are close."}}, {"@type": "Question", "name": "Is the ranking connected to the Baltic Brand Awards?", "acceptedAnswer": {"@type": "Answer", "text": "No. The Baltic AI Brand Ranking is independent, built by scandiweb and announced at Baltic Brand Forum, where scandiweb was an official partner. The forum's Baltic Brand Awards are a separate program based on Norstat's Brand Capital research. A brand can win one and not appear in the other, so the two should not be read as a single result."}}, {"@type": "Question", "name": "Why is my brand not in the ranking?", "acceptedAnswer": {"@type": "Answer", "text": "There are four common reasons. AI did not name your brand for your industry's questions. Your brand is listed under another name, as Rimi Eesti Food is in Estonia. Your brand is named in only one or two countries, which keeps it off the Baltic list but still in the country rankings. Or your industry was not among the 113 tested."}}, {"@type": "Question", "name": "How long does it take to move up in AI answers?", "acceptedAnswer": {"@type": "Answer", "text": "There is no fixed timeline. Each assistant refreshes its sources at its own pace, so a change on your site or in a third-party source shows up in ChatGPT, Gemini and Perplexity at different times. That is why the last step in our guide is to measure the same questions every month and compare the results."}}]}</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em> </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>Get a measurement of where AI places your brand</em></a><em>, and we will show you which questions it is missing from.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/baltic-ai-brand-ranking-winners/">We Ranked 5,548 Baltic Brands for AI Search: Meet the Winners</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP2Shell: What the Critical PHP Vulnerability Means for Your Online Store</title>
		<link>https://scandiweb.com/blog/php2shell/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 15:45:13 +0000</pubDate>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[adobe commerce]]></category>
		<category><![CDATA[adobe commerce security]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[magento 2]]></category>
		<category><![CDATA[magento 2 security]]></category>
		<category><![CDATA[Magento security]]></category>
		<category><![CDATA[Magento Support]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP2Shell]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26409</guid>

					<description><![CDATA[<p>PHP2Shell explained for eCommerce teams: which stores are exposed, the PHP versions that fix it, what to do if you can't patch yet, and how to prepare.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/php2shell/">PHP2Shell: What the Critical PHP Vulnerability Means for Your Online Store</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-Php2S wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/ecommerce-support-services" target=_blank >
        eCommerce Support Services
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-support" target=_blank >
        Magento Support
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-upgrade-services" target=_blank >
        Magento Upgrade
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">At 14:00 UTC on October 21, 2026, PHP released fixes for PHP2Shell, two flaws that can let a stranger with no login run code on a PHP web server. Cloudflare&#8217;s CEO counted thousands of exploit attempts in the ten hours before the fixes went out, tens of thousands in the 45 minutes after, and millions after that.</p>



<p class="wp-block-paragraph">Magento, Adobe Commerce, WooCommerce and Shopware all run on PHP, and this PHP security vulnerability is below the store code, where no store patch reaches. The fix is a PHP update on the server, so your store is only as safe as whoever runs that server: your host, Adobe, your agency or your own team. For most store owners, this week&#8217;s question is easy to ask and slow to answer: which PHP version is each of our servers running, and who confirmed it?</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>The fixed releases are PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35. A server on a lower number for its branch, or on PHP 8.1 or older, is still exposed unless its vendor backported the fix, and the package changelog will say so.</p></div>



<h2 class="wp-block-heading">What is PHP2Shell?</h2>



<p class="wp-block-paragraph">PHP2Shell is the name for two flaws in PHP itself, CVE-2026-109618 and CVE-2026-109619, each rated CVSS v4.0 9.2. A crafted web request can trigger them without a login and let an attacker run their own code on the server. PHP fixed both in versions 8.5.12, 8.4.27, 8.3.36 and 8.2.35 on October 21, 2026. Magento, WooCommerce and WordPress have no patch for it, because the fault is in PHP.</p>



<p class="wp-block-paragraph">PHP is both the language most store software is written in and the program that runs it on the server. The flaws are in how that program handles memory while it reads an incoming request, before your store&#8217;s own code starts. An attacker who gets code running at that point can do what a developer with server access could: add a card skimmer to checkout, copy passwords and API keys out of memory, or take the site offline.</p>



<p class="wp-block-paragraph"><a href="https://www.php.net/archive/2026.php" target="_blank" rel="noopener">PHP&#8217;s advisory</a> calls the first flaw remote code execution through out-of-memory corruption, and the second remote code execution through stale state left behind by an earlier request. It covers every PHP setup that serves web requests (PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed) and rates mod_php highest, with a demonstrated exploit that fires before any application code runs. <a href="https://sansec.io/research/php2shell" target="_blank" rel="noopener">Sansec traced the vulnerable code</a> back to PHP 5.4.0 from 2012, and Wiz researchers said the findings <a href="https://www.helpnetsecurity.com/2026/10/21/php2shell-php-vulnerabilities-patched-cve-2026-109618-cve-2026-109619/" target="_blank" rel="noopener">rank among the most severe vulnerabilities discovered in PHP</a>, a language behind about 69.7% of websites whose server-side language is known, according to W3Techs figures cited by <a href="https://www.infosecurity-magazine.com/news/php2shell-exploitation-attempt" target="_blank" rel="noopener">Infosecurity Magazine</a>.</p>



<h2 class="wp-block-heading">PHP2Shell timeline: what happened in October 2026</h2>



<p class="wp-block-paragraph">The flaws went from private bug report to internet-wide scanning in about ten weeks. Researchers reported them to PHP in August, the first exploit attempt hit a honeypot on October 17, details leaked on October 20, and PHP released the fixes at 14:00 UTC on October 21. CISA listed both CVEs as known exploited on October 26.</p>



<figure class="wp-block-table"><table><thead><tr><th>Date (UTC)</th><th>What happened</th></tr></thead><tbody><tr><td>August 1–24, 2026</td><td>Researchers at Calif find the flaws and report them to PHP from August 11, and Wiz Research reports them on August 24</td></tr><tr><td>October 17</td><td>Amazon&#8217;s MadPot honeypot logs the first exploitation attempt, four days before disclosure</td></tr><tr><td>October 20</td><td>Details leak in a Hacker News post, watchTowr confirms code execution, and PHP announces a critical release for the next day</td></tr><tr><td>October 21, 07:43</td><td>Cloudflare reports early attacks</td></tr><tr><td>October 21, 14:00</td><td>PHP releases 8.5.12, 8.4.27, 8.3.36 and 8.2.35</td></tr><tr><td>October 21</td><td>Cloudflare&#8217;s CEO counts tens of thousands of attempts in the first 45 minutes, hundreds of thousands within two hours, then millions</td></tr><tr><td>October 21</td><td>CISA tells organizations to patch now, or take PHP systems offline until they can</td></tr><tr><td>October 22</td><td>Sansec updates its advisory: mass exploitation is less likely than first expected</td></tr><tr><td>October 26</td><td>CISA adds both CVEs to its Known Exploited Vulnerabilities catalog</td></tr></tbody></table><figcaption class="wp-element-caption">PHP2Shell timeline, August to October 26, 2026 (UTC)</figcaption></figure>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-timeline-october-2026.png" alt="PHP2Shell timeline from August to October 26, 2026, with the October 21 PHP release highlighted" class="wp-image-26402" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-timeline-october-2026.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-timeline-october-2026-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-timeline-october-2026-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-timeline-october-2026-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-timeline-october-2026-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-timeline-october-2026-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-timeline-october-2026-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">PHP2Shell from the first bug report to CISA&#x27;s known-exploited listing</figcaption></figure></div>



<h3 class="wp-block-heading">Three critical flaws in seven weeks for Magento stores</h3>



<p class="wp-block-paragraph">This was the third critical flaw Magento stores had to deal with in seven weeks, and each one needed a different fix from a different place:</p>



<ul class="wp-block-list">
<li>StyleSmuggler, CVE-2026-75650, CVSS 10.0: a Magento zero-day <a href="https://sansec.io/research/stylesmuggler-0day" target="_blank" rel="noopener">under attack from September 4</a>, fixed by Adobe&#8217;s hotfix APSB26-146 on September 7 (see <a href="https://scandiweb.com/blog/adobe-magento-stylesmuggler-patch/" target="_blank" rel="noopener">which versions the StyleSmuggler patch covers</a>)</li>


<li>BlockStrap, CVE-2026-103849, CVSS 10.0: a template-engine injection fixed in <a href="https://www.adobe.com/trust/security/products/commerce/apsb26-153.html" target="_blank" rel="noopener">Adobe&#8217;s APSB26-153</a> on October 13, which <a href="https://sansec.io/research/blockstrap-magento-rce" target="_blank" rel="noopener">Sansec named</a> and rates higher than Adobe&#8217;s priority 2</li>


<li>PHP2Shell, October 21: a flaw in PHP itself, closed only by a PHP update</li>

</ul>



<p class="wp-block-paragraph">A store that installed the October Magento patch and stopped there is still exposed to the PHP flaw, and a store that updated PHP still needs the October Magento patch.</p>



<h2 class="wp-block-heading">Is your store affected by PHP2Shell?</h2>



<p class="wp-block-paragraph">Your store is affected if any part of it runs PHP and serves web requests, until that PHP is updated or rebuilt with a vendor backport. That covers Magento, Adobe Commerce, WooCommerce, Shopware, WordPress and Drupal, plus the PHP systems around a store, such as a Pimcore or Akeneo PIM, a blog or a custom tool. Clean store code makes no difference.</p>



<p class="wp-block-paragraph">Sansec confirmed that Magento, Shopware and WooCommerce stores are affected &#8220;even when their own code is clean,&#8221; and Calif showed unauthenticated code execution on Magento 2.4.9, WordPress 7.1.2 and Drupal 11.4.3, among others. Who installs the fix depends on how you host:</p>



<figure class="wp-block-table"><table><thead><tr><th>Setup</th><th>Who updates PHP</th><th>What to ask or check</th></tr></thead><tbody><tr><td>Your own servers or cloud account</td><td>Your team or your agency</td><td>PHP version and build date on every web, cron and queue worker</td></tr><tr><td>Managed hosting</td><td>The host</td><td>The fixed PHP build and the date it was applied, in writing</td></tr><tr><td>Adobe Commerce on cloud infrastructure</td><td>Adobe, through its PHP image</td><td>A support case confirming the patched image reached production</td></tr><tr><td>SaaS: Shopify, BigCommerce, Adobe Commerce as a Cloud Service</td><td>The platform</td><td>Nothing for the store itself, so check what you host outside it</td></tr><tr><td>Blog, PIM, middleware and custom tools you host yourself</td><td>Whoever runs each one</td><td>A list of them, with the same questions for each</td></tr></tbody></table><figcaption class="wp-element-caption">Who updates PHP for PHP2Shell, by hosting setup</figcaption></figure>



<p class="wp-block-paragraph">On Adobe Commerce on cloud infrastructure, Adobe Support told us on October 21 that it would deploy updated PHP images as soon as the patches were available, staging before production, and that no customer action was needed. We found no public Adobe bulletin on PHP2Shell, so a support case is how you confirm it for your own environment.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/who-patches-php-by-hosting-setup.png" alt="Diagram of who patches PHP on your own servers, managed hosting, Adobe Commerce cloud, SaaS and self-hosted extras" class="wp-image-26403" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/who-patches-php-by-hosting-setup.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/who-patches-php-by-hosting-setup-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/who-patches-php-by-hosting-setup-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/who-patches-php-by-hosting-setup-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/who-patches-php-by-hosting-setup-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/who-patches-php-by-hosting-setup-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/who-patches-php-by-hosting-setup-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Who updates PHP for PHP2Shell depends on how your store is hosted</figcaption></figure></div>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>&#8220;The host handles it&#8221; only counts as an answer once you have the PHP version, the build date and the date it was applied, in writing, for every server, including the PIM and the blog.</p></div>



<h3 class="wp-block-heading">Which PHP version fixes it on each Magento line</h3>



<p class="wp-block-paragraph">Each Magento line supports a fixed set of PHP branches, listed in our <a href="https://scandiweb.com/blog/magento-end-of-life/" target="_blank" rel="noopener">Magento end of life guide</a>. Matched against PHP&#8217;s fixed releases:</p>



<figure class="wp-block-table"><table><thead><tr><th>Magento line</th><th>Supported PHP</th><th>Fixed PHP to run</th></tr></thead><tbody><tr><td>2.4.9</td><td>8.5</td><td>8.5.12</td></tr><tr><td>2.4.8</td><td>8.4, 8.3</td><td>8.4.27 or 8.3.36</td></tr><tr><td>2.4.7</td><td>8.3, 8.2</td><td>8.3.36 or 8.2.35</td></tr><tr><td>2.4.6</td><td>8.2, 8.1</td><td>8.2.35, or a vendor 8.1 backport</td></tr><tr><td>2.4.5 and 2.4.4</td><td>8.1</td><td>A vendor 8.1 backport only</td></tr></tbody></table><figcaption class="wp-element-caption">Fixed PHP version for each Magento 2.4 line</figcaption></figure>



<p class="wp-block-paragraph">PHP no longer releases 8.1 or older, so stores on 8.1 depend on a Linux distribution or hosting vendor that applied PHP&#8217;s source backport, and they need an upgrade plan. Our <a href="https://scandiweb.com/blog/how-to-upgrade-magento-version-step-by-step-guide/" target="_blank" rel="noopener">step-by-step Magento upgrade guide</a> covers the path.</p>



<h3 class="wp-block-heading">How to check which PHP version your store runs</h3>



<p class="wp-block-paragraph">On a server you control, run:</p>



<pre class="wp-block-code"><code>php -v</code></pre>



<p class="wp-block-paragraph">The first line shows the version and build date. Anything built before October 21, 2026 can&#8217;t contain the fix. Distribution packages sometimes keep an older version number with the fix backported, so check the package changelog for both CVE IDs. The command line and the web server can also run different builds, so check PHP-FPM or mod_php, not only the terminal. On managed hosting, ask for the version and build date in writing.</p>



<h2 class="wp-block-heading">What PHP2Shell means for your business</h2>



<p class="wp-block-paragraph">An attacker who gets this flaw to work has the access of a developer on your server, about five weeks before Black Friday on November 27. For a store, that can mean a card skimmer in checkout, stolen customer data or a site that&#8217;s down in peak season. Exploit attempts are confirmed at internet scale, and as of October 27, 2026, no successful break-in at a specific store had been publicly confirmed.</p>



<p class="wp-block-paragraph">The sources disagree on how dangerous the attempts are. Amazon described PHP2Shell as broadly exploited in the wild, while saying it was unclear whether the attempts would have worked against real systems. Sansec found the public exploits don&#8217;t work against a default PHP installation and that an attack &#8220;needs specific knowledge of the target server and specific conditions on it.&#8221; CISA still added both CVEs to its known-exploited catalog.</p>



<p class="wp-block-paragraph">An unpatched server is exposed, which is different from breached, and a patch only stops new attempts. Sansec notes that leaked memory can contain &#8220;passwords, session tokens, API keys and TLS private keys from other requests,&#8221; so the checks in the next section are what tell you whether anyone got in between October 17 and your patch date.</p>



<p class="wp-block-paragraph">Outside parties watch the same dates. PCI DSS requirement 6.3.3 expects critical security patches within one month of release (our <a href="https://scandiweb.com/blog/pci-dss-saq-2025-updates-for-ecommerce-merchants/" target="_blank" rel="noopener">PCI DSS SAQ guide</a> covers who is responsible for what), and cyber insurers read the bulletins too. The day after PHP2Shell, the CTO of one retail client forwarded us an alert their insurer had sent about BlockStrap, saying they hadn&#8217;t seen an update on it yet. Our team had been working on it for two days.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-insurer-reply-anonymized.png" alt="Anonymized client email about an insurer alert on CVE-2026-103849, and a client reply saying everything was in control" class="wp-image-26404" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-insurer-reply-anonymized.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-insurer-reply-anonymized-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-insurer-reply-anonymized-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-insurer-reply-anonymized-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-insurer-reply-anonymized-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-insurer-reply-anonymized-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-insurer-reply-anonymized-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">A client&#x27;s insurer flagged BlockStrap, and another client on our communication (names removed)</figcaption></figure></div>



<h2 class="wp-block-heading">What to do now if PHP2Shell is not patched yet</h2>



<p class="wp-block-paragraph">Update PHP to 8.5.12, 8.4.27, 8.3.36 or 8.2.35 on every server that runs it, restart every PHP process, then check for signs of compromise and rotate credentials. PHP&#8217;s release notes are blunt about the alternatives: &#8220;There are no complete mitigations, updating is the only safe choice.&#8221;</p>



<ol class="wp-block-list">
<li>Update PHP everywhere it serves requests: staging first, then production, then the PIM, the blog and any custom tools. The package changelog should list both CVE IDs.</li>


<li>Restart every PHP process, including PHP-FPM or Apache, cron and Magento&#8217;s queue consumers. A process that wasn&#8217;t restarted still runs the old PHP.</li>


<li>On PHP 8.1 or older, get a backported build from your Linux distribution or LTS vendor, or build from the PHP team&#8217;s source backports for 7.4, 8.0 and 8.1, then plan the move to a supported branch.</li>


<li>Check for compromise before cleaning anything, and keep the logs. Look for unknown admin users, script tags in <code>core_config_data</code>, <code>cms_block</code> and <code>cms_page</code>, unexpected PHP files in <code>pub/media</code>, recently changed PHP files, and PHP processes that started shells, in logs from October 17 onward. A <a href="https://scandiweb.com/blog/magento-code-audit-by-certified-magento-developers/" target="_blank" rel="noopener">Magento code audit</a> is the thorough version.</li>


<li>Rotate payment gateway credentials, integration and API tokens, and database and admin passwords.</li>


<li>Test checkout end to end with every live payment method.</li>

</ol>



<h3 class="wp-block-heading">If you can&#8217;t patch PHP today</h3>



<p class="wp-block-paragraph"><a href="https://www.cisa.gov/news-events/alerts/2026/10/21/critical-vulnerabilities-php-require-immediate-patching" target="_blank" rel="noopener">CISA&#8217;s alert</a> says to take PHP systems offline until they&#8217;re patched, while Sansec&#8217;s view is that stores don&#8217;t need to go offline. If you keep the store up, PHP lists partial measures that &#8220;reduce exposure to specific attack paths but do not make an installation safe.&#8221; Set them in php.ini, the FPM pool or the server config, because <code>ini_set()</code> and <code>.user.ini</code> apply too late:</p>



<pre class="wp-block-code"><code>memory_limit = -1
post_max_size = 8M
session.upload_progress.enabled = 0
fatal_error_backtraces = 0</code></pre>



<p class="wp-block-paragraph">Set <code>memory_limit</code> where applications can&#8217;t override it, such as <code>php_admin_value</code> in the FPM pool, and add a container or cgroup memory cap, because one request can now take all of the server&#8217;s memory. If the site needs uploads, use 32M for <code>post_max_size</code> and keep <code>upload_max_filesize</code> below it. <code>fatal_error_backtraces</code> exists on PHP 8.5 only. Restart every worker afterward.</p>



<p class="wp-block-paragraph">Sansec&#8217;s other stopgap is blocking <code>multipart/form-data</code> requests at the web server, which breaks uploads, so test checkout afterward. Magento maintenance mode doesn&#8217;t help. A web application firewall gives interim cover: Cloudflare pushed rules for the known exploit vectors to every plan, including free ones. Remove each stopgap once PHP is updated, and put the memory limit back.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>The partial settings count only in php.ini, the FPM pool or the server config, and only after a restart. Set through <code>ini_set()</code> or <code>.user.ini</code>, they arrive after PHP has already parsed the request.</p></div>



<h2 class="wp-block-heading">How we handled PHP2Shell across our clients&#8217; stores</h2>



<p class="wp-block-paragraph">By 09:00 UTC on October 21, five hours before PHP published the fix, more than 40 of our client projects each had a critical-priority ticket. On one client&#8217;s own AWS setup, PHP 8.5.12 was running in production at 16:38 UTC, under three hours after the release. Every store went through the same steps in between: alert, ticket, temporary protection, patch, test and monitoring.</p>



<p class="wp-block-paragraph">PHP&#8217;s advance notice on October 20 gave us a day to prepare. At 08:23 UTC on October 21, our Executive Board emailed clients that the fix was due at 14:00 UTC and that a successful attack could take a site down, wipe data or leak customer data. The email also said, in these words: &#8220;This alert does not mean your store has been compromised. No attacks on our clients have been confirmed so far.&#8221;</p>



<p class="wp-block-paragraph">Each store then got a ticket from one template (what is happening, the hosting, the current PHP version, whether it gets the official fix, the other PHP systems in scope, how to verify) and an eight-hour plan:</p>



<ul class="wp-block-list">
<li>Preparation, 1.5 hours: review every PHP system in scope, back up code and database, write the rollback plan</li>


<li>Applying the fix, 2 hours: staging, then production, then the other PHP systems</li>


<li>Testing, 3.5 hours: confirm the flaw can no longer be exploited, run checkout with every live payment method, check that ERP, PIM, shipping, search and marketing integrations still sync, and smoke test the admin, order emails and scheduled jobs</li>


<li>Aftercare, 1 hour: 24 hours of production monitoring and a summary for the client</li>

</ul>



<p class="wp-block-paragraph">Before the fix was out, we applied temporary protections with no downtime: upload-progress tracking off, stricter session settings, and file uploads blocked before they reached PHP. One client&#8217;s PIM ran PHP 8.0, which gets no official fix, so we rebuilt PHP with the PHP team&#8217;s backport where no fixed package existed, kept a rollback copy on each server, and sent an estimate for a supported version. For Adobe Commerce cloud clients, we opened Adobe Support cases that morning and kept following up. For stores on other hosts, we asked each host for the fixed build and the date it went on. One client&#8217;s site went offline behind a redirect and came back once patched. September&#8217;s StyleSmuggler response has <a href="https://scandiweb.com/blog/rapid-response-to-stylesmuggler/" target="_blank" rel="noopener">its own write-up</a>.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-patch-replies-anonymized.png" alt="Anonymized client messages about taking the site offline, bringing it back live and confirming the patch worked" class="wp-image-26405" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-patch-replies-anonymized.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-patch-replies-anonymized-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-patch-replies-anonymized-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-patch-replies-anonymized-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-patch-replies-anonymized-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-patch-replies-anonymized-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-patch-replies-anonymized-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Client replies after the PHP2Shell patching (names removed)</figcaption></figure></div>



<h3 class="wp-block-heading">What clients told us</h3>



<p class="wp-block-paragraph">Most replies were about being told early. A beauty brand thanked us for being &#8220;so quick to react with the PHP vulnerabilities,&#8221; and a retailer on Adobe&#8217;s cloud wrote: &#8220;I just want to sincerely thank you for all your efforts in chasing this update.&#8221; Our Executive Board&#8217;s note to the team the next day drew the lesson: react fast, and keep clients informed before they have to start asking.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-email-replies-anonymized.png" alt="Anonymized client emails thanking the team for a quick reaction to the PHP vulnerabilities and the timely update" class="wp-image-26406" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-email-replies-anonymized.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-email-replies-anonymized-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-email-replies-anonymized-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-email-replies-anonymized-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-email-replies-anonymized-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-email-replies-anonymized-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-email-replies-anonymized-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Client email replies to our PHP2Shell alert (names removed)</figcaption></figure></div>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-chat-replies-anonymized.png" alt="Anonymized client chat messages thanking the team for chasing Adobe and for the early heads-up" class="wp-image-26407" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-chat-replies-anonymized.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-chat-replies-anonymized-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-chat-replies-anonymized-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-chat-replies-anonymized-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-chat-replies-anonymized-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-chat-replies-anonymized-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/php2shell-client-chat-replies-anonymized-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Client chat messages during the PHP2Shell response (names removed)</figcaption></figure></div>



<h2 class="wp-block-heading">How to prepare for the next critical PHP or Magento vulnerability</h2>



<p class="wp-block-paragraph">Preparing for the next critical vulnerability is work you do before the bulletin arrives: supported PHP on every system, a written answer to who patches what and how fast, a list of every PHP system you run, and a patch routine your team has practiced. Three critical flaws in seven weeks is the pace to plan for.</p>



<p class="wp-block-paragraph">Start with <a href="https://www.php.net/supported-versions.php" target="_blank" rel="noopener">PHP&#8217;s support calendar</a>:</p>



<figure class="wp-block-table"><table><thead><tr><th>PHP</th><th>Active support until</th><th>Security support until</th></tr></thead><tbody><tr><td>8.2</td><td>December 31, 2024</td><td><strong>December 31, 2026</strong></td></tr><tr><td>8.3</td><td>December 31, 2025</td><td>December 31, 2027</td></tr><tr><td>8.4</td><td>December 31, 2026</td><td>December 31, 2028</td></tr><tr><td>8.5</td><td>December 31, 2027</td><td>December 31, 2029</td></tr></tbody></table><figcaption class="wp-element-caption">PHP support dates (php.net, checked October 27, 2026)</figcaption></figure>



<p class="wp-block-paragraph">PHP 8.2 stops getting security fixes on December 31, 2026, and it is the newest PHP that Magento 2.4.6 supports. Then work through the rest:</p>



<ol class="wp-block-list">
<li>Keep every system on a supported PHP branch, including the ones nobody logs into often.</li>


<li>Write down who patches what: for each system, the owner (host, Adobe, agency or in-house team), the response time for a critical bulletin, and who covers nights and weekends, which a <a href="https://scandiweb.com/magento-support" target="_blank" rel="noopener">Magento support retainer</a> should spell out.</li>


<li>Keep a list of every PHP system. CISA warns that PHP &#8220;is often a component of other software and prevalence may not be directly observable,&#8221; and PIMs, blogs and internal tools are the ones that get forgotten.</li>


<li>Practice a same-day patch routine: backup, rollback plan, staging first, a scripted checkout test with every payment method, and a check that the exploit no longer works.</li>


<li>Put a web application firewall or CDN in front of the store, with skimmer and file-change monitoring behind it, so you would know if someone got in before the patch.</li>


<li>Write the messages in advance, for stakeholders and for customers. Our 08:23 UTC alert went out before the fix existed because the template already did.</li>


<li>Agree that security fixes override the Black Friday code freeze. An unpatched critical flaw is a bigger risk to peak-season revenue than the patch, and our <a href="https://scandiweb.com/blog/black-friday-code-freeze/" target="_blank" rel="noopener">code freeze guide</a> covers how to plan the exception.</li>


<li>Decide how many servers you want to patch yourself. <a href="https://scandiweb.com/services/magento-hosting" target="_blank" rel="noopener">Managed Magento hosting</a> or <a href="https://scandiweb.com/blog/adobe-commerce-as-a-cloud-service/" target="_blank" rel="noopener">Adobe Commerce as a Cloud Service</a> moves PHP updates to the provider, and you give up control over timing: on October 21, our client on its own AWS was patched within three hours, while cloud clients waited for Adobe&#8217;s rollout.</li>

</ol>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>A Magento 2.4.6 or 2.4.7 store on PHP 8.2 that patched this week has until December 31, 2026, before 8.2 stops getting fixes. Plan that PHP move now, so the next critical flaw doesn&#8217;t land on a branch with no fix.</p></div>



<h2 class="wp-block-heading">What CTOs, heads of eCommerce, and heads of marketing should each own</h2>



<p class="wp-block-paragraph">Security incidents tend to go wrong at the handoffs, when the host assumes the agency has it and the agency assumes the host patched. Give each role a short list before the next bulletin, so everyone knows what they own.</p>



<h3 class="wp-block-heading">For CTOs and technical leads</h3>



<ul class="wp-block-list">
<li>A runtime inventory with every PHP version and build on every server, kept current</li>


<li>An ownership matrix for patching, with a response time for critical bulletins</li>


<li>A test that proves the exploit no longer works, run after every patch</li>


<li>An end-of-life roadmap with a budget, since PHP 8.1 is already unsupported and 8.2 follows on December 31</li>


<li>Logs kept long enough to look back, since the first attempts came four days before disclosure</li>

</ul>



<h3 class="wp-block-heading">For heads of eCommerce</h3>



<ul class="wp-block-list">
<li>A checkout test list with every live payment method, plus the integrations to check after a patch</li>


<li>A maintenance page that returns a 503 status, so search engines treat a short outage as temporary</li>


<li>A code-freeze exception for security fixes, agreed before Black Friday</li>


<li>Host and vendor contracts that name a response time for critical bulletins</li>

</ul>



<h3 class="wp-block-heading">For heads of marketing</h3>



<ul class="wp-block-list">
<li>A tag inventory, because third-party scripts and tags are where card skimmers hide, and marketing owns most of them</li>


<li>A pre-approved holding statement, used only when there is something to tell customers</li>


<li>Campaigns you can pause within minutes if the store goes into maintenance</li>

</ul>



<h3 class="wp-block-heading">For store owners and CEOs</h3>



<p class="wp-block-paragraph">Five questions to ask your team or agency this week:</p>



<ol class="wp-block-list">
<li>Which PHP version and build date does each of our servers run today?</li>


<li>Who installed the fix on each one, and when? Do we have that in writing?</li>


<li>Which other PHP systems do we run, and who checked them?</li>


<li>What did we check for compromise, and which credentials did we rotate?</li>


<li>Who gets the next security bulletin first, and how fast do they act on it?</li>

</ol>



<p class="wp-block-paragraph">Take the answers to your insurer and your board before either asks. Then budget upgrades on a calendar instead of as emergencies: our <a href="https://scandiweb.com/blog/website-maintenance-cost/" target="_blank" rel="noopener">website maintenance cost guide</a> shows what planned support work includes, and a <a href="https://scandiweb.com/services/magento-tech-audit" target="_blank" rel="noopener">Magento technical audit</a> gives you the baseline.</p>



<h2 class="wp-block-heading">PHP2Shell FAQ</h2>



<h3 class="wp-block-heading">Is PHP2Shell being exploited?</h3>



<p class="wp-block-paragraph">Exploit attempts are confirmed. Amazon logged the first on October 17, Cloudflare counted millions after disclosure, and CISA added both CVEs to its Known Exploited Vulnerabilities catalog on October 26. Sansec expects mass exploitation to be less likely than it first thought, because the public exploits need specific conditions on the target server. As of October 27, 2026, no break-in at a specific store had been publicly confirmed.</p>



<h3 class="wp-block-heading">Do I need a Magento patch for PHP2Shell?</h3>



<p class="wp-block-paragraph">No. The flaw is in PHP, so the fix is updating PHP to 8.5.12, 8.4.27, 8.3.36 or 8.2.35 and restarting every PHP process. You still need Adobe&#8217;s October security update, APSB26-153, which fixes BlockStrap and other Magento flaws, but it does nothing for this one.</p>



<h3 class="wp-block-heading">Does Magento maintenance mode protect against PHP2Shell?</h3>



<p class="wp-block-paragraph">No. Magento handles maintenance mode, and PHP reads the request before Magento runs, which matches the PHP advisory&#8217;s warning that the attack can trigger before any application code. Sansec says the same of its own store-level Shield. Taking the server offline or blocking requests at the web server works, while maintenance mode leaves the server just as exposed.</p>



<h3 class="wp-block-heading">Is Shopify affected by PHP2Shell?</h3>



<p class="wp-block-paragraph">Shopify, BigCommerce and Adobe Commerce as a Cloud Service run and patch their own servers, so the store itself needs nothing from you. Anything you host separately still does: a WordPress blog, a PIM such as Pimcore or Akeneo, custom tools or middleware. Find out which PHP version each one runs, and get the same written confirmation you would ask of a host.</p>



<h3 class="wp-block-heading">What if my server runs PHP 8.1 or older?</h3>



<p class="wp-block-paragraph">PHP no longer releases updates for 8.1 and older, so there is no official fixed version. Linux distributions and LTS vendors received the patches in advance, and the PHP security team published source backports for 7.4, 8.0 and 8.1. Get a backported build, as we did for one client&#8217;s PIM on 8.0, then plan the upgrade. CISA&#8217;s advice for systems that can&#8217;t be patched is to take them offline.</p>



<h3 class="wp-block-heading">Does a web application firewall stop PHP2Shell?</h3>



<p class="wp-block-paragraph">A WAF buys time. Cloudflare deployed rules for the known exploit vectors to all its customers, including free plans, and CISA says a WAF may offer interim protection but is not a substitute for patching. It blocks the attack patterns it recognizes, and the flaw stays open behind it until PHP is updated.</p>



<h2 class="wp-block-heading">Check your PHP version before the next bulletin</h2>



<p class="wp-block-paragraph">PHP2Shell was fixed on October 21, 2026, and the fix only counts on servers where someone installed it, restarted every PHP process and confirmed the build. This week, find out which PHP version and build date each of your systems runs, the store, the PIM, the blog and anything else on PHP, and get the answer in writing from whoever owns each server. Anything below 8.5.12, 8.4.27, 8.3.36 or 8.2.35, or on 8.1 without a backport, goes through the steps above in order. Then use the weeks before Black Friday to fix the handoffs and put PHP 8.2&#8217;s December 31 deadline on the plan. StyleSmuggler, BlockStrap and PHP2Shell arrived within seven weeks of each other, so plan for the next one at the same pace.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Is PHP2Shell being exploited?", "acceptedAnswer": {"@type": "Answer", "text": "Exploit attempts are confirmed. Amazon logged the first on October 17, Cloudflare counted millions after disclosure, and CISA added both CVEs to its Known Exploited Vulnerabilities catalog on October 26. Sansec expects mass exploitation to be less likely than it first thought, because the public exploits need specific conditions on the target server. As of October 27, 2026, no break-in at a specific store had been publicly confirmed."}}, {"@type": "Question", "name": "Do I need a Magento patch for PHP2Shell?", "acceptedAnswer": {"@type": "Answer", "text": "No. The flaw is in PHP, so the fix is updating PHP to 8.5.12, 8.4.27, 8.3.36 or 8.2.35 and restarting every PHP process. You still need Adobe's October security update, APSB26-153, which fixes BlockStrap and other Magento flaws, but it does nothing for this one."}}, {"@type": "Question", "name": "Does Magento maintenance mode protect against PHP2Shell?", "acceptedAnswer": {"@type": "Answer", "text": "No. Magento handles maintenance mode, and PHP reads the request before Magento runs, which matches the PHP advisory's warning that the attack can trigger before any application code. Sansec says the same of its own store-level Shield. Taking the server offline or blocking requests at the web server works, while maintenance mode leaves the server just as exposed."}}, {"@type": "Question", "name": "Is Shopify affected by PHP2Shell?", "acceptedAnswer": {"@type": "Answer", "text": "Shopify, BigCommerce and Adobe Commerce as a Cloud Service run and patch their own servers, so the store itself needs nothing from you. Anything you host separately still does: a WordPress blog, a PIM such as Pimcore or Akeneo, custom tools or middleware. Find out which PHP version each one runs, and get the same written confirmation you would ask of a host."}}, {"@type": "Question", "name": "What if my server runs PHP 8.1 or older?", "acceptedAnswer": {"@type": "Answer", "text": "PHP no longer releases updates for 8.1 and older, so there is no official fixed version. Linux distributions and LTS vendors received the patches in advance, and the PHP security team published source backports for 7.4, 8.0 and 8.1. Get a backported build, as we did for one client's PIM on 8.0, then plan the upgrade. CISA's advice for systems that can't be patched is to take them offline."}}, {"@type": "Question", "name": "Does a web application firewall stop PHP2Shell?", "acceptedAnswer": {"@type": "Answer", "text": "A WAF buys time. Cloudflare deployed rules for the known exploit vectors to all its customers, including free plans, and CISA says a WAF may offer interim protection but is not a substitute for patching. It blocks the attack patterns it recognizes, and the flaw stays open behind it until PHP is updated."}}]}</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em>Send us a list of your systems and who hosts each one, and we&#x27;ll </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>check the PHP and patch status of all of them</em></a><em>, then tell you what we found and what to fix first.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/php2shell/">PHP2Shell: What the Critical PHP Vulnerability Means for Your Online Store</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Top Magento Agencies in Canada (2026)</title>
		<link>https://scandiweb.com/blog/top-magento-agencies-canada/</link>
		
		<dc:creator><![CDATA[Aigars Pavlovics]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 07:58:22 +0000</pubDate>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[adobe commerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[Magento Development]]></category>
		<category><![CDATA[Magento Enterprise]]></category>
		<category><![CDATA[Magento Services]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26358</guid>

					<description><![CDATA[<p>Looking for a Magento agency in Canada? Seven agencies with real Canadian offices, Adobe and Hyvä tiers checked, and questions to ask.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/top-magento-agencies-canada/">Top Magento Agencies in Canada (2026)</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-Ca4nW wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/services/magento-agency-canada" target=_blank >
        Magento Agency in Canada
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/adobe-commerce-magento" target=_blank >
        Adobe Commerce and Magento Development
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/hyva-themes" target=_blank >
        Hyvä Theme Development
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">Picking a Magento agency in Canada usually starts with two questions. Does it have an office in your time zone that you can visit, and is Magento its main platform or one more logo on its services page?</p>



<p class="wp-block-paragraph">We started from about 40 agencies that sell Magento work to Canadian merchants and kept seven. For each one we found the office on its own contact page, looked up its tier in Adobe&#8217;s and Hyvä&#8217;s directories, and read its Canadian case studies. Where a claim could not be checked, the entry says so.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Hyvä&#8217;s directory lists two agencies under Canada: Kinex Media (Silver) and TWO DEV (Bronze). Any other Hyvä badge on a Canadian agency&#8217;s site is either listed under another country or not listed at all.</p></div>



<h2 class="wp-block-heading">Top Magento agencies in Canada at a glance</h2>



<p class="wp-block-paragraph">The top Magento agencies in Canada are scandiweb, Valtech, MageMontreal, Kinex Media, TWO DEV, Northern, and Rootways. Each one has an office in Quebec or Ontario that you can find on its own contact page. They differ in partner tier, in how much of their work is Magento, and in whether they publish Canadian case studies with numbers.</p>



<figure class="wp-block-table"><table><thead><tr><th>#</th><th>Agency</th><th>Canadian office</th><th>Head office</th><th>Adobe tier</th><th>Hyvä tier (hyva.io)</th><th>Best for</th></tr></thead><tbody><tr><td>1</td><td>scandiweb</td><td>Montreal</td><td>Riga, Latvia</td><td>Gold (as stated), 894+ certifications</td><td>Platinum (not under Canada)</td><td>Enterprise and mid-market builds, Hyvä, upgrades, SEO</td></tr><tr><td>2</td><td>Valtech</td><td>Montreal, Toronto</td><td>Global consultancy</td><td>Platinum</td><td>Not listed</td><td>Headless Adobe Commerce for enterprise retail</td></tr><tr><td>3</td><td>MageMontreal</td><td>Sainte-Agathe-des-Monts, QC</td><td>Sainte-Agathe-des-Monts, QC</td><td>Silver</td><td>Not listed</td><td>Quebec B2B, SAP integration, rescues</td></tr><tr><td>4</td><td>Kinex Media</td><td>Mississauga, Toronto</td><td>Mississauga, ON</td><td>Silver</td><td>Silver (Canada)</td><td>Ontario B2B, Hyvä, ERP sync</td></tr><tr><td>5</td><td>TWO DEV</td><td>Montreal</td><td>Montreal, QC</td><td>Not listed</td><td>Bronze (Canada)</td><td>Quebec retail on Adobe Commerce with Akeneo</td></tr><tr><td>6</td><td>Northern</td><td>London ON, Toronto, Edmonton</td><td>London, ON</td><td>Gold</td><td>Not listed</td><td>Adobe Commerce with content and data work</td></tr><tr><td>7</td><td>Rootways</td><td>Mississauga</td><td>Mississauga, ON</td><td>Bronze (as stated by the agency)</td><td>Not listed</td><td>Smaller stores, Canadian shipping extensions</td></tr></tbody></table><figcaption class="wp-element-caption">Top Magento agencies in Canada compared by office, Adobe tier, and Hyvä tier</figcaption></figure>



<p class="wp-block-paragraph">Adobe tiers without a note come from Adobe&#8217;s directory (searched October 26, 2026). &#8220;As stated&#8221; means the tier appears only on the agency&#8217;s site, and &#8220;Not listed&#8221; means the search returned nothing. The Hyvä column shows the country each listing is filed under.</p>



<h2 class="wp-block-heading">How we chose these Magento agencies</h2>



<p class="wp-block-paragraph">We kept an agency when it passed four checks, in this order. An Adobe Commerce partner in Canada with a Platinum tier still fell off if Magento is a sideline or its only Canadian presence is a phone number.</p>



<ul class="wp-block-list">
<li>Magento comes first. Magento or Adobe Commerce leads the agency&#8217;s services, and its case studies show Magento builds.</li>


<li>A Canadian office on the agency&#8217;s own contact page. A Canadian phone number on a landing page did not count.</li>


<li>Named Canadian Magento work or a tier you can check. Canadian Magento clients, a tier in <a href="https://partners.adobe.com/s/directory/solution" target="_blank" rel="noopener">Adobe&#8217;s Solution Partner Directory</a>, a tier on <a href="https://www.hyva.io/find-an-agency" target="_blank" rel="noopener">Hyvä&#8217;s agency finder</a>, or a mix.</li>


<li>A support plan. Adobe Commerce 2.4.6 left support on August 11, 2026, and every later version has a fixed end date, so someone has to own upgrades after launch.</li>

</ul>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-shortlist-checks.png" alt="Funnel showing four checks that cut about 40 Canadian Magento agencies down to seven" class="wp-image-26353" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-shortlist-checks.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-shortlist-checks-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-shortlist-checks-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-shortlist-checks-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-shortlist-checks-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-shortlist-checks-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-shortlist-checks-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">How about 40 Canadian Magento agencies became a shortlist of seven</figcaption></figure></div>



<p class="wp-block-paragraph">Most of the 40 fell at the first two checks: Shopify-first studios that keep a Magento page for older clients, general web agencies that list Magento next to WordPress, and offshore firms with a Canadian phone number and no Canadian address. Two well-known names no longer exist as brands: Valtech bought Absolunet in January 2022, and Bounteous absorbed Demac Media in 2018. For agencies outside the country, see our list of <a href="https://scandiweb.com/blog/top-magento-development-companies/" target="_blank" rel="noopener">global Magento development companies</a>. Our lists for <a href="https://scandiweb.com/blog/top-magento-agencies-uk/">the UK</a> and <a href="https://scandiweb.com/blog/top-magento-agencies-australia/">Australia</a> apply the same checks to other markets.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Open the contact page before the case studies. If the only Canadian detail there is a phone number, ask which office your account will be run from.</p></div>



<h2 class="wp-block-heading">The 7 best Magento agencies in Canada, profiled</h2>



<p class="wp-block-paragraph">The seven profiles below are in the order we would shortlist them for a mid-market or enterprise Magento store. Each ends with the type of merchant the agency fits best.</p>



<h3 class="wp-block-heading">1. scandiweb</h3>



<p class="wp-block-paragraph">scandiweb is the world&#8217;s most certified Adobe Commerce agency, with 894+ Adobe certifications, Adobe Gold Solution Partner status, and Hyvä Platinum Partner status. It has been an Adobe partner since 2009 and has delivered 2,100+ projects since 2003 for 700+ clients, who rate it at 95 NPS. scandiweb is certified to ISO 9001, ISO 27001, and ISO 27017 and is PCI DSS compliant. Its Hyvä listing is filed under another country on hyva.io, so you will not find it in the Canada section.</p>



<p class="wp-block-paragraph">In Canada, scandiweb works from a Montreal office. Michael Bliah, VP North America, is based there and is the named contact for Canadian clients, and the Canada team works on Eastern Time. Developers come from the wider certified team, so backend, frontend, and integration work can run at the same time. Our <a href="https://scandiweb.com/services/magento-agency-canada" target="_blank" rel="noopener">Canada page</a> explains how the team works with Canadian merchants.</p>



<p class="wp-block-paragraph">Canadian clients named publicly include JYSK Canada and Moose Knuckles, the Canadian outerwear brand. The published Canadian number is PUMA&#8217;s: scandiweb&#8217;s SEO program grew <a href="https://scandiweb.com/blog/enterprise-seo-case-study-how-puma-grew-organic-revenue-in-4-markets/" target="_blank" rel="noopener">PUMA&#8217;s organic revenue in Canada</a> by 73.98% year over year. JYSK&#8217;s Hyvä rebuild is covered in our <a href="https://scandiweb.com/blog/hyva-case-studies-impressive-cwv-pagespeed-scores/" target="_blank" rel="noopener">Hyvä case studies</a>.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1200" height="162" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/certification-badges-strip-hyva-adobe-google-iso-3.png" alt="Adobe, Hyvä, Google, and ISO partner and certification badges held by scandiweb" class="wp-image-26354" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/certification-badges-strip-hyva-adobe-google-iso-3.png 1200w, https://scandiweb.com/blog/wp-content/uploads/2026/10/certification-badges-strip-hyva-adobe-google-iso-3-300x41.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/certification-badges-strip-hyva-adobe-google-iso-3-1024x138.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/certification-badges-strip-hyva-adobe-google-iso-3-150x20.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/certification-badges-strip-hyva-adobe-google-iso-3-768x104.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">scandiweb&#x27;s Adobe, Hyvä, and ISO credentials in one row</figcaption></figure></div>



<p class="wp-block-paragraph">Best for: mid-market and enterprise brands that want the deepest certified bench with a Montreal contact, for <a href="https://scandiweb.com/services/hyva-themes" target="_blank" rel="noopener">Hyvä builds</a>, upgrades, and SEO run alongside development.</p>



<h3 class="wp-block-heading">2. Valtech</h3>



<p class="wp-block-paragraph">Valtech is a global multi-platform consultancy with Canadian offices in Montreal, at 7236 Waverly Street, and Toronto, at 100 University Avenue. In January 2022 it bought Absolunet, the Montreal commerce consultancy with about 300 staff, so Absolunet no longer exists as a brand. Adobe&#8217;s directory lists Valtech as a Platinum Solution Partner. It is not on hyva.io, and it also works on Salesforce, commercetools, SAP, and Shopify.</p>



<p class="wp-block-paragraph">Its strongest Canadian Magento case is Structube, the Montreal furniture retailer with 70+ stores, built as headless Adobe Commerce. Valtech reports a 38% increase in pages viewed per session, a 35% increase in mobile conversion rate, and a 13% increase in desktop conversion rate. For Fountain Tire it built Adobe Commerce with Edge Delivery Services, with the B2B catalog first and B2C after it. We did not find a dedicated support offer on its pages, so ask how support is staffed after launch.</p>



<p class="wp-block-paragraph">Best for: enterprise Canadian retailers that want headless Adobe Commerce and the wider Adobe stack from one global consultancy.</p>



<h3 class="wp-block-heading">3. MageMontreal</h3>



<p class="wp-block-paragraph">Despite the name, MageMontreal works from Sainte-Agathe-des-Monts, Quebec, about 100 km north of Montreal. It says it has 19+ years of experience. Adobe&#8217;s directory lists it as a Silver Solution Partner working exclusively on Magento, though its own site now also markets Shopify, BigCommerce, and WooCommerce. It is not on hyva.io.</p>



<p class="wp-block-paragraph">Its Quebec Magento cases come with numbers. For Biron, the Quebec sleep-health and medical equipment company, a Magento 2 rebuild is credited with revenue up 205% from 2024 to 2025. Momo Sports moved to Adobe Commerce Cloud in a Magento 2 rebuild and reports over 300% more sessions. FLB Solution, a Quebec food distributor, had an inherited Magento store rescued with PIM and ERP integration and reports a 35% higher average order value. MageMontreal also sells a dedicated maintenance and improvement service.</p>



<p class="wp-block-paragraph">Best for: Quebec mid-market and B2B merchants that need Magento with SAP integration, a rescue of an inherited store, or an improvement retainer.</p>



<h3 class="wp-block-heading">4. Kinex Media</h3>



<p class="wp-block-paragraph">Kinex Media has its head office in Mississauga at 25 Watline Avenue, a Toronto office at 250 University Avenue, and has been in business since 2008. Adobe&#8217;s directory lists it as a Silver Solution Partner, and hyva.io lists it as Hyvä Silver, the highest Hyvä tier under Canada. It is a full-service agency, and many of its case studies are WordPress builds, but Magento 2, Adobe Commerce, migration, support, and Hyvä each have their own service page.</p>



<p class="wp-block-paragraph">Its best Magento case is Ontario Medical Supply, a client since 2013, for which it built a B2B ordering portal on Adobe Commerce 2.4.7 B2B integrated with Pronto ERP. Kinex reports that 100% of online orders transfer to Pronto automatically, that orders reach the ERP about 10 to 20 seconds after checkout, and that the mobile usability score rose from 54 to 93.</p>



<p class="wp-block-paragraph">Best for: Ontario B2B and B2C brands that want a Hyvä frontend or Adobe Commerce B2B with ERP sync, plus design and marketing from one team.</p>



<h3 class="wp-block-heading">5. TWO DEV</h3>



<p class="wp-block-paragraph">TWO DEV works from 4000 Saint-Ambroise in Montreal and calls itself an &#8220;Alternative eCommerce Agency&#8221; built on Adobe Commerce and Akeneo PIM. Every case study on its site is Magento or Adobe Commerce. We found no entry for it in Adobe&#8217;s directory, so its Adobe tier is not listed. On hyva.io it is Hyvä Bronze under Canada.</p>



<p class="wp-block-paragraph">Its Quebec projects are mostly migrations. For Avril Supermarché Santé, the Quebec health-food chain, it moved the store from Magento 1 to Adobe Commerce with a PWA, SAP, and click and collect, and says the full migration took nine months. For SHAN, the Canadian haute-couture brand, it migrated Magento 1 to 2 with Cegid, Mirakl, and a Canada Post integration. For Bicycles Quilicot, the Montreal bike store founded in 1915, it took over maintenance first and then rebuilt the store on Magento 2 with Lightspeed and Akeneo. None publishes metrics, so ask for numbers. Its site promises the team is available 24/7, all year.</p>



<p class="wp-block-paragraph">Best for: Quebec retailers on Adobe Commerce with Akeneo PIM who want a small senior team and round-the-clock support.</p>



<h3 class="wp-block-heading">6. Northern</h3>



<p class="wp-block-paragraph">Northern, formerly Northern Commerce, has its head office in London, Ontario, with offices in Toronto and Edmonton. Adobe&#8217;s directory lists it as a Gold Solution Partner. It is not on hyva.io. The agency now positions itself around content, data, and operations, so Magento is one practice among several.</p>



<p class="wp-block-paragraph">Its published Magento 2 case is Andrew Peller, the Canadian winery group, for which Northern reports a 132% increase in mobile revenue and a 28% increase in conversion rate. We could not confirm a support offer on its site, so ask what the support model looks like.</p>



<p class="wp-block-paragraph">Best for: Canadian brands that want Adobe Commerce alongside content and data work from one Ontario team.</p>



<h3 class="wp-block-heading">7. Rootways</h3>



<p class="wp-block-paragraph">Rootways works from 2970 Drew Road in Mississauga and has done Magento-led development and support since 2010. It describes itself as an Adobe Bronze Solution Partner, a tier we could not find in Adobe&#8217;s directory, so treat it as stated by the agency. It is not on hyva.io.</p>



<p class="wp-block-paragraph">It sells its own Magento extensions for Canada Post, Purolator, and Day &amp; Ross shipping. Its portfolio includes Canadian Magento stores such as Dimar Canada, a B2B store on Magento 2, Firearms Outlet Canada, and The Pacific Smoke, with no published metrics.</p>



<p class="wp-block-paragraph">Best for: smaller Canadian Magento stores that need Canadian shipping extensions and affordable support.</p>



<p class="wp-block-paragraph">Two more names deserve a line. Novatize in Quebec City, an Adobe Silver partner, built a Magento 2 B2B platform for Groupe LD but now leads with Shopify Plus. Bounteous, an Adobe Platinum partner, absorbed Demac Media in 2018, but we found no current Canadian Adobe Commerce case on its site.</p>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Ask every agency who your Canadian contact will be and which hours the delivery team overlaps with Eastern Time.</p></div>



<h2 class="wp-block-heading">Magento agencies in Montreal, Toronto, and the rest of Canada</h2>



<p class="wp-block-paragraph">Six of the seven agencies have an office in Montreal or the Greater Toronto Area. Montreal has scandiweb, Valtech, and TWO DEV, with MageMontreal about 100 km north. The GTA has Valtech, Kinex Media, Rootways, and Northern&#8217;s Toronto office. The rest of Canada is served remotely from those two regions, plus Northern&#8217;s offices in London, Ontario and Edmonton.</p>



<h3 class="wp-block-heading">Montreal and Quebec</h3>



<p class="wp-block-paragraph">Four of the seven are in or near Montreal. scandiweb&#8217;s Montreal office is the base for its VP North America, Valtech is on Waverly Street, and TWO DEV is on Saint-Ambroise. A workshop with MageMontreal means a drive to Sainte-Agathe-des-Monts. If you need a Magento agency in Montreal with Quebec case studies, Valtech, TWO DEV, and MageMontreal all publish them.</p>



<h3 class="wp-block-heading">Toronto and the GTA</h3>



<p class="wp-block-paragraph">For Magento developers in Toronto or Magento website development in Mississauga, there are four agencies with offices: Valtech and Kinex Media on University Avenue, Kinex&#8217;s head office and Rootways in Mississauga, and Northern&#8217;s Toronto office. scandiweb has no Toronto office and serves the GTA from Montreal on the same Eastern Time, as our <a href="https://scandiweb.com/services/magento-agency-canada/toronto" target="_blank" rel="noopener">Magento agency in Toronto</a> page explains.</p>



<h3 class="wp-block-heading">Elsewhere in Canada</h3>



<p class="wp-block-paragraph">Northern is the only agency on this list with offices outside Quebec and the GTA, in London, Ontario and Edmonton. None of the seven has a Vancouver or Calgary office, so a Magento developer in Calgary or Vancouver on this list means working remotely with an Ontario or Quebec team.</p>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agencies-canada-office-map.png" alt="Diagram of Canadian cities from west to east with the Magento agencies that have offices in each" class="wp-image-26355" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agencies-canada-office-map.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agencies-canada-office-map-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agencies-canada-office-map-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agencies-canada-office-map-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agencies-canada-office-map-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agencies-canada-office-map-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agencies-canada-office-map-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">Where the seven agencies on this list have Canadian offices</figcaption></figure></div>



<h2 class="wp-block-heading">What a Magento agency in Canada should handle</h2>



<p class="wp-block-paragraph">A Canadian Magento agency should handle six things a US or European build does not, and raise them before you do: French for Quebec, sales tax by province, Law 25 consent, AODA accessibility, Canadian payment gateways, and Canadian carriers. Statistics Canada puts retail eCommerce sales at $5.6 billion in August 2026, 7.6% of total retail trade, seasonally adjusted, according to its <a href="https://www150.statcan.gc.ca/n1/daily-quotidien/261023/dq261023a-eng.htm" target="_blank" rel="noopener">Retail trade, August 2026</a> release.</p>



<ul class="wp-block-list">
<li>French in Quebec. Under the Charter of the French Language as amended by Bill 96, commercial websites must be available at least in French, with no other language more prominent, since June 1, 2022. Online terms must be provided in French first since June 1, 2023, and new product-labeling rules for trademarks started June 1, 2025, with a sell-through period for older stock to June 1, 2027, according to the <a href="https://www.oqlf.gouv.qc.ca/francisation/entreprises/Aide_memoire_FaireDesAffaires.pdf" target="_blank" rel="noopener">OQLF</a>. In Magento that means a French store view, French checkout emails, and French terms rather than a translated banner.</li>


<li>Sales tax by province. GST is 5% in Alberta, BC, Manitoba, Quebec, Saskatchewan, and the territories. HST is 13% in Ontario, 15% in New Brunswick, Newfoundland and Labrador, and PEI, and 14% in Nova Scotia since April 1, 2025. On top of GST, BC charges 7% PST, Saskatchewan 6% PST, Manitoba 7% RST, and Quebec 9.975% QST, per the <a href="https://www.canada.ca/en/revenue-agency/services/tax/businesses/topics/gst-hst-businesses/charge-collect-which-rate/calculator.html" target="_blank" rel="noopener">Canada Revenue Agency</a>. Ask to see a test order into each province.</li>


<li>Privacy. Quebec&#8217;s Law 25 phased in from September 22, 2022 to September 22, 2024. Since September 2023, consent must be explicit for each purpose, tracking and profiling tools must be off by default, and penalties reach $10 million or 2% of worldwide turnover, according to the <a href="https://www.cai.gouv.qc.ca/protection-renseignements-personnels/sujets-et-domaines-dinteret/principaux-changements-loi-25" target="_blank" rel="noopener">Commission d&#8217;accès à l&#8217;information</a>. This changes how analytics, pixels, and personalization load on a Quebec storefront.</li>


<li>Accessibility. In Ontario, businesses with 50+ employees must meet WCAG 2.0 Level AA on public websites under the AODA, and organizations with 20+ employees file their next accessibility compliance report by December 31, 2026, per the <a href="https://www.ontario.ca/page/how-make-websites-accessible" target="_blank" rel="noopener">Government of Ontario</a>.</li>


<li>Payments. Interac Online has been discontinued in favor of Interac Debit for online payments and the Konek wallet, and PayBright is now Affirm. Moneris and Worldline (formerly Bambora) are common gateways. Ask which module the agency uses for each and who maintains it.</li>


<li>Shipping. Canada Post and Purolator both offer developer APIs, and their Magento modules come from third parties rather than the carriers. Ask which module the agency uses and who updates it when the carrier API changes.</li>

</ul>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Ask for a French store view the agency has launched and a Quebec cookie banner it has built. Tracking and profiling tools on a Quebec store must be off by default.</p></div>



<h2 class="wp-block-heading">How to choose a Magento agency in Canada</h2>



<p class="wp-block-paragraph">Choose a local Magento specialist when your store serves Canada with one main workstream and an ERP that already works. Choose a larger certified Adobe Commerce partner when several workstreams run at once, when you sell outside Canada too, or when one developer leaving would stop your launch.</p>



<p class="wp-block-paragraph">Choose a local Magento specialist if:</p>



<ul class="wp-block-list">
<li>You run one Canadian store, with English and French store views at most</li>


<li>The project has one main workstream, such as a Hyvä rebuild or a 2.4.x upgrade</li>


<li>Your ERP or PIM is already connected and stable</li>


<li>You want the same people in every meeting and a short drive to the office</li>


<li>Your budget fits a small team better than an enterprise program</li>

</ul>



<p class="wp-block-paragraph">Choose a larger certified Adobe Commerce partner if:</p>



<ul class="wp-block-list">
<li>You need backend, frontend, integrations, and SEO running at the same time</li>


<li>You sell in the US or Europe as well as Canada and want one instance for all of it</li>


<li>A developer leaving or on vacation cannot delay your launch</li>


<li>You want tiers and certifications you can check in Adobe&#8217;s and Hyvä&#8217;s directories</li>


<li>You need support cover for incidents outside Eastern Time business hours</li>

</ul>



<div class="wp-block-image aligncenter size-large"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" loading="lazy" width="1672" height="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-specialist-vs-certified-partner.png" alt="Side-by-side comparison of choosing a local Magento specialist or a larger certified Adobe Commerce partner in Canada" class="wp-image-26356" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-specialist-vs-certified-partner.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-specialist-vs-certified-partner-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-specialist-vs-certified-partner-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-specialist-vs-certified-partner-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-specialist-vs-certified-partner-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-specialist-vs-certified-partner-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-agency-canada-specialist-vs-certified-partner-1600x900.png 1600w" sizes="auto, (max-width: 1672px) 100vw, 1672px" /><figcaption style="display:block;position:static;background:none;color:inherit;width:auto;padding:8px 0 0;margin:0.5em 0 1em;font-size:14px;text-align:center;max-height:none;">When a local Magento specialist fits and when a larger certified partner does</figcaption></figure></div>



<p class="wp-block-paragraph">If the answer depends on what your ERP and PIM should do after launch, we can <a href="https://scandiweb.com/services/enterprise-architecture" target="_blank" rel="noopener">map your target architecture</a> first, so every agency quotes against the same picture.</p>



<h2 class="wp-block-heading">Questions to ask before you sign</h2>



<p class="wp-block-paragraph">A Magento development company in Canada that has done this before will answer these on the first call, with links.</p>



<ul class="wp-block-list">
<li>Which Adobe Solution Partner tier do you hold, and can you send the directory link?</li>


<li>What is your Hyvä tier, and which country is it listed under on hyva.io?</li>


<li>Which office will run our account, and which hours does the delivery team overlap with Eastern Time?</li>


<li>Which French storefronts have you launched for Quebec, and can we see one live?</li>


<li>How will you set up GST, HST, PST, RST, and QST, and can we see a test order into each province?</li>


<li>How do you handle Law 25 consent, and what loads before the shopper accepts cookies?</li>


<li>Which Adobe Commerce version will we run? Under <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/release/planning/lifecycle-policy" target="_blank" rel="noopener">Adobe&#8217;s lifecycle policy</a>, 2.4.7 leaves support on May 31, 2027, 2.4.8 on May 31, 2028, and 2.4.9 on May 31, 2029.</li>


<li>Who owns the code, the repository, and the hosting account when the contract ends?</li>

</ul>



<style>  .box-new {    background-color: #f8f4ef;    padding: 20px 30px 30px 30px; /* top, right, bottom, left */    border: none;  }  .box-new p {    margin-top: 0;    margin-bottom: 1em;  }  .box-new p:last-child {    margin-bottom: 0;  }</style><div class="box-new">  <p><strong>🚀 Quick takeaway</strong></p>  <p>Write the Adobe Commerce version into the contract. A store built today on 2.4.7 needs an upgrade before May 31, 2027, and the agency that builds it should quote that upgrade now.</p></div>



<h2 class="wp-block-heading">What does Magento development in Canada cost?</h2>



<p class="wp-block-paragraph">Magento development in Canada is priced in three ways: fixed quotes for builds, migrations, and Hyvä projects, monthly retainers for support, and hourly or daily rates for open-ended work. The drivers that move a Canadian quote most are a French store view, ERP or PIM integration, B2B features, provincial tax setup, and the Adobe Commerce license. Send the same scope to three agencies. The one that itemizes the French store view and the tax setup has probably done it before. Our <a href="https://scandiweb.com/blog/magento-pricing/" target="_blank" rel="noopener">Magento pricing guide</a> covers license, build, and support costs in detail.</p>



<h2 class="wp-block-heading">Frequently asked questions about Magento agencies in Canada</h2>



<h3 class="wp-block-heading">What are the best Magento agencies in Canada?</h3>



<p class="wp-block-paragraph">The strongest picks with a Canadian office you can check are scandiweb, Valtech, MageMontreal, Kinex Media, TWO DEV, Northern, and Rootways. scandiweb leads on certifications and Hyvä, Valtech on headless enterprise builds, MageMontreal and TWO DEV on Quebec work, and Kinex Media on Ontario B2B with the only Hyvä Silver tier in Canada.</p>



<h3 class="wp-block-heading">How much does Magento development in Canada cost?</h3>



<p class="wp-block-paragraph">It depends on the scope. Canadian agencies quote fixed prices for builds, migrations, and Hyvä projects, monthly retainers for support, and hourly or daily rates for ongoing work. Send every agency the same written brief so the quotes compare like for like.</p>



<h3 class="wp-block-heading">Which Canadian agencies are Hyvä partners?</h3>



<p class="wp-block-paragraph">Hyvä&#8217;s directory lists two agencies under Canada: Kinex Media at Silver and TWO DEV at Bronze. Larger Hyvä partners serve Canadian stores from elsewhere. scandiweb, for example, is a Hyvä Platinum Partner with a Montreal office, but its hyva.io listing is filed under another country. Ask any agency which country its listing shows before you count the badge.</p>



<h3 class="wp-block-heading">Does my Magento store need a French version for Quebec?</h3>



<p class="wp-block-paragraph">Yes, if you sell to consumers in Quebec. Since June 1, 2022, commercial websites must be available at least in French under the Charter of the French Language, and since June 1, 2023, online terms must be provided in French first. In Magento, that means a French store view with French checkout emails and French terms.</p>



<h3 class="wp-block-heading">Do I need a Magento agency with an office in Canada?</h3>



<p class="wp-block-paragraph">Not always, because most development runs remotely. A Canadian office helps with Eastern Time overlap, in-person workshops, and Quebec language and privacy questions. Ask for a named Canadian contact and the hours the delivery team overlaps with yours.</p>



<h3 class="wp-block-heading">What is the difference between a Magento agency and an Adobe Commerce agency?</h3>



<p class="wp-block-paragraph">The skills are the same. Adobe Commerce is the licensed edition of Magento and Magento Open Source is the free one, both built on the same codebase, so an agency that works on one works on the other. Our guide to <a href="https://scandiweb.com/blog/adobe-commerce-vs-magento-open-source/" target="_blank" rel="noopener">Magento Open Source vs Adobe Commerce</a> explains the trade-offs.</p>



<h2 class="wp-block-heading">Choosing from the top Magento agencies in Canada</h2>



<p class="wp-block-paragraph">The top Magento agencies in Canada fit different stores. scandiweb fits brands that want the deepest certified bench and Hyvä with a Montreal contact, and Valtech fits enterprise retailers on headless Adobe Commerce. MageMontreal and TWO DEV fit Quebec merchants with SAP or Akeneo, Kinex Media fits Ontario B2B with a Hyvä frontend, Northern fits brands that want content and data work, and Rootways fits smaller stores that need Canadian shipping extensions. Pick three, send them the same brief, and check every tier yourself. If you also sell in the UK, our list of <a href="https://scandiweb.com/blog/top-magento-agencies-uk/" target="_blank" rel="noopener">Magento agencies in the UK</a> covers that market the same way.</p>



<script type="application/ld+json">
{
 "@context": "https://schema.org",
 "@type": "FAQPage",
 "mainEntity": [
  {
   "@type": "Question",
   "name": "What are the best Magento agencies in Canada?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "The strongest picks with a Canadian office you can check are scandiweb, Valtech, MageMontreal, Kinex Media, TWO DEV, Northern, and Rootways. scandiweb leads on certifications and Hyvä, Valtech on headless enterprise builds, MageMontreal and TWO DEV on Quebec work, and Kinex Media on Ontario B2B with the only Hyvä Silver tier in Canada."
   }
  },
  {
   "@type": "Question",
   "name": "How much does Magento development in Canada cost?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "It depends on the scope. Canadian agencies quote fixed prices for builds, migrations, and Hyvä projects, monthly retainers for support, and hourly or daily rates for ongoing work. Send every agency the same written brief so the quotes compare like for like."
   }
  },
  {
   "@type": "Question",
   "name": "Which Canadian agencies are Hyvä partners?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "Hyvä's directory lists two agencies under Canada: Kinex Media at Silver and TWO DEV at Bronze. Larger Hyvä partners serve Canadian stores from elsewhere. scandiweb, for example, is a Hyvä Platinum Partner with a Montreal office, but its hyva.io listing is filed under another country. Ask any agency which country its listing shows before you count the badge."
   }
  },
  {
   "@type": "Question",
   "name": "Does my Magento store need a French version for Quebec?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "Yes, if you sell to consumers in Quebec. Since June 1, 2022, commercial websites must be available at least in French under the Charter of the French Language, and since June 1, 2023, online terms must be provided in French first. In Magento, that means a French store view with French checkout emails and French terms."
   }
  },
  {
   "@type": "Question",
   "name": "Do I need a Magento agency with an office in Canada?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "Not always, because most development runs remotely. A Canadian office helps with Eastern Time overlap, in-person workshops, and Quebec language and privacy questions. Ask for a named Canadian contact and the hours the delivery team overlaps with yours."
   }
  },
  {
   "@type": "Question",
   "name": "What is the difference between a Magento agency and an Adobe Commerce agency?",
   "acceptedAnswer": {
    "@type": "Answer",
    "text": "The skills are the same. Adobe Commerce is the licensed edition of Magento and Magento Open Source is the free one, both built on the same codebase, so an agency that works on one works on the other. Our guide to Magento Open Source vs Adobe Commerce explains the trade-offs."
   }
  }
 ]
}
</script>
<script type="application/ld+json">
{
 "@context": "https://schema.org",
 "@type": "ItemList",
 "name": "Top Magento agencies in Canada",
 "itemListOrder": "https://schema.org/ItemListOrderAscending",
 "numberOfItems": 7,
 "itemListElement": [
  {
   "@type": "ListItem",
   "position": 1,
   "item": {
    "@type": "Organization",
    "name": "scandiweb",
    "url": "https://scandiweb.com/"
   }
  },
  {
   "@type": "ListItem",
   "position": 2,
   "item": {
    "@type": "Organization",
    "name": "Valtech",
    "url": "https://www.valtech.com/en-ca/"
   }
  },
  {
   "@type": "ListItem",
   "position": 3,
   "item": {
    "@type": "Organization",
    "name": "MageMontreal",
    "url": "https://magemontreal.com/"
   }
  },
  {
   "@type": "ListItem",
   "position": 4,
   "item": {
    "@type": "Organization",
    "name": "Kinex Media",
    "url": "https://www.kinexmedia.com/"
   }
  },
  {
   "@type": "ListItem",
   "position": 5,
   "item": {
    "@type": "Organization",
    "name": "TWO DEV",
    "url": "https://twodev.com/en/"
   }
  },
  {
   "@type": "ListItem",
   "position": 6,
   "item": {
    "@type": "Organization",
    "name": "Northern",
    "url": "https://www.northern.co/"
   }
  },
  {
   "@type": "ListItem",
   "position": 7,
   "item": {
    "@type": "Organization",
    "name": "Rootways",
    "url": "https://www.rootways.com/"
   }
  }
 ]
}
</script>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<p><style> p.box { border: 1px solid black; padding-top: 30px; padding-right: 30px; padding-bottom: 30px; padding-left: 30px; } </style> <p class="box"><em> </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>Talk to our Montreal team</em></a><em> about your shortlist, and a Magento lead will tell you which agency fits your store, including when that is another name on this list.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/top-magento-agencies-canada/">Top Magento Agencies in Canada (2026)</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Object Caching 27/232 objects using Redis
Page Caching using Disk: Enhanced 

Served from: scandiweb.com @ 2026-10-30 15:44:41 by W3 Total Cache
-->