<?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>Rolands Jermolajevs &#8211; scandiweb</title>
	<atom:link href="https://scandiweb.com/blog/author/rolands-jermolajevs/feed/" rel="self" type="application/rss+xml" />
	<link>https://scandiweb.com/blog</link>
	<description>Success Stories &#124; scandiweb blog</description>
	<lastBuildDate>Thu, 05 Nov 2026 12:54:36 +0000</lastBuildDate>
	<language>en-US</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>Rolands Jermolajevs &#8211; scandiweb</title>
	<link>https://scandiweb.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>AI Agents for eCommerce: What They Do and Which Ones Store Teams Use</title>
		<link>https://scandiweb.com/blog/ai-agents-for-ecommerce/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 20:09:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Collection]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[agentic]]></category>
		<category><![CDATA[AI agents]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[Shopify]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26752</guid>

					<description><![CDATA[<p>AI agents for eCommerce grouped by job: support, shopping, marketing, catalog and store changes, with platforms and prices checked November 2026.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/ai-agents-for-ecommerce/">AI Agents for eCommerce: What They Do and Which Ones Store Teams Use</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-aiecm wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/services/ai" target=_blank >
        AI Strategy Consulting
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/services/ai-chatbot-development" target=_blank >
        Conversational Commerce
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/ecommerce-support-services" target=_blank >
        eCommerce Support Services
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">AI agents for eCommerce now arrive with the platform itself: Shopify and BigCommerce both include an AI assistant in the store admin at no extra cost, and both apply a change only after someone on your team approves it. An AI agent is software that carries out a task in your store after you ask, such as answering a customer or updating an order.</p>



<p class="wp-block-paragraph">That leaves a store team with two decisions: which jobs to hand to an agent, and which agent fits each job on your platform. The job sets the access: an agent that answers a shopper&#8217;s question reads your catalog, while one that edits your theme changes your code, and each needs its own review step. Every price and platform list here was read on the vendor&#8217;s own site on November 2, 2026.</p>



<h2 class="wp-block-heading">What AI agents for eCommerce do for a store team</h2>



<p class="wp-block-paragraph">AI agents for eCommerce are software a store team gives a task in plain words, and the agent carries it out in the store&#8217;s systems. They answer customers, help shoppers choose, build campaigns, write catalog content and make store changes. Each job needs different access, from reading orders to editing the theme, so choose agents by job.</p>



<p class="wp-block-paragraph">Agents that buy for shoppers are covered in our guide to <a href="https://scandiweb.com/blog/agentic-commerce-explained/" target="_blank" rel="noopener">agentic commerce</a>, and companies that build custom agents in our list of <a href="https://scandiweb.com/blog/best-ai-agent-development-companies/" target="_blank" rel="noopener">AI agent development companies</a>. The table lists the eleven eCommerce AI agents below by job, with the platforms each one runs on.</p>



<figure class="wp-block-table"><table><thead><tr><th>#</th><th>Agent</th><th>Vendor</th><th>Job</th><th>Platforms</th><th>Price</th></tr></thead><tbody><tr><td>1</td><td>Fin</td><td>Intercom</td><td>Customer service</td><td>Intercom or another helpdesk, a Shopify app, other systems by API</td><td>$0.99 per outcome</td></tr><tr><td>2</td><td>AI Agent</td><td>Gorgias</td><td>Customer service, shopper chat</td><td>Shopify, BigCommerce, Magento, WooCommerce</td><td>$0.90 to $1.00 per automated interaction, plus a helpdesk plan</td></tr><tr><td>3</td><td>Shopify Inbox</td><td>Shopify</td><td>Shopping assistant</td><td>Shopify</td><td>Free</td></tr><tr><td>4</td><td>Shopper Agent (Agentforce Commerce)</td><td>Salesforce</td><td>Shopping assistant, checkout in chat</td><td>Salesforce Commerce Cloud</td><td>Agentforce list price $2 per conversation</td></tr><tr><td>5</td><td>Composer</td><td>Klaviyo</td><td>Marketing campaigns, flows, segments</td><td>Klaviyo (connects to Shopify, BigCommerce, Adobe Commerce, Salesforce Commerce Cloud and more)</td><td>Free and paid access</td></tr><tr><td>6</td><td>Merchant Agent (Agentforce Commerce)</td><td>Salesforce</td><td>Catalog and merchandising</td><td>Salesforce Commerce Cloud</td><td>Not published</td></tr><tr><td>7</td><td>Hypotenuse AI</td><td>Hypotenuse</td><td>Product content and attributes</td><td>Shopify, BigCommerce, Salesforce Commerce Cloud, PIMs, API</td><td>Custom quote</td></tr><tr><td>8</td><td>Magento 2 AI Agent</td><td>Magefan</td><td>Admin and catalog edits in chat</td><td>Magento 2.3.0 to 2.4.9, all editions</td><td>€134 one-time</td></tr><tr><td>9</td><td>Agent for Magento (Ari)</td><td>scandiweb</td><td>Store changes, built on a copy</td><td>Magento Open Source and Adobe Commerce</td><td>From €99 a month per store</td></tr><tr><td>10</td><td>Sidekick</td><td>Shopify</td><td>Store changes, admin tasks</td><td>Shopify</td><td>Included in Shopify plans</td></tr><tr><td>11</td><td>Companion</td><td>BigCommerce</td><td>Admin tasks, store changes</td><td>BigCommerce</td><td>Included</td></tr></tbody></table><figcaption class="wp-element-caption">AI agents for eCommerce compared: job, platforms and price (vendor pages, November 2, 2026)</figcaption></figure>



<p class="wp-block-paragraph">Prices as listed on each vendor&#8217;s site on November 2, 2026.</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/11/ai-agents-for-ecommerce-jobs-map.png" alt="AI agents for eCommerce by job: two jobs face customers, three work for the store team, with example agents for each" class="wp-image-26748" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-jobs-map.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-jobs-map-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-jobs-map-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-jobs-map-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-jobs-map-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-jobs-map-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-jobs-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;">Five jobs AI agents do for an online store, split by who the agent works with.</figcaption></figure></div>



<h2 class="wp-block-heading">Customer service AI agents</h2>



<p class="wp-block-paragraph">A customer service agent answers customers in chat, email or other channels and takes actions such as checking an order&#8217;s status, cancelling an order or starting a return. It works inside your helpdesk and reads your store&#8217;s order data. Most charge per resolved conversation, so the bill grows with the share of tickets the agent closes.</p>



<h3 class="wp-block-heading">1. Fin by Intercom</h3>



<p class="wp-block-paragraph"><a href="https://fin.ai/solutions/ecommerce" target="_blank" rel="noopener">Fin</a> answers customers in chat, email, voice and social channels, and takes actions such as refunds and partial or full cancellations once it has verified the order. Fin Voice covers calls, for stores that want an AI voice agent for eCommerce support.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> stores with a busy support inbox that want the agent inside the helpdesk they already use.</p>



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



<ul class="wp-block-list">
<li>Runs in Intercom&#8217;s helpdesk or in Salesforce, Zendesk, HubSpot, Freshdesk and others</li>


<li>Shopify app that reads order status and tracking, plus no-code connectors for other systems with an API</li>


<li>Invalid order IDs and orders that need attention go to your team</li>


<li>A testing suite before you set changes live</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> $0.99 per outcome, at most once per conversation. With another helpdesk, a $49 a month minimum that includes 50 outcomes. On Intercom, $19 per seat a month plus outcomes. Fin Voice is $1.99 per voice outcome, through sales.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Shopify through its app, other systems through data connectors.</p>



<h3 class="wp-block-heading">2. Gorgias AI Agent</h3>



<p class="wp-block-paragraph"><a href="https://www.gorgias.com/ai-agent" target="_blank" rel="noopener">Gorgias AI Agent</a> answers support questions, chats with shoppers before they buy, and handles returns and order tracking. On Shopify it can cancel an order, edit the shipping address, remove or replace an item, reship an order for free and add an order note.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> Shopify, BigCommerce or Magento (Adobe Commerce) stores that want support and pre-sale chat in one helpdesk.</p>



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



<ul class="wp-block-list">
<li>Asks the shopper to confirm an address change or item removal before it makes it</li>


<li>Checks that an order is unfulfilled before it cancels or edits it</li>


<li>Hands the ticket to your team when a replacement raises the order total</li>


<li>Cancellations don&#8217;t reach third-party logistics apps</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> on every Gorgias plan, at $0.90 per automated interaction on an annual contract or $1.00 monthly, then $1.50 past the plan&#8217;s limit, on top of a helpdesk plan priced separately.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Shopify, BigCommerce, Magento, WooCommerce.</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>Customer service agents bill per result: Fin charges $0.99 per outcome, and Gorgias charges $0.90 to $1.00 per automated interaction. A busy month costs more, so check the minimums too, such as Fin&#8217;s $49 a month when it runs on another helpdesk.</p></div>



<h2 class="wp-block-heading">Shopping assistant agents for your storefront</h2>



<p class="wp-block-paragraph">A shopping assistant agent talks to shoppers on your storefront before they buy. It answers product questions from your catalog, recommends items and, on some platforms, takes the shopper through checkout in the chat. Assistants built by the commerce platform use its catalog and order data directly, while helpdesk tools add shopping chat to their support agent.</p>



<p class="wp-block-paragraph">For the types of AI shopping assistants and what each costs per conversation, see our guide to <a href="https://scandiweb.com/blog/ai-shopping-assistant/" target="_blank" rel="noopener">AI shopping assistants</a>.</p>



<h3 class="wp-block-heading">3. Shopify Inbox</h3>



<p class="wp-block-paragraph"><a href="https://apps.shopify.com/inbox" target="_blank" rel="noopener">Shopify Inbox</a> is Shopify&#8217;s free chat app, and it gives shoppers an AI sales associate: &#8220;Buyers can ask questions and get help finding the right products from your catalog.&#8221; It is a quick way to add an AI agent for your website&#8217;s storefront chat.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> Shopify stores that want to try an AI shopping assistant before paying for one.</p>



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



<ul class="wp-block-list">
<li>Product recommendations</li>


<li>Replies that use preferences and purchase history for shoppers signed in with Shop</li>


<li>Live chat and chat assignment for your team</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> free.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Shopify.</p>



<h3 class="wp-block-heading">4. Salesforce Agentforce Commerce Shopper Agent</h3>



<p class="wp-block-paragraph">The <a href="https://www.salesforce.com/commerce/ai/" target="_blank" rel="noopener">Agentforce Commerce Shopper Agent</a> is Salesforce&#8217;s storefront agent. In Salesforce&#8217;s words, it &#8220;carries the customer conversation from discovery through checkout and into service&#8221; in your brand&#8217;s voice, and Salesforce made it generally available in June 2026.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> brands on Salesforce Commerce Cloud that want one agent from product discovery to after-sale service.</p>



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



<ul class="wp-block-list">
<li>Visual product search and answers to store and product questions</li>


<li>Checkout in the chat with Apple Pay or Google Pay</li>


<li>Connected to the catalog, inventory and orders</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> Salesforce lists Agentforce at $2 per conversation for customer-facing agents, or by Flex Credits. Commerce Cloud editions are priced on request.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Salesforce Commerce Cloud.</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, Shopify Inbox is a free way to test an AI shopping assistant. Salesforce lists Agentforce at $2 per conversation for customer-facing agents, so estimate your monthly conversations before you compare it with a flat-fee tool.</p></div>



<h2 class="wp-block-heading">AI marketing agents</h2>



<p class="wp-block-paragraph">A marketing agent builds campaigns from a goal you describe. It picks the audience, drafts the emails or messages and plans the send, using your customer and sales data. Klaviyo&#8217;s Composer, the example below, builds campaigns, flows and segments inside Klaviyo and lets your team review customer-facing work before it goes live.</p>



<h3 class="wp-block-heading">5. Klaviyo Composer</h3>



<p class="wp-block-paragraph"><a href="https://www.klaviyo.com/composer" target="_blank" rel="noopener">Klaviyo Composer</a> is Klaviyo&#8217;s AI marketing agent. You give it a goal, and it builds campaigns, flows, messages and segments inside Klaviyo from your own customer data.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> teams that already send email or SMS from Klaviyo and want campaigns drafted from their own customer data.</p>



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



<ul class="wp-block-list">
<li>Builds and refines segments and audiences</li>


<li>Gives your team &#8220;the opportunity to review customer-facing work before it goes live&#8221;</li>


<li>Klaviyo also sells a Customer Agent for order tracking, returns and recommendations</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> free and paid access, depending on your account and usage. The free plan includes $5 of Composer usage a month.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Klaviyo, which connects to Shopify, BigCommerce, Magento, Salesforce Commerce Cloud, WooCommerce and Wix. Our <a href="https://scandiweb.com/blog/klaviyo-vs-mailchimp/" target="_blank" rel="noopener">Klaviyo vs Mailchimp</a> comparison covers the email platform itself.</p>



<h2 class="wp-block-heading">Catalog and product content agents</h2>



<p class="wp-block-paragraph">A catalog agent writes and fixes product data: titles, descriptions, attributes, categories and sort orders, often for thousands of products at once. Some work inside the commerce platform and edit the catalog directly. Others work in a separate product content tool and send the results to your store. Read a sample before you run one on the whole catalog.</p>



<p class="wp-block-paragraph">Catalog agents do more than an AI product description generator, because they also fill attributes and sort products, and teams that keep product data in <a href="https://scandiweb.com/blog/how-to-choose-the-best-pim-software/" target="_blank" rel="noopener">PIM software</a> can run them there.</p>



<h3 class="wp-block-heading">6. Salesforce Agentforce Commerce Merchant Agent</h3>



<p class="wp-block-paragraph">The <a href="https://www.salesforce.com/news/stories/agentforce-commerce-announcement/" target="_blank" rel="noopener">Agentforce Commerce Merchant Agent</a> runs the back office side of Salesforce Commerce Cloud: your team organizes catalogs, sorts products and responds to trends by describing what they want in plain language instead of clicking through admin menus. Salesforce made it generally available in June 2026.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> Salesforce Commerce Cloud merchandisers who spend hours on catalog rules and sort orders in admin menus.</p>



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



<ul class="wp-block-list">
<li>Rules for which products rise or drop in results</li>


<li>Category sort orders</li>


<li>Related Agentforce Merchandising features write product descriptions and SEO metadata, including in local languages</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> not published. Commerce Cloud is priced on request.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Salesforce Commerce Cloud.</p>



<h3 class="wp-block-heading">7. Hypotenuse AI</h3>



<p class="wp-block-paragraph"><a href="https://www.hypotenuse.ai/" target="_blank" rel="noopener">Hypotenuse AI</a> is an AI product information platform with &#8220;Specialized AI agents for catalog work, alongside your team&#8221;. It writes titles and descriptions in your brand voice, fills missing attributes and edits the catalog in bulk.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> large catalogs that sell on a store and on marketplaces and need consistent product data in many languages.</p>



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



<ul class="wp-block-list">
<li>Bulk generation of titles and descriptions</li>


<li>Fills attribute gaps from the web, UPC data, spec sheets and product images</li>


<li>40+ languages</li>


<li>Custom integrations with PIM, ERP and eCommerce platforms on the Enterprise plan</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> custom quote for both plans.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Shopify, BigCommerce, Salesforce Commerce Cloud, Akeneo and other PIMs, plus an API.</p>



<h3 class="wp-block-heading">8. Magefan Magento 2 AI Agent</h3>



<p class="wp-block-paragraph"><a href="https://magefan.com/magento-2-ai-agent" target="_blank" rel="noopener">Magefan Magento 2 AI Agent</a> adds an AI chat to the Magento admin that can &#8220;View, create, update and delete store entities&#8221;, including products, categories, orders, cart price rules, CMS pages and blocks, and customers.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> Magento admin users who want catalog edits, lookups and routine admin work done by asking in chat.</p>



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



<ul class="wp-block-list">
<li>Respects each user&#8217;s admin permissions (ACL), with an option to limit the AI further</li>


<li>Also handles invoices, shipments, credit memos and newsletter subscribers, plus cache and indexer actions</li>


<li>Uses the Claude API</li>


<li>Compatible with the Hyvä theme</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> €134 one-time, with 365 days of updates and support.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento 2.3.0 to 2.4.9 (Open Source, Adobe Commerce, Adobe Commerce Cloud, B2B).</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 a catalog agent on one category first and read what it writes before you let it change the whole catalog. Product copy goes straight to your storefront and to Google, so one bad pattern repeated across a thousand products is hard to undo.</p></div>



<h2 class="wp-block-heading">Agents that change the store itself</h2>



<p class="wp-block-paragraph">A store-change agent changes the store itself from a chat: settings, orders, pages, theme code or extensions. Shopify and BigCommerce include admin assistants that apply a change only after you approve it. Magento (Adobe Commerce) stores add <a href="https://scandiweb.com/blog/magento-ai-agent/" target="_blank" rel="noopener">third-party agents</a>, from admin chat extensions to agents that build code changes on a copy of the store for a person to release.</p>



<h3 class="wp-block-heading">9. Agent for Magento (Ari) by scandiweb</h3>



<p class="wp-block-paragraph">Ari, the <a href="https://www.withari.ai/" target="_blank" rel="noopener">AI agent for Magento</a>, takes store changes you describe in chat and builds them on a copy of the store with customer data removed. Your team checks each change on a preview store, and a person approves it and releases it as a pull request.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> Magento Open Source and Adobe Commerce teams with frontend, backend and extension work waiting for a developer.</p>



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



<ul class="wp-block-list">
<li>Frontend and backend changes, extension installs and conflict fixes</li>


<li>Magento version upgrades and <a href="https://scandiweb.com/blog/magento-security-patch/" target="_blank" rel="noopener">security patches</a></li>


<li>ERP, PIM and carrier integrations</li>


<li>Hyvä theme and checkout rebuilds</li>

</ul>



<p class="wp-block-paragraph">Ari&#8217;s security page sets out <a href="https://www.withari.ai/security" target="_blank" rel="noopener">what Ari can and can&#8217;t access</a>: no access to the live store, the servers or customers&#8217; data, approval only by your team, and no training on the data sent to the OpenAI and Anthropic services it uses.</p>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> from €99 a month per store, unlimited seats. Ari Agency (€299 a month) adds Ari engineers for review and release, and Enterprise plans are on request.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Magento Open Source and Adobe Commerce.</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/11/ai-agents-for-ecommerce-ari-storefront-changes.png" alt="withari.ai storefront changes page with the change types Ari builds: promo bars, product page blocks and menus" class="wp-image-26749" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-ari-storefront-changes.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-ari-storefront-changes-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-ari-storefront-changes-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-ari-storefront-changes-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-ari-storefront-changes-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-ari-storefront-changes-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-ari-storefront-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;">Storefront changes store teams ask Ari for: promo bars, product page blocks and menus.</figcaption></figure></div>



<h3 class="wp-block-heading">10. Shopify Sidekick</h3>



<p class="wp-block-paragraph"><a href="https://www.shopify.com/sidekick" target="_blank" rel="noopener">Shopify Sidekick</a> is the Shopify AI agent included in every Shopify admin. Shopify rebuilt it on October 28, 2026 so it can write code, with the merchant approving its changes. Our post on <a href="https://scandiweb.com/blog/shopify-sidekick/" target="_blank" rel="noopener">what Sidekick can and can&#8217;t do</a> covers that release.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> Shopify merchants who want theme, checkout and admin changes drafted in chat and reviewed before they go live.</p>



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



<ul class="wp-block-list">
<li>Stages storefront changes in a draft and tests them with AI-simulated shoppers</li>


<li>Customizes checkout and customer account settings</li>


<li>Builds Shopify Flow automations and writes product descriptions</li>


<li>Shopify says it &#8220;can&#8217;t change your live store without your approval&#8221; and doesn&#8217;t talk to your customers</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> included with your Shopify plan, with features and usage limits that vary by plan.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> Shopify, within each staff member&#8217;s admin permissions.</p>



<h3 class="wp-block-heading">11. BigCommerce Companion</h3>



<p class="wp-block-paragraph"><a href="https://www.bigcommerce.com/product/companion/" target="_blank" rel="noopener">BigCommerce Companion</a> is the AI assistant inside the BigCommerce control panel. It answers how-to questions, shows store data as charts, takes you to any admin page and makes changes, such as marking an order fulfilled or issuing a store credit.</p>



<p class="wp-block-paragraph"><strong>Best for:</strong> BigCommerce teams that want answers and routine admin updates without leaving the control panel.</p>



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



<ul class="wp-block-list">
<li>&#8220;Companion does not apply a change without your approval.&#8221;</li>


<li>Rechecks an order before it updates it</li>


<li>Works only within the signed-in user&#8217;s permissions</li>


<li>Built for your team, with shopper chat left to App Marketplace apps</li>

</ul>



<p class="wp-block-paragraph"><strong>Price (November 2, 2026):</strong> included with every BigCommerce store, on free trials and paid plans.</p>



<p class="wp-block-paragraph"><strong>Works with:</strong> BigCommerce.</p>



<p class="wp-block-paragraph">Adobe Commerce developers also have Adobe&#8217;s <a href="https://developer.adobe.com/commerce/extensibility/developer-agent/" target="_blank" rel="noopener">Commerce Developer Agent</a>, which writes App Builder extension code from a plan a developer approves first. Adobe calls it &#8220;a starting-point generator, not a fully autonomous developer.&#8221;</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>Shopify Sidekick and BigCommerce Companion come with the platform at no extra cost, and both apply a change only after someone on your team approves it. Shopify also says Sidekick can&#8217;t talk to your customers, so it doesn&#8217;t replace a support agent.</p></div>



<h2 class="wp-block-heading">What to check before an AI agent acts on your store</h2>



<p class="wp-block-paragraph">Before an AI agent acts on your store, check what it can change without a person, who approves the rest, how the price grows with volume and where your store data goes. Start with one action or read-only access, test it on real cases from your store, and widen the permissions only after the results hold up.</p>



<p class="wp-block-paragraph">Here is what to look for in an eCommerce AI agent before you compare prices.</p>



<ol class="wp-block-list">
<li><strong>What it can do without a person.</strong> Gorgias AI Agent can cancel an unfulfilled Shopify order or edit its shipping address, and it asks the shopper to confirm address changes and item removals first. Fin can issue a refund once it has verified the order. Decide which actions you allow before launch, and switch them on one at a time.</li>


<li><strong>Who approves the rest, and where.</strong> Klaviyo lets your team review customer-facing work before it goes live. Shopify Sidekick drafts store changes for you to review and publish, and BigCommerce Companion applies a change only after you approve it. An agent that changes code should build each change away from the live store and leave the release to a person.</li>


<li><strong>How the price grows with volume.</strong> Per-outcome and per-conversation prices, as with Fin, Gorgias and Agentforce, rise with traffic. Estimate a peak month before you compare them with tools included in your platform or with flat subscriptions.</li>


<li><strong>Where your store data goes.</strong> Every AI agent for eCommerce sends questions, orders or code to an AI provider. Ask which provider that is, whether it trains models on your data, and how much customer data the agent can read.</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/11/ai-agents-for-ecommerce-approval-by-job.png" alt="Where a person signs off before an AI agent acts, from shopper confirmations to approving store changes in the admin" class="wp-image-26750" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-approval-by-job.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-approval-by-job-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-approval-by-job-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-approval-by-job-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-approval-by-job-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-approval-by-job-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/ai-agents-for-ecommerce-approval-by-job-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 much an agent does on its own depends on the job. These are the sign-off steps each vendor describes.</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>Ask every vendor two questions before launch: what can the agent change without a person, and where does the store data it reads go? The answers tell you how much testing the agent needs before it goes live.</p></div>



<h2 class="wp-block-heading">How to choose AI agents for eCommerce by job</h2>



<p class="wp-block-paragraph">Choose AI agents for eCommerce by the job that costs your team the most time. A full support inbox calls for a customer service agent, unanswered product questions for a shopping assistant, slow campaigns for a marketing agent, thin product data for a catalog agent, and a backlog of small fixes for a store-change agent. Start with one job.</p>



<figure class="wp-block-table"><table><thead><tr><th>Where the work piles up</th><th>Agent type</th><th>Entries</th></tr></thead><tbody><tr><td>Order questions, returns and cancellations</td><td>Customer service agent</td><td>1, 2</td></tr><tr><td>Product questions before purchase</td><td>Shopping assistant</td><td>3, 4</td></tr><tr><td>Campaigns, flows and segments</td><td>Marketing agent</td><td>5</td></tr><tr><td>Product descriptions, attributes and sort orders</td><td>Catalog and content agent</td><td>6, 7, 8</td></tr><tr><td>Settings, orders, theme and extension changes</td><td>Store-change agent</td><td>9, 10, 11</td></tr></tbody></table><figcaption class="wp-element-caption">Which AI agent type fits where the work piles up</figcaption></figure>



<p class="wp-block-paragraph">Which eCommerce AI agent to pick within a group then follows from your platform.</p>



<p class="wp-block-paragraph"><strong>Choose a customer service agent if:</strong></p>



<ul class="wp-block-list">
<li>Your support inbox fills with &#8220;where is my order&#8221; and return requests.</li>


<li>You already run a helpdesk and want the agent to answer inside it.</li>

</ul>



<p class="wp-block-paragraph"><strong>Choose a shopping assistant if:</strong></p>



<ul class="wp-block-list">
<li>Shoppers ask product-fit questions before they buy and leave without an answer.</li>


<li>You want answers that come from your own catalog, in a chat on your storefront.</li>

</ul>



<p class="wp-block-paragraph"><strong>Choose a marketing agent if:</strong></p>



<ul class="wp-block-list">
<li>Your campaign calendar slips because building segments and emails takes days.</li>


<li>You want campaign drafts your team reviews before anything reaches customers.</li>

</ul>



<p class="wp-block-paragraph"><strong>Choose a catalog and content agent if:</strong></p>



<ul class="wp-block-list">
<li>Hundreds of products have thin descriptions or missing attributes.</li>


<li>You sell in several languages or regions and need product copy in each one.</li>

</ul>



<p class="wp-block-paragraph"><strong>Choose a store-change agent if:</strong></p>



<ul class="wp-block-list">
<li>Small storefront and admin changes wait weeks for a developer.</li>


<li>You want every change drafted, previewed and approved by a person before it goes live.</li>

</ul>



<h2 class="wp-block-heading">Frequently asked questions about AI agents for eCommerce</h2>



<h3 class="wp-block-heading">Which AI agents are best for eCommerce?</h3>



<p class="wp-block-paragraph">The best AI agent for eCommerce depends on the job. Fin and Gorgias AI Agent answer customers, Shopify Inbox and Salesforce&#8217;s Shopper Agent help shoppers choose, Klaviyo Composer builds campaigns, and catalog agents such as Hypotenuse AI write product content. For store changes, start with what your platform includes, such as Shopify Sidekick or BigCommerce Companion.</p>



<h3 class="wp-block-heading">What is the difference between an AI agent and a chatbot?</h3>



<p class="wp-block-paragraph">A chatbot answers questions in a conversation, often from fixed scripts. An AI agent also takes actions: it looks up an order and issues the refund, drafts a campaign or updates a product page, using the systems you connect it to. That is why an agent needs permissions and an approval step, while a scripted chatbot mostly needs good answers.</p>



<h3 class="wp-block-heading">How much do AI agents for eCommerce cost?</h3>



<p class="wp-block-paragraph">Prices follow the job. Customer service agents charge per resolved conversation: $0.99 per outcome for Fin, and $0.90 to $1.00 per automated interaction for Gorgias AI Agent. Salesforce lists Agentforce at $2 per conversation for customer-facing agents. Shopify Sidekick, Shopify Inbox and BigCommerce Companion come with the platform, and the rest are subscriptions, one-time licenses or quoted plans.</p>



<h3 class="wp-block-heading">Can an AI agent change my online store without my approval?</h3>



<p class="wp-block-paragraph">It depends on the agent and your settings. Shopify says Sidekick can&#8217;t change your live store without your approval, and BigCommerce says Companion does not apply a change without it. Support agents can act on orders by themselves within the rules you set, so test each action, such as a cancellation or a refund, before you switch it on.</p>



<h3 class="wp-block-heading">Do AI agents for eCommerce work with Magento (Adobe Commerce)?</h3>



<p class="wp-block-paragraph">Yes. Gorgias and Klaviyo both connect to Magento, so their agents can answer customers and build campaigns for a Magento store. In the admin, Magefan&#8217;s Magento 2 AI Agent creates and updates products, categories and CMS content from a chat, within each user&#8217;s admin role. For code and theme changes, look for agents built for Magento Open Source and Adobe Commerce.</p>



<h3 class="wp-block-heading">Should we build our own AI agent or buy one?</h3>



<p class="wp-block-paragraph">Buy first if an existing agent covers the job, because it comes with integrations, testing tools and a price you can check today. Build when the work depends on your own rules and systems, such as B2B price lists or a custom catalog. A custom agent connects an AI model to your store through APIs or the <a href="https://scandiweb.com/blog/what-is-mcp-model-context-protocol/" target="_blank" rel="noopener">Model Context Protocol</a>, a standard way for AI tools to use other systems.</p>



<h3 class="wp-block-heading">Are AI agents safe to use with customer data?</h3>



<p class="wp-block-paragraph">They can be, if you check before launch which AI provider processes your store&#8217;s data and whether that provider trains its models on it. Then give each agent only the access its job needs: a support agent needs order data, while a store-change agent needs your code, and neither should see more customer data than the task requires.</p>



<h2 class="wp-block-heading">Where to start with AI agents for eCommerce</h2>



<p class="wp-block-paragraph">AI agents for eCommerce pay off when each one has one job and clear limits. Pick the job that takes your team the most hours today, choose an agent built for your platform, test it on real work with the narrowest access it needs, and add the next agent once the first one works the way you expect.</p>



<p class="wp-block-paragraph">Prices and platform lists change, so open the vendor page again before you sign. For help deciding which jobs to hand to agents first, and how to connect them to your store with the right limits, talk to scandiweb about <a href="https://scandiweb.com/services/ai" target="_blank" rel="noopener">AI strategy consulting for eCommerce</a>.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Which AI agents are best for eCommerce?", "acceptedAnswer": {"@type": "Answer", "text": "The best AI agent for eCommerce depends on the job. Fin and Gorgias AI Agent answer customers, Shopify Inbox and Salesforce's Shopper Agent help shoppers choose, Klaviyo Composer builds campaigns, and catalog agents such as Hypotenuse AI write product content. For store changes, start with what your platform includes, such as Shopify Sidekick or BigCommerce Companion."}}, {"@type": "Question", "name": "What is the difference between an AI agent and a chatbot?", "acceptedAnswer": {"@type": "Answer", "text": "A chatbot answers questions in a conversation, often from fixed scripts. An AI agent also takes actions: it looks up an order and issues the refund, drafts a campaign or updates a product page, using the systems you connect it to. That is why an agent needs permissions and an approval step, while a scripted chatbot mostly needs good answers."}}, {"@type": "Question", "name": "How much do AI agents for eCommerce cost?", "acceptedAnswer": {"@type": "Answer", "text": "Prices follow the job. Customer service agents charge per resolved conversation: $0.99 per outcome for Fin, and $0.90 to $1.00 per automated interaction for Gorgias AI Agent. Salesforce lists Agentforce at $2 per conversation for customer-facing agents. Shopify Sidekick, Shopify Inbox and BigCommerce Companion come with the platform, and the rest are subscriptions, one-time licenses or quoted plans."}}, {"@type": "Question", "name": "Can an AI agent change my online store without my approval?", "acceptedAnswer": {"@type": "Answer", "text": "It depends on the agent and your settings. Shopify says Sidekick can't change your live store without your approval, and BigCommerce says Companion does not apply a change without it. Support agents can act on orders by themselves within the rules you set, so test each action, such as a cancellation or a refund, before you switch it on."}}, {"@type": "Question", "name": "Do AI agents for eCommerce work with Magento (Adobe Commerce)?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Gorgias and Klaviyo both connect to Magento, so their agents can answer customers and build campaigns for a Magento store. In the admin, Magefan's Magento 2 AI Agent creates and updates products, categories and CMS content from a chat, within each user's admin role. For code and theme changes, look for agents built for Magento Open Source and Adobe Commerce."}}, {"@type": "Question", "name": "Should we build our own AI agent or buy one?", "acceptedAnswer": {"@type": "Answer", "text": "Buy first if an existing agent covers the job, because it comes with integrations, testing tools and a price you can check today. Build when the work depends on your own rules and systems, such as B2B price lists or a custom catalog. A custom agent connects an AI model to your store through APIs or the Model Context Protocol, a standard way for AI tools to use other systems."}}, {"@type": "Question", "name": "Are AI agents safe to use with customer data?", "acceptedAnswer": {"@type": "Answer", "text": "They can be, if you check before launch which AI provider processes your store's data and whether that provider trains its models on it. Then give each agent only the access its job needs: a support agent needs order data, while a store-change agent needs your code, and neither should see more customer data than the task requires."}}]}</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>Tell us </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>which job piles up first</em></a><em> on your team, and we&#x27;ll say which agent type fits it and what access it would need on your store.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/ai-agents-for-ecommerce/">AI Agents for eCommerce: What They Do and Which Ones Store Teams Use</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Apply a Magento Security Patch (and Know Which Ones You Need)</title>
		<link>https://scandiweb.com/blog/magento-security-patch/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 16:13:00 +0000</pubDate>
				<category><![CDATA[Collection]]></category>
		<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>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26747</guid>

					<description><![CDATA[<p>Which Magento security patch does your store need? Check what's installed, apply Adobe's monthly isolated patches in order, and test them before release.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-security-patch/">How to Apply a Magento Security Patch (and Know Which Ones You Need)</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-mgsec wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <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 Services
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-website-development" target=_blank >
        Magento Development
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">On October 13, 2026, Adobe published security bulletin APSB26-153 for Magento (Adobe Commerce), with fixes for 11 security holes, and the worst of them scored 10.0 out of 10 for severity. A security bulletin is Adobe&#8217;s public notice of what it fixed and which versions get the fix, and each fix reaches your store as a patch: a small file of code changes that closes the hole without a full version upgrade. Adobe&#8217;s notes for the October patch also warn that it leaves out September&#8217;s emergency fix for a flaw attackers were already using. So which Magento security patch does your store need, and is it already installed?</p>



<p class="wp-block-paragraph">Every command below comes from Adobe&#8217;s own documentation, checked on November 2, 2026, and the Adobe Commerce Cloud differences are marked where they apply.</p>



<h2 class="wp-block-heading">What is a Magento security patch?</h2>



<p class="wp-block-paragraph">A Magento security patch is a code change from Adobe that closes known security holes in Magento Open Source or Adobe Commerce without adding features. Most arrive in two forms: a security patch release such as 2.4.8-p5, and smaller monthly isolated patch files in between. A flaw that attackers already use gets an emergency hotfix.</p>



<p class="wp-block-paragraph">Adobe uses the word patch for four different things, and the table shows how each one arrives and how you apply it.</p>



<figure class="wp-block-table"><table><thead><tr><th>Patch type</th><th>What it contains</th><th>How Adobe delivers it</th><th>How you apply it</th><th>Can you skip it?</th></tr></thead><tbody><tr><td>Security patch release (for example 2.4.8-p5)</td><td>Security fixes plus the fixes of the patch release before it</td><td>Composer package, named 2.4.x-pN</td><td><code>composer require-commerce</code>, then <code>composer update</code> and <code>setup:upgrade</code></td><td>No. Monthly files only apply on the latest one</td></tr><tr><td>Monthly isolated patch file</td><td>Security fixes only, for one month, not cumulative</td><td>ZIP of .patch files linked from the bulletin&#8217;s knowledge base article</td><td><code>patch -p1</code> from the Magento root, in release order (Cloud: Cloud Patches for Commerce)</td><td>No. Each month builds on the last</td></tr><tr><td>Hotfix</td><td>An urgent fix, for example for a flaw already being exploited</td><td>Patch file with its own bulletin, or through the Quality Patches Tool</td><td>Same <code>patch -p1</code> command, or <code>m2-hotfixes</code> on Cloud</td><td>No. Apply it as soon as it passes testing</td></tr><tr><td>Quality patch (Adobe calls it an individual patch)</td><td>A low-impact fix for one specific bug</td><td>Quality Patches Tool</td><td><code>./vendor/bin/magento-patches apply &lt;ID&gt;</code></td><td>Yes, unless you have that bug</td></tr></tbody></table><figcaption class="wp-element-caption">Magento security patch types: what each contains, how Adobe delivers it and how you apply it</figcaption></figure>



<p class="wp-block-paragraph">The security patch release is the base, and it installs through Composer, the tool that manages Magento&#8217;s code packages. <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/release/planning/versioning-policy" target="_blank" rel="noopener">Adobe&#8217;s release policy</a> requires the latest -p release for your line before any monthly isolated file goes on.</p>



<p class="wp-block-paragraph">Every monthly file is then folded into the next security patch release, so a store that moves to the next -p release picks up the months it missed. Each fix carries a CVE, the public ID number a security hole gets, and each bulletin lists the CVEs it closes along with the fixed versions, whether it announces a Magento patch release or a hotfix.</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>Isolated patch files only apply on top of the latest -p release for your version line. A store on 2.4.8-p3 has to move to 2.4.8-p5 before it can apply October&#8217;s 2.4.8 file.</p></div>



<h2 class="wp-block-heading">Which Magento security patches does your store need?</h2>



<p class="wp-block-paragraph">Your store needs the latest security patch release for its version line, then every monthly isolated patch Adobe has published since, in release order, plus any hotfix announced on top. Which files exist depends on your version and edition: in October 2026, Adobe&#8217;s isolated patch files for Magento Open Source started at 2.4.7.</p>



<p class="wp-block-paragraph">Adobe&#8217;s most recent files, from bulletin <a href="https://www.adobe.com/trust/security/products/commerce/apsb26-153.html" target="_blank" rel="noopener">APSB26-153</a> in October 2026, show the pattern for each line.</p>



<figure class="wp-block-table"><table><thead><tr><th>Your version</th><th>Install first (latest -p)</th><th>Then every monthly file, for example October&#8217;s</th><th>Who gets it</th></tr></thead><tbody><tr><td>2.4.9</td><td>2.4.9 (no -p release yet)</td><td><code>2-4-9-oct-2026.zip</code></td><td>Adobe Commerce and Magento Open Source</td></tr><tr><td>2.4.8</td><td>2.4.8-p5</td><td><code>2-4-8-p5-oct-2026.zip</code> (revised October 16)</td><td>Adobe Commerce and Magento Open Source</td></tr><tr><td>2.4.7</td><td>2.4.7-p10</td><td><code>2-4-7-p10-oct-2026.zip</code></td><td>Adobe Commerce and Magento Open Source</td></tr><tr><td>2.4.6</td><td>2.4.6-p15</td><td><code>2-4-6-p15-oct-2026.zip</code></td><td>Adobe Commerce only. Open Source 2.4.6 is listed as affected, with no fix</td></tr><tr><td>2.4.5</td><td>2.4.5-p17</td><td><code>2-4-5-p17-oct-2026.zip</code></td><td>Adobe Commerce only, security-only fixes until May 31, 2027</td></tr><tr><td>2.4.4</td><td>2.4.4-p18</td><td><code>2-4-4-p18-oct-2026.zip</code></td><td>Adobe Commerce only, security-only fixes until May 31, 2027</td></tr><tr><td>2.4.3 or older</td><td>None</td><td>None in Adobe&#8217;s 2026 bulletins</td><td>Plan an upgrade (see the section on versions that no longer get patches)</td></tr></tbody></table><figcaption class="wp-element-caption">Which Magento security patches each version line needs, from Adobe&#x27;s October 2026 bulletin APSB26-153</figcaption></figure>



<p class="wp-block-paragraph">Whatever your line, check for a hotfix announced since your last patch: it is not part of the monthly file.</p>



<h3 class="wp-block-heading">Find your Magento version and edition</h3>



<p class="wp-block-paragraph">The version shows in the bottom-right corner of any Admin page. If it is hidden, run <code>bin/magento --version</code>.</p>



<p class="wp-block-paragraph">Note the edition as well, because Magento Open Source and Adobe Commerce get different files. If you run 2.4.8 or older and the version has no -p suffix, you are behind the latest Magento 2 security patch release, since every line from 2.4.4 to 2.4.8 has one.</p>



<h3 class="wp-block-heading">Read the bulletin&#8217;s affected and fixed versions</h3>



<p class="wp-block-paragraph">Each Adobe Commerce security bulletin has two tables. The first lists the affected versions, the second lists the fixed ones. A label such as 2.4.8-2026-sep means a 2.4.8 store patched through September, and 2.4.8-2026-oct means the same store with October&#8217;s file applied.</p>



<p class="wp-block-paragraph">The October bulletin lists Magento Open Source 2.4.6 as affected, and its fixed versions for Open Source start at 2.4.7, which is why the edition matters. New bulletins are published in the <a href="https://www.adobe.com/trust/security/bulletins-and-advisories.html" target="_blank" rel="noopener">Adobe Trust Center</a>, so bookmark that page rather than Adobe&#8217;s older HelpX 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="941" src="https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apsb26-153-versions.png" alt="Magento security patch APSB26-153: affected and fixed versions for Magento Open Source and Adobe Commerce, Oct 2026" class="wp-image-26743" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apsb26-153-versions.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apsb26-153-versions-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apsb26-153-versions-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apsb26-153-versions-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apsb26-153-versions-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apsb26-153-versions-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apsb26-153-versions-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;">Affected and fixed versions in Adobe&#x27;s October 2026 bulletin APSB26-153, for Magento Open Source and Adobe Commerce</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>Adobe&#8217;s October 2026 bulletin lists Magento Open Source 2.4.6 as affected, but its fixed versions for Open Source start at 2.4.7. On Open Source 2.4.6, the fix is an upgrade.</p></div>



<h2 class="wp-block-heading">How to check which Magento security patches are installed</h2>



<p class="wp-block-paragraph">To check which Magento security patches are installed, run Adobe&#8217;s Commerce Version Tool from the project root with <code>php vendor/bin/patch-status</code>. It lists applied and missing patches and marks each CVE as PROTECTED, VULNERABLE or UNKNOWN. The tool came with the July 2026 isolated patch, so if the command is missing, apply that file first.</p>



<p class="wp-block-paragraph">Missing one patch is a common gap: in a scandiweb check of <a href="https://scandiweb.com/blog/security-standing-of-13000-magento-stores/" target="_blank" rel="noopener">13,000 Magento 1 stores</a>, published in 2019, 14.82% were open to major breaches, mostly because a single patch was missing.</p>



<pre class="wp-block-code"><code>php vendor/bin/patch-status --version
php vendor/bin/patch-status</code></pre>



<p class="wp-block-paragraph">Read two lists in the output. <code>applied_patches</code> should hold every monthly file since your -p release, and <code>missing_patches</code> should be empty, with each CVE marked PROTECTED. The output is machine-readable, so you can run it automatically as part of continuous integration (CI) and report on it.</p>



<p class="wp-block-paragraph">On Adobe Commerce Cloud, check both the patch files and the Cloud Patches package, Adobe&#8217;s bundle of required fixes that Cloud applies at deployment.</p>



<pre class="wp-block-code"><code>vendor/bin/magento-patches -n status | grep "248p5-2026-10-001-CE\|Status"
php ./vendor/bin/ece-patches status</code></pre>



<p class="wp-block-paragraph">The first command shows whether one monthly file is applied, and the second is Adobe&#8217;s status check for Cloud Patches for Commerce.</p>



<h2 class="wp-block-heading">How to apply a Magento security patch, step by step</h2>



<p class="wp-block-paragraph">To apply a Magento security patch, back up the store and work on a staging copy first. Move to the latest -p release for your version, then apply each isolated patch file from the Magento root with <code>patch -p1</code>, oldest month first and CE before EE. Refresh the cache, confirm the result with patch-status, test the store, and release.</p>



<ol class="wp-block-list">
<li><strong>Back up the store and copy it to staging.</strong> Adobe strongly recommends applying and testing every patch on a staging or integration environment first, and keeping a recent backup.</li>

</ol>



<ol class="wp-block-list">
<li><strong>Move to the latest -p release for your line.</strong> The commands below are for Magento Open Source. On Adobe Commerce, replace <code>magento/product-community-edition</code> with <code>magento/product-enterprise-edition</code>. The full routine, with maintenance mode and compilation, is in our guide on <a href="https://scandiweb.com/blog/how-to-upgrade-magento-version-step-by-step-guide/" target="_blank" rel="noopener">how to upgrade Magento</a>.</li>

</ol>



<pre class="wp-block-code"><code>composer require-commerce magento/product-community-edition 2.4.8-p5 --no-update
composer update
bin/magento setup:upgrade</code></pre>



<ol class="wp-block-list">
<li><strong>Download the month&#8217;s patch files.</strong> Open the bulletin&#8217;s knowledge base article, which for October is <a href="https://experienceleague.adobe.com/en/docs/experience-cloud-kcs/kbarticles/ka-49323" target="_blank" rel="noopener">Adobe&#8217;s October 2026 patch article</a>, download the ZIP for your line, and unzip it. Adobe Commerce 2.4.6 or earlier asks for your Composer keys before the download.</li>

</ol>



<ol class="wp-block-list">
<li><strong>Apply each file from the Magento root.</strong> Apply any missed month first, then CE before EE, then B2B if you run it. CE is the Open Source code and EE the Adobe Commerce code, and Adobe&#8217;s order within a month is the CE file, then the EE file. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/support-resources/adobe-support-tools-guide/adobe-commerce-support/how-to-apply-an-isolated-security-patch-file-provided-by-adobe" target="_blank" rel="noopener">isolated patch guide</a> describes this as how to install a Magento patch file on-premises and on Magento Open Source.</li>

</ol>



<pre class="wp-block-code"><code>patch -p1 &lt; 248p5-2026-10-001-CE.patch</code></pre>



<p class="wp-block-paragraph">If that fails, try <code>-p2</code> instead.</p>



<pre class="wp-block-code"><code>patch -p2 &lt; 248p5-2026-10-001-CE.patch</code></pre>



<ol class="wp-block-list">
<li><strong>Refresh the cache.</strong> In the Admin, open System &gt; Cache Management and refresh it there.</li>

</ol>



<ol class="wp-block-list">
<li><strong>Check the result.</strong> Run <code>php vendor/bin/patch-status</code> again. The month&#8217;s patches should appear under <code>applied_patches</code>, with nothing in <code>missing_patches</code>.</li>

</ol>



<ol class="wp-block-list">
<li><strong>Test on staging, then release.</strong> Run your usual checkout and admin checks. Then apply the same files in production through your normal deployment. Adobe&#8217;s guide says you can apply a patch locally with the same command, then commit and push it as usual.</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/11/magento-security-patch-apply-order.png" alt="Order to apply a Magento security patch: latest -p release, then each month&#x27;s isolated files, CE before EE, then B2B" class="wp-image-26744" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apply-order.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apply-order-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apply-order-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apply-order-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apply-order-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apply-order-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-apply-order-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 order Adobe asks for: the latest -p release first, then each month&#x27;s isolated files, CE before EE, with hotfixes on top</figcaption></figure></div>



<p class="wp-block-paragraph">On a store that skipped several months, repeat step 4 for each month, oldest first: each file assumes the earlier ones are in place, and patch-status lists a skipped month as missing.</p>



<h3 class="wp-block-heading">How to apply an emergency hotfix</h3>



<p class="wp-block-paragraph">A hotfix arrives on its own, with its own bulletin, as a Composer patch file. Adobe&#8217;s October article says September&#8217;s hotfix for CVE-2026-75650 is not included in the October isolated file and must be applied separately. Upload it to the Magento root and run the same patch command, then refresh the cache.</p>



<pre class="wp-block-code"><code>patch -p1 &lt; %patch_name%.composer.patch</code></pre>



<p class="wp-block-paragraph">On Cloud, copy the file to the <code>m2-hotfixes</code> folder in your project, commit, and push. Apply a hotfix as soon as it passes staging. September&#8217;s hotfix also meant rotating every exposed credential, which our <a href="https://scandiweb.com/blog/adobe-magento-stylesmuggler-patch/" target="_blank" rel="noopener">StyleSmuggler patch guide</a> covers step by step.</p>



<h3 class="wp-block-heading">How to undo a patch</h3>



<p class="wp-block-paragraph">Quality patches have a revert command. Run <code>./vendor/bin/magento-patches revert &lt;PATCH-ID&gt;</code> for one patch or <code>./vendor/bin/magento-patches revert --all</code> for all of them, then <code>./bin/magento cache:clean</code>. On Cloud, delete a custom patch file from <code>m2-hotfixes</code> and push.</p>



<p class="wp-block-paragraph">Isolated monthly files have no documented revert command. When Adobe revised October&#8217;s 2.4.8-p5 file, it told merchants to reverse the original by using their established patch-management process. So commit each patch file on its own, and roll back that commit if testing fails.</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>Applied October&#8217;s 2.4.8-p5 file before October 16? Adobe revised it under the same filename. Download it again, reverse the old file, apply the new one, and check that patch-status lists 248p5-2026-10-002-CE as applied.</p></div>



<h2 class="wp-block-heading">Magento patch tools: Quality Patches Tool or Composer patches?</h2>



<p class="wp-block-paragraph">Use the Quality Patches Tool for Adobe&#8217;s official patches and Composer patches for your own fixes. Adobe&#8217;s documentation says it does not support applying official, Adobe-provided patches with the cweagans/composer-patches plugin. Monthly isolated security patches are a separate case: they come as patch files, applied with the patch command or, on Cloud, through Cloud Patches for Commerce.</p>



<figure class="wp-block-table"><table><thead><tr><th>Method</th><th>Use it for</th><th>Install</th><th>Status, apply and revert</th></tr></thead><tbody><tr><td>Quality Patches Tool</td><td>Adobe&#8217;s official quality patches and hotfixes</td><td><code>composer require magento/quality-patches</code></td><td><code>magento-patches status</code>, <code>apply &lt;ID&gt;</code>, <code>revert &lt;ID&gt;</code></td></tr><tr><td>Composer patches (cweagans/composer-patches)</td><td>Your own fixes. Adobe does not support it for official patches</td><td><code>composer require cweagans/composer-patches</code></td><td>Listed in composer.json, applied on <code>composer install</code></td></tr><tr><td>Patch command</td><td>Monthly isolated security files and Composer-format hotfixes</td><td>Nothing extra beyond the patch utility</td><td><code>patch -p1 &lt; file.patch</code>. No documented revert for isolated files</td></tr></tbody></table><figcaption class="wp-element-caption">Quality Patches Tool, Composer patches or the patch command: what each one is for</figcaption></figure>



<p class="wp-block-paragraph">The Quality Patches Tool needs Git or the patch utility installed and writes a log to <code>var/log/patch.log</code>. Adobe&#8217;s documentation for the tool warns that applying many patches makes the next upgrade harder, so apply a quality patch only for a bug your store has.</p>



<p class="wp-block-paragraph">The command-line method in <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/upgrade-guide/patches/apply" target="_blank" rel="noopener">Adobe&#8217;s patch guide</a> is the one for the monthly files. For what a Composer patch looks like and how to write your own, see <a href="https://scandiweb.com/blog/php-series-using-a-composer-patch/" target="_blank" rel="noopener">how Composer patches work</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>Adobe does not support applying its official patches with cweagans/composer-patches. Keep that plugin for fixes your own team writes, and use the Quality Patches Tool for Adobe&#8217;s.</p></div>



<h2 class="wp-block-heading">How patching works on Adobe Commerce Cloud</h2>



<p class="wp-block-paragraph">On Adobe Commerce Cloud, the Cloud Patches for Commerce package applies required security fixes during your next deployment, through ECE-Tools. Check your installed Cloud Patches version before adding a monthly isolated file, because applying a fix that is already in place can make the install fail. Your own patch files go in the m2-hotfixes folder.</p>



<p class="wp-block-paragraph">During a deployment, ECE-Tools, the deployment toolset for Adobe Commerce Cloud, applies patches in a fixed order, with the required patches from Cloud Patches for Commerce first, then the optional quality patches you selected, then your own files in <code>m2-hotfixes</code> in alphabetical order. You select quality patches in <code>.magento.env.yaml</code>, the Cloud project&#8217;s configuration file, using the IDs that <code>magento-patches status</code> shows for your store, in place of Adobe&#8217;s example IDs below.</p>



<pre class="wp-block-code"><code>stage:
  build:
    QUALITY_PATCHES:
      - MCTEST-1002
      - MCTEST-1003</code></pre>



<p class="wp-block-paragraph">Your own patch files, and any Adobe Commerce security patch you apply by hand, go into <code>m2-hotfixes</code>. Copy the .patch file into the folder, then commit and push, and check the result with <code>ece-patches status</code>.</p>



<pre class="wp-block-code"><code>mkdir m2-hotfixes
git add m2-hotfixes/
git commit -m "Apply 248p5-2026-10-001-CE.patch patch"
git push origin &lt;branch-name&gt;
php ./vendor/bin/ece-patches status</code></pre>



<p class="wp-block-paragraph"><a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/develop/upgrade/apply-patches" target="_blank" rel="noopener">Adobe&#8217;s Cloud patching guide</a> covers the packages and the order.</p>



<h2 class="wp-block-heading">What to do when your Magento version no longer gets patches</h2>



<p class="wp-block-paragraph">When Adobe stops publishing patches for your version, plan the upgrade to a supported line. Adobe Commerce 2.4.4 and 2.4.5 get isolated security fixes only until May 31, 2027, and Adobe&#8217;s October 2026 files for Magento Open Source covered 2.4.7 and later. Until the upgrade is live, backported fixes and close monitoring lower the risk.</p>



<p class="wp-block-paragraph">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>, the security-only period for 2.4.4 and 2.4.5 brings isolated security fixes and no quality fixes, and 2.4.7 has standard support until the same May 31, 2027 date. Adobe Commerce 2.4.6 has extended support until August 31, 2027, and security-only fixes until May 31, 2028. Every line&#8217;s dates are in our list of <a href="https://scandiweb.com/blog/magento-end-of-life/" target="_blank" rel="noopener">Magento end of life dates</a>.</p>



<p class="wp-block-paragraph">If the upgrade is the real fix, scandiweb&#8217;s <a href="https://scandiweb.com/magento-upgrade-services" target="_blank" rel="noopener">Magento upgrade services</a> can plan it from your current version. For one critical flaw on an old release, a backport can buy time: our <a href="https://scandiweb.com/blog/stylesmuggler-fix-for-older-magento-versions/" target="_blank" rel="noopener">StyleSmuggler fix for older Magento versions</a> covers 41 releases from 2.2.0 to 2.4.3-p3. Keep the Security Scan Tool running in the meantime.</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 Adobe Commerce Cloud, stores on 2.4.4 or 2.4.5 must upgrade or migrate by June 1, 2027. Adobe&#8217;s enforcement policy says non-compliant environments can have Admin access or storefront traffic suspended.</p></div>



<h2 class="wp-block-heading">How to keep up with Adobe&#8217;s monthly patches</h2>



<p class="wp-block-paragraph">Adobe publishes isolated security patches every month on Patch Tuesday, the second Tuesday of the month, and may release extra patches between them. Subscribe to Adobe&#8217;s free security notifications and keep a fixed monthly slot for testing and applying the new files. Agree in advance who applies an emergency hotfix, because those can&#8217;t wait for the slot.</p>



<p class="wp-block-paragraph">Two Adobe pages carry the schedule. <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/release/planning/monthly-isolated-security-patches" target="_blank" rel="noopener">Adobe&#8217;s monthly patching policy</a> sets out the Patch Tuesday cadence and the order rules, and <a href="https://www.adobe.com/subscription/adobesecuritynotifications.html" target="_blank" rel="noopener">Adobe&#8217;s security notification service</a> emails you each new bulletin for free. Since bulletins moved to the Trust Center in September 2026, the email is the easiest way to hear about a hotfix, because a hotfix comes with its own bulletin on its own day.</p>



<p class="wp-block-paragraph">Magento patches close the holes in the core. Magento 2 security also depends on the extensions and custom code around it, and Adobe&#8217;s enforcement policy puts auditing third-party extensions and securing custom code on the merchant, alongside applying the patches.</p>



<h3 class="wp-block-heading">Put Patch Tuesday in the calendar</h3>



<p class="wp-block-paragraph">Patch Tuesday is the second Tuesday of the month, and the next one is November 10, 2026. Book a staging slot for the days after it, with the person who applies the files and the person who tests checkout.</p>



<p class="wp-block-paragraph">Read your extension vendors&#8217; changelogs in the same slot. In November it comes right before the <a href="https://scandiweb.com/blog/black-friday-code-freeze/" target="_blank" rel="noopener">Black Friday code freeze</a>, so book it early.</p>



<h3 class="wp-block-heading">Decide who applies the patches</h3>



<p class="wp-block-paragraph">A developer on your team can do it with server access and a staging copy. The job is the seven steps above once a month, plus a hotfix now and then. To budget for it, see <a href="https://scandiweb.com/blog/magento-developer-cost/" target="_blank" rel="noopener">what a Magento developer costs</a> per hour and on a retainer.</p>



<p class="wp-block-paragraph">A support partner applies them on a schedule and runs the same staging test, which suits a store with no developer of its own.</p>



<p class="wp-block-paragraph">A third option is Ari, the AI agent for Magento built by scandiweb. Your team asks for the month&#8217;s patch in chat. Ari applies and checks it on a copy of the store with customer data removed, the team reviews the result on a preview store, and a person approves it and releases it as a pull request. Ari has no access to the live store, its servers, or the live database. See how Ari can <a href="https://www.withari.ai/technical-improvements" target="_blank" rel="noopener">apply Magento security patches</a> for your 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/11/magento-security-patch-ari-security.png" alt="withari.ai security page: Ari&#x27;s store copy without customer data, a change waiting for approval and no live store access" class="wp-image-26745" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-ari-security.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-ari-security-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-ari-security-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-ari-security-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-ari-security-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-ari-security-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/magento-security-patch-ari-security-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;">Ari works on a copy of the store without customer data, and a person on your team approves each change.</figcaption></figure></div>



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



<h3 class="wp-block-heading">Are Magento security patches cumulative?</h3>



<p class="wp-block-paragraph">Security patch releases are cumulative: each -p release includes the security and quality fixes of the patch release before it. Monthly isolated patch files are not. Adobe calls them non-cumulative, standalone files, so you apply every month&#8217;s file in release order on top of the latest -p release for your version line.</p>



<h3 class="wp-block-heading">Can I skip a month of Magento security patches?</h3>



<p class="wp-block-paragraph">No. Adobe builds each monthly isolated patch on top of the previous month&#8217;s, so a store that missed September has to apply September&#8217;s files before October&#8217;s. Within a month, apply the CE file first, then EE, then the matching B2B file if you run B2B. Run <code>php vendor/bin/patch-status</code> afterward to check that nothing is missing.</p>



<h3 class="wp-block-heading">Do I still need a hotfix if I install the monthly patch?</h3>



<p class="wp-block-paragraph">Yes. Adobe&#8217;s October 2026 knowledge base article says the hotfix for CVE-2026-75650 from bulletin APSB26-146 is not included in the October isolated patch file and must be applied separately. Adobe also reported that this flaw was exploited in the wild, and its notice asks merchants to rotate the encryption key and every exposed credential.</p>



<h3 class="wp-block-heading">Can I apply Magento security patches with Composer?</h3>



<p class="wp-block-paragraph">Partly. Security patch releases such as 2.4.8-p5 install with Composer, using <code>composer require-commerce</code> and <code>composer update</code>. Monthly isolated patch files are not Composer packages, so you apply them with the patch command. Adobe also says it does not support applying its official patches through the cweagans/composer-patches plugin, which is meant for your own fixes.</p>



<h3 class="wp-block-heading">Does Magento Open Source get security patches?</h3>



<p class="wp-block-paragraph">Yes, for supported versions. Adobe&#8217;s monthly isolated patches cover Magento Open Source as well as Adobe Commerce, but the October 2026 files for Open Source were available only for 2.4.7 and later. Bulletin APSB26-153 lists Open Source 2.4.6 as affected without a fixed version, so 2.4.6 stores need an upgrade plan.</p>



<h3 class="wp-block-heading">Is the Magento Security Scan Tool free?</h3>



<p class="wp-block-paragraph">Yes. Adobe&#8217;s Security Scan Tool is free from the dashboard of your Commerce or Magento account, for both Adobe Commerce and Magento Open Source. It runs more than 21,000 security tests, watches for security risks and malware, and can run weekly, daily or on demand. A Magento security scan checks the live site from the outside, so pair it with patch-status, which reads the code. See <a href="https://experienceleague.adobe.com/en/docs/commerce-admin/systems/security/security-scan" target="_blank" rel="noopener">Adobe&#8217;s Security Scan Tool guide</a>.</p>



<h2 class="wp-block-heading">Keep every Magento security patch on schedule</h2>



<p class="wp-block-paragraph">A Magento security patch is only done when the files for every month since your last -p release are applied in order and patch-status shows no missing patches. Check your version and edition today, read the latest bulletin, test the files on a staging copy, and book the next Patch Tuesday in the team calendar.</p>



<p class="wp-block-paragraph">Whoever applies them, the staging test before release is the step that protects checkout. If nobody on your team owns the monthly patch slot, scandiweb&#8217;s <a href="https://scandiweb.com/magento-support" target="_blank" rel="noopener">Magento support and maintenance</a> plans apply Adobe security patches on schedule, tested before release.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Are Magento security patches cumulative?", "acceptedAnswer": {"@type": "Answer", "text": "Security patch releases are cumulative: each -p release includes the security and quality fixes of the patch release before it. Monthly isolated patch files are not. Adobe calls them non-cumulative, standalone files, so you apply every month's file in release order on top of the latest -p release for your version line."}}, {"@type": "Question", "name": "Can I skip a month of Magento security patches?", "acceptedAnswer": {"@type": "Answer", "text": "No. Adobe builds each monthly isolated patch on top of the previous month's, so a store that missed September has to apply September's files before October's. Within a month, apply the CE file first, then EE, then the matching B2B file if you run B2B. Run php vendor/bin/patch-status afterward to check that nothing is missing."}}, {"@type": "Question", "name": "Do I still need a hotfix if I install the monthly patch?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Adobe's October 2026 knowledge base article says the hotfix for CVE-2026-75650 from bulletin APSB26-146 is not included in the October isolated patch file and must be applied separately. Adobe also reported that this flaw was exploited in the wild, and its notice asks merchants to rotate the encryption key and every exposed credential."}}, {"@type": "Question", "name": "Can I apply Magento security patches with Composer?", "acceptedAnswer": {"@type": "Answer", "text": "Partly. Security patch releases such as 2.4.8-p5 install with Composer, using composer require-commerce and composer update. Monthly isolated patch files are not Composer packages, so you apply them with the patch command. Adobe also says it does not support applying its official patches through the cweagans/composer-patches plugin, which is meant for your own fixes."}}, {"@type": "Question", "name": "Does Magento Open Source get security patches?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, for supported versions. Adobe's monthly isolated patches cover Magento Open Source as well as Adobe Commerce, but the October 2026 files for Open Source were available only for 2.4.7 and later. Bulletin APSB26-153 lists Open Source 2.4.6 as affected without a fixed version, so 2.4.6 stores need an upgrade plan."}}, {"@type": "Question", "name": "Is the Magento Security Scan Tool free?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Adobe's Security Scan Tool is free from the dashboard of your Commerce or Magento account, for both Adobe Commerce and Magento Open Source. It runs more than 21,000 security tests, watches for security risks and malware, and can run weekly, daily or on demand. A Magento security scan checks the live site from the outside, so pair it with patch-status, which reads the code. See Adobe's Security Scan Tool guide."}}]}</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 you want a second pair of eyes on your patch status, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>talk to our Magento support team</em></a><em>.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-security-patch/">How to Apply a Magento Security Patch (and Know Which Ones You Need)</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Magento 2 Varnish Configuration: Setup, VCL Tuning, and Hit-Rate Fixes</title>
		<link>https://scandiweb.com/blog/magento-2-varnish-configuration/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 14: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=26592</guid>

					<description><![CDATA[<p>Magento 2 Varnish configuration for 2.4.9 and Varnish 8: generate the VCL, fix purges and health checks, then measure what still misses the cache.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-2-varnish-configuration/">Magento 2 Varnish Configuration: Setup, VCL Tuning, and Hit-Rate Fixes</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-mvarn 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">Setting up Varnish, the caching server Adobe recommends in front of every live Magento 2 (Adobe Commerce) store, usually takes an afternoon. It keeps finished copies of your pages and hands them to shoppers, so Magento doesn&#8217;t have to build each page again. You install it, switch the store over in the admin, load the file Magento generates, and restart. A test page comes back from the cache at once, and at the time, the Magento 2 Varnish configuration looks finished.</p>



<p class="wp-block-paragraph">Then the odd problems start: a price change that doesn&#8217;t show, a homepage that loses its styling after a release, error pages that come and go.</p>



<p class="wp-block-paragraph">The admin setting only tells Magento that Varnish exists. What Varnish keeps, for how long, and what it drops when a product changes is set in the VCL, the file of rules Varnish runs. Even then, some requests go on to Magento, where the shopper waits for the page build.</p>



<h2 class="wp-block-heading">What a Magento 2 Varnish configuration includes</h2>



<p class="wp-block-paragraph">A Magento 2 Varnish configuration has four parts: Varnish itself, at a version Adobe supports and with enough memory, the Full Page Cache setting in the Magento admin, the VCL file that Magento generates and Varnish runs, and the purge hosts in Magento&#8217;s env.php file, which let Magento clear pages from Varnish when content changes.</p>



<p class="wp-block-paragraph">In production, Varnish is the <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">full page cache</a>. How a page is cached, keyed and purged is covered in that guide, so this one stays on the Varnish side.</p>



<figure class="wp-block-table"><table><thead><tr><th>Part</th><th>Where it lives</th><th>How you set it</th></tr></thead><tbody><tr><td>Varnish and its startup options</td><td>The Varnish server</td><td>Package install, then <code>varnishd</code> options for port, memory and limits</td></tr><tr><td>Caching Application and Varnish fields</td><td>Magento admin, Full Page Cache section</td><td>Admin or <code>bin/magento config:set</code></td></tr><tr><td>The VCL</td><td><code>/etc/varnish/default.vcl</code> on the Varnish server</td><td>Admin export button or <code>bin/magento varnish:vcl:generate</code></td></tr><tr><td>Purge hosts</td><td><code>app/etc/env.php</code>, key <code>http_cache_hosts</code></td><td><code>bin/magento setup:config:set --http-cache-hosts</code></td></tr></tbody></table><figcaption class="wp-element-caption">The parts of a Magento 2 Varnish configuration, where each lives and how you set it</figcaption></figure>



<p class="wp-block-paragraph">VCL stands for Varnish Configuration Language. The file Magento generates is a starting point, and once you edit it, it is yours: keep your changes in version control and reapply them after each re-export, because a new export doesn&#8217;t carry them.</p>



<h2 class="wp-block-heading">Which Varnish version does Magento 2 support?</h2>



<p class="wp-block-paragraph">Magento 2.4.9 supports Varnish 8, according to <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/system-requirements" target="_blank" rel="noopener">Adobe&#8217;s system requirements</a>, and so does the latest 2.4.8 patch, 2.4.8-p5. Our <a href="https://scandiweb.com/blog/magento-2-system-requirements/" target="_blank" rel="noopener">Magento 2 system requirements</a> guide lists the other versions each release needs. Earlier 2.4.8 releases list Varnish 7.x, and Adobe&#8217;s table gives a version for each older patch line as well. Magento&#8217;s VCL generator includes templates for Varnish 6 and 7 only, so on Varnish 8, generate the Varnish 7 file and test it on staging first.</p>



<figure class="wp-block-table"><table><thead><tr><th>Magento release</th><th>Varnish (Adobe, Oct 13, 2026)</th><th>VCL templates it can generate</th></tr></thead><tbody><tr><td>2.4.9</td><td>8</td><td>Varnish 6, Varnish 7</td></tr><tr><td>2.4.8-p5</td><td>8</td><td>Varnish 6, Varnish 7</td></tr><tr><td>2.4.8-p4</td><td>7.7</td><td>Varnish 6, Varnish 7</td></tr><tr><td>2.4.8</td><td>7.6</td><td>Varnish 6, Varnish 7</td></tr></tbody></table><figcaption class="wp-element-caption">Supported Varnish versions by Magento release, and the VCL templates each release includes</figcaption></figure>



<p class="wp-block-paragraph">Supported Varnish versions and the VCL templates each Magento release includes. The 2.4.7 line and older have no Varnish 7 template, even where Adobe lists Varnish 8 for their latest patch.</p>



<p class="wp-block-paragraph">The template number is the lowest Varnish version it supports. On 2.4.9 the Varnish 6 and Varnish 7 files are identical apart from two comment lines, so either one gives the same rules, and nothing in them uses the functions that the <a href="https://vinyl-cache.org/docs/8.0/whats-new/upgrading-8.0.html" target="_blank" rel="noopener">Varnish 8.0 upgrade notes</a> list as removed. Adobe hasn&#8217;t published a Varnish 8 template, so compile the file with <code>varnishd -C -f default.vcl</code> on your Varnish 8 build and run a purge on staging before it goes live.</p>



<h3 class="wp-block-heading">Varnish 8 and the Vinyl Cache name</h3>



<p class="wp-block-paragraph">Varnish is still in use, and Adobe still strongly recommends it in production. The open-source project behind it is <a href="https://vinyl-cache.org/intro" target="_blank" rel="noopener">now called Vinyl Cache</a>. Varnish Cache 8.0, released in September 2025, was its last release line under the old name, and Vinyl Cache 9.0 followed in March 2026. Varnish Software continues a separate distribution that keeps the Varnish Cache name. Adobe&#8217;s table says Varnish 8, so install the newest 8.0.x package, 8.0.2 at the time of writing, and check it with <code>varnishd -V</code> before you generate the VCL. The September 2026 advisory <a href="https://vinyl-cache.org/security/VSV00020.html" target="_blank" rel="noopener">VSV00020</a> covers 8.0.2, but only for VCL that calls the <code>.upper()</code> or <code>.lower()</code> string methods, and the file Magento generates calls neither.</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 Magento 2.4.9, <code>bin/magento varnish:vcl:generate</code> still defaults to the Varnish 6 template. Pass <code>--export-version=7</code> when you run Varnish 7 or 8.</p></div>



<h2 class="wp-block-heading">How to configure Varnish for Magento 2, step by step</h2>



<p class="wp-block-paragraph">To configure Varnish for Magento 2:</p>



<ol class="wp-block-list">
<li>Put Varnish on port 80 and move the web server to port 8080.</li>


<li>Set Caching Application to Varnish Cache in the admin.</li>


<li>Generate the VCL with <code>bin/magento varnish:vcl:generate --export-version=7</code>.</li>


<li>Check the health check URL.</li>


<li>Allow Magento to purge.</li>


<li>Set memory and header limits, then restart.</li>

</ol>



<p class="wp-block-paragraph">These steps assume Magento on-premises. On Adobe Commerce Cloud, skip to the last section.</p>



<h3 class="wp-block-heading">1. Put Varnish in front of the web server</h3>



<p class="wp-block-paragraph">Varnish listens on port 80 and the web server, nginx or Apache, moves to port 8080, as in Adobe&#8217;s guide to <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/config-varnish-server" target="_blank" rel="noopener">configuring nginx for Varnish</a>. Use an IP address or hostname for the backend rather than localhost, even on one machine. For HTTPS, a TLS terminator in front of Varnish passes <code>X-Forwarded-Proto: https</code>, the header Magento&#8217;s VCL expects by default, so HTTP and HTTPS copies of a page stay apart.</p>



<h3 class="wp-block-heading">2. Switch Magento to Varnish and generate the VCL</h3>



<p class="wp-block-paragraph">In the admin&#8217;s Full Page Cache section, set Caching Application to Varnish Cache (Recommended), fill in the access list, backend host and port, and grace period, then use the export button for your Varnish version. On 2.4.9 there are buttons for Varnish 6 and Varnish 7. The command line does the same with <code>bin/magento varnish:vcl:generate</code> and the options in <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/tools/cli-reference/commerce-on-premises" target="_blank" rel="noopener">Adobe&#8217;s CLI reference</a>. Two traps: the default <code>--export-version</code> is still 6, and <code>--access-list</code> takes one IP per flag. Back up <code>/etc/varnish/default.vcl</code> before you replace it, then restart Varnish.</p>



<p class="wp-block-paragraph">A starting point. Replace the IPs with your own servers.</p>



<pre class="wp-block-code"><code>bin/magento varnish:vcl:generate \
  --export-version=7 \
  --backend-host=192.0.2.20 \
  --backend-port=8080 \
  --access-list=192.0.2.20 \
  --access-list=192.0.2.21 \
  --grace-period=300 \
  --output-file=/tmp/default.vcl</code></pre>



<h3 class="wp-block-heading">3. Point the health check at the right file</h3>



<p class="wp-block-paragraph">The probe calls <code>health_check.php</code> every 5 seconds with a 2-second timeout and marks the backend sick when fewer than 5 of the last 10 checks pass. The script returns 500 when MySQL or the cache storage can&#8217;t be reached. The path depends on your web root. The VCL from 2.4.7 on probes <code>/health_check.php</code>, which fits a web root of <code>pub/</code>. With the Magento folder as the web root, use the older <code>/pub/health_check.php</code> form, which Adobe&#8217;s advanced page still shows, because Magento keeps the script only in <code>pub/</code>. Open the URL from the Varnish server to confirm it answers, because a wrong path fails every check and Varnish then treats Magento as down.</p>



<p class="wp-block-paragraph">From the 2.4.9 VCL. Use /pub/health_check.php if your web root is the Magento folder rather than pub/.</p>



<pre class="wp-block-code"><code>backend default {
    .host = "192.0.2.20";
    .port = "8080";
    .first_byte_timeout = 600s;
    .probe = {
        .url = "/health_check.php";
        .timeout = 2s;
        .interval = 5s;
        .window = 10;
        .threshold = 5;
    }
}</code></pre>



<h3 class="wp-block-heading">4. Let Magento purge Varnish</h3>



<p class="wp-block-paragraph">When a product, category or price changes, Magento sends a PURGE request with the cache tags to each host in <code>http_cache_hosts</code>. Set them with <code>setup:config:set --http-cache-hosts</code>. Without them, Magento purges the store&#8217;s own host name on port 80, which misses a Varnish on another port or server. Varnish accepts a purge only from an IP in <code>acl purge</code> and answers 405 otherwise. In most setups that means the address of every server that runs Magento, which is what the generator&#8217;s access list is for. Adobe&#8217;s page words it as the Varnish host&#8217;s IP, the same machine when the two share a server, so with a load balancer in between, check which address Varnish sees. On several web servers, as in an <a href="https://scandiweb.com/blog/server-autoscaling-in-magento-2/" target="_blank" rel="noopener">autoscaling setup</a>, every node sends purges. When Magento can&#8217;t reach any purge host, it logs &#8220;No cache server(s) could be purged&#8221; in <code>var/log/system.log</code>. A 405 from Varnish leaves no log entry, so test each Magento server with the purge request below.</p>



<p class="wp-block-paragraph">Comma-separated, no spaces. The port can be left out for port 80. The test purge bans a tag that no page carries, so it clears nothing: 200 Purged means the server is allowed, 405 means it isn&#8217;t.</p>



<pre class="wp-block-code"><code>bin/magento setup:config:set --http-cache-hosts=192.0.2.30:80,192.0.2.31:80

# Run on each Magento server: 200 Purged = allowed, 405 = not in acl purge
curl -i -X PURGE -H 'X-Magento-Tags-Pattern: ((^|,)no_such_tag(,|$))' http://192.0.2.30/</code></pre>



<h3 class="wp-block-heading">5. Set memory and header limits before you go live</h3>



<p class="wp-block-paragraph">With no storage option, Varnish starts with 100 MB, and Adobe gives no size. Give it what the server can spare and watch the eviction counter covered in the measurement section. Category pages carry one cache tag per product in the <code>X-Magento-Tags</code> header, and past Varnish&#8217;s 8 KB default the browser gets 503 Backend Fetch Failed. <a href="https://experienceleague.adobe.com/en/docs/commerce-knowledge-base/kb/troubleshooting/miscellaneous/troubleshooting-503-errors" target="_blank" rel="noopener">Adobe&#8217;s 503 guidance</a> sizes <code>http_resp_hdr_len</code> from the largest category, product count times 21, and raises <code>http_resp_size</code> with it. Varnish takes the response headers from <code>workspace_backend</code>, 96 KB by default, which Adobe&#8217;s snippet also sets, so give it room above <code>http_resp_size</code>. These options live in your Varnish service file, and the path depends on the OS. Change them well before peak season and your <a href="https://scandiweb.com/blog/black-friday-code-freeze/" target="_blank" rel="noopener">code freeze</a>, then retest with a <a href="https://scandiweb.com/blog/magento-load-testing/" target="_blank" rel="noopener">load test</a> at peak traffic.</p>



<p class="wp-block-paragraph">A starting point from Adobe&#8217;s 503 guidance. Size the header limit from your largest category (products × 21), keep the workspace above the response size, and set the memory to what the server can spare.</p>



<pre class="wp-block-code"><code>varnishd -a :80 -f /etc/varnish/default.vcl \
  -s malloc,&lt;size&gt; \
  -p http_resp_hdr_len=65536 \
  -p http_resp_size=98304 \
  -p workspace_backend=131072</code></pre>



<h3 class="wp-block-heading">On Adobe Commerce Cloud, configure Fastly instead</h3>



<p class="wp-block-paragraph">On Adobe Commerce Cloud, full page caching uses <a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/cdn/fastly" target="_blank" rel="noopener">Fastly</a>, a Varnish-based CDN, through the Fastly CDN module that Adobe installs on Pro Staging and Production and on Starter Production. There is no <code>default.vcl</code> to edit, and custom rules go into Fastly custom VCL snippets. The VCL rules in the rest of this article describe what Magento expects from its cache. Fastly runs its own configuration.</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 single-page purges come back with a 405, Varnish doesn&#8217;t recognize the sender. Add the IP of every server that runs Magento to <code>acl purge</code>, then purge one URL again.</p></div>



<h2 class="wp-block-heading">What the Magento VCL does with query strings, cookies and TTLs</h2>



<p class="wp-block-paragraph">Magento&#8217;s VCL builds the cache key from the URL plus the X-Magento-Vary cookie, so other cookies don&#8217;t split the cache. On 2.4.9 it sorts query parameters and strips a fixed list of marketing parameters. It stores only 200 and 404 responses that aren&#8217;t marked private, and everything else goes to Magento.</p>



<p class="wp-block-paragraph">The generated VCL sets what counts as the same page. The rules below are read from the <a href="https://raw.githubusercontent.com/magento/magento2/2.4.9/app/code/Magento/PageCache/etc/varnish7.vcl" target="_blank" rel="noopener">VCL Magento 2.4.9 generates</a>, and several of them changed between releases.</p>



<h3 class="wp-block-heading">Query strings: sorted, and marketing parameters stripped</h3>



<p class="wp-block-paragraph">The 2.4.9 VCL sorts query parameters first, so <code>?color=red&amp;size=m</code> and <code>?size=m&amp;color=red</code> share one entry. Sorting is new in 2.4.9. It then removes known tracking parameters: <code>utm_</code> parameters, Google and Microsoft click IDs such as <code>gclid</code> and <code>msclkid</code>, <code>fbclid</code>, <code>mc_</code> parameters and a few more. Lists differ by release: 2.4.8 added the Google and Microsoft click IDs, and Magento&#8217;s development branch already carries a much longer list. A parameter missing from your release&#8217;s list gives every click its own cache entry. Add it to both regex lines in <code>vcl_recv</code> and note the change for the next re-export. Filter parameters must stay, because they change the page. The removal pattern only checks that the URL holds a tracking parameter, then cuts every match, even inside a longer name: on 2.4.9 a link to <code>?country_of_origin=12&amp;utm_source=newsletter</code> reaches Magento as <code>?country_of_</code>, so the shopper lands on the unfiltered page. If a filter or other parameter name ends in a listed name, such as <code>origin</code> or <code>ie</code>, anchor the pattern to <code>?</code> or <code>&amp;</code>.</p>



<h3 class="wp-block-heading">Cookies: only X-Magento-Vary splits the cache</h3>



<p class="wp-block-paragraph">X-Magento-Vary is the cookie in which Magento records the shopper&#8217;s context, such as customer group, store and currency. The VCL hashes only that value out of the Cookie header, so analytics and consent cookies don&#8217;t create extra copies of a page. It removes Set-Cookie from cacheable responses, and since 2.4.7 it won&#8217;t store a page whose response sets X-Magento-Vary when the request didn&#8217;t send it. Custom code that adds values to the context multiplies the copies of every page. Passing requests on session cookies, as some tutorials advise, adds nothing, because the hash already ignores them.</p>



<h3 class="wp-block-heading">TTLs, status codes and pages Varnish won&#8217;t store</h3>



<p class="wp-block-paragraph">The TTL comes from Magento&#8217;s <code>s-maxage</code> header, set by the admin field &#8220;TTL for public content&#8221;, 86400 seconds by default. Only 200 and 404 responses that aren&#8217;t marked private are stored. A response marked no-cache or no-store gets a two-minute marker, and requests in that window go straight to Magento. The VCL comment calls the marker hit-for-pass, while Varnish 8&#8217;s reference says <code>beresp.uncacheable</code> produces a hit-for-miss object, so expect these requests in <code>cache_hitmiss</code> rather than <code>cache_hitpass</code>. Browsers get <code>no-store</code> for HTML, so the browser never holds a stale page. Static and media files pass by default, so serve them from the web server or a CDN.</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 tracking parameter that isn&#8217;t on Magento&#8217;s list, such as one your email or affiliate tool adds, gives every click its own cache entry. Add it to the regex in <code>vcl_recv</code>.</p></div>



<h2 class="wp-block-heading">Grace mode, purges and ESI in the Magento VCL</h2>



<p class="wp-block-paragraph">Magento&#8217;s VCL keeps every page for three days past its TTL. While the backend passes its health check, Varnish serves an expired page for the admin&#8217;s grace period, 300 seconds by default, and fetches a fresh one. If the check fails, it keeps serving stale pages. A purge from Magento, sent as a ban by cache tag, removes pages outright.</p>



<h3 class="wp-block-heading">Grace mode keeps expired pages for three days</h3>



<p class="wp-block-paragraph">The VCL keeps every object three days past its TTL. While the backend passes its health check, Varnish serves an expired copy for up to the admin&#8217;s grace period, 300 seconds by default, and refreshes it in the background. After that, the request waits for a fresh build. When the health check fails, Varnish keeps serving what it has, which keeps a store up through a short outage, as <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/config-varnish-advanced" target="_blank" rel="noopener">Adobe&#8217;s advanced Varnish page</a> describes. A <code>Grace</code> header on hits shows which case applied: &#8220;none&#8221; for a copy within its TTL, &#8220;normal (healthy server)&#8221; or &#8220;unlimited (unhealthy server)&#8221;. A page removed by a purge is not served in grace.</p>



<h3 class="wp-block-heading">Purges are bans by cache tag</h3>



<p class="wp-block-paragraph">Magento sends tags rather than URLs, so one product save can clear the product page, its categories and any block that shows it. Varnish turns each purge into a ban on <code>X-Magento-Tags</code>, which applies to every stored object with a matching tag. These are <code>obj.*</code> bans, so Varnish&#8217;s background ban lurker can clean them up. The next shopper gets a miss, unless a <a href="https://scandiweb.com/blog/magento-cache-warmer/" target="_blank" rel="noopener">cache warmer</a> requests the page first. Count bans in <code>MAIN.bans</code>: a number that climbs all day points to imports, cron jobs or mass saves.</p>



<h3 class="wp-block-heading">ESI blocks are cached on their own</h3>



<p class="wp-block-paragraph">ESI stands for Edge Side Includes, a way for Varnish to assemble a page from separately cached pieces. With Varnish selected, a layout block with its own <code>ttl</code>, such as the default theme&#8217;s top menu, becomes an ESI include that points at <code>page_cache/block/esi</code> and is cached with its own TTL and tags. The admin field &#8220;Handles params size&#8221; caps how many layout handles the include passes, 100 by default, and Magento&#8217;s own comment advises 50–100. Watch <code>MAIN.esi_errors</code>.</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-2-varnish-configuration-request-paths.png" alt="Magento 2 Varnish configuration: how a request is served as a hit, grace hit, miss or pass, and how a purge bans pages" class="wp-image-26589" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-request-paths.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-request-paths-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-request-paths-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-request-paths-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-request-paths-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-request-paths-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-request-paths-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;">Varnish answers hits and grace hits itself. Misses and passes go to Magento, and a purge from Magento bans every page with a matching cache tag.</figcaption></figure></div>



<h2 class="wp-block-heading">How to measure and raise your Varnish hit rate</h2>



<p class="wp-block-paragraph">To measure your Varnish hit rate in Magento 2:</p>



<ol class="wp-block-list">
<li>Read the X-Magento-Cache-Debug header: HIT, MISS or UNCACHEABLE.</li>


<li>Compare MAIN.cache_hit with MAIN.cache_miss in varnishstat.</li>


<li>Group requests by URL and result with varnishncsa.</li>


<li>Trace one slow URL with varnishlog.</li>


<li>Watch MAIN.n_lru_nuked for evictions and MAIN.bans for purges.</li>

</ol>



<p class="wp-block-paragraph">Varnish answers hits. Every miss and pass goes to Magento, so the hit rate sets how much of your traffic waits for PHP.</p>



<h3 class="wp-block-heading">Read the cache headers</h3>



<p class="wp-block-paragraph">The VCL sets <code>X-Magento-Cache-Debug</code> on every response: HIT, MISS, or UNCACHEABLE on 2.4.7 and later. UNCACHEABLE means Magento told Varnish to skip the page. It&#8217;s there in production mode too, although Adobe&#8217;s verification page says to switch to developer mode to see the headers. Developer mode only adds <code>X-Magento-Cache-Control</code> and keeps <code>Age</code>. If the debug header is missing, the response didn&#8217;t pass through Magento&#8217;s VCL, so check that Varnish loaded the new file and that no proxy or CDN in front removes the header. If the header says HIT and the page is still slow, the wait is elsewhere: see <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">why a Magento site gets slow</a>.</p>



<h3 class="wp-block-heading">Count hits and misses with varnishstat</h3>



<p class="wp-block-paragraph">varnishstat is Varnish&#8217;s live counter tool. The <a href="https://vinyl-cache.org/docs/8.0/reference/varnish-counters.html" target="_blank" rel="noopener">Varnish 8 counters</a> that matter: <code>cache_hit</code> (which includes grace hits, counted separately in <code>cache_hit_grace</code>), <code>cache_miss</code>, <code>cache_hitpass</code> and <code>cache_hitmiss</code> for the &#8220;don&#8217;t cache&#8221; markers, <code>s_pass</code> for passes, <code>n_lru_nuked</code> for objects evicted to make room, and <code>bans</code>. A practical hit rate is hits divided by hits plus misses plus passes, measured over a busy day and per page type where you can. No published target fits every store, so measure your own.</p>



<h3 class="wp-block-heading">Find the URLs that miss with varnishncsa and varnishlog</h3>



<p class="wp-block-paragraph">varnishncsa writes one line per request. Log ten minutes or a busy day with the handling value and URL path, then group the lines to see which page types miss or pass. varnishlog follows one URL through Varnish and its backend request. Then time the pages that miss, as you would when you <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">audit your store page type by page type</a>, because misses show up in field data as slow <a href="https://scandiweb.com/blog/reduce-initial-server-response-time/" target="_blank" rel="noopener">server response time</a>.</p>



<p class="wp-block-paragraph">Run on the Varnish server. Counters are totals since Varnish started.</p>



<pre class="wp-block-code"><code># Hits, misses, passes, evictions and bans since Varnish started
varnishstat -1 | grep -E 'MAIN\.(cache_hit|cache_hit_grace|cache_miss|cache_hitpass|cache_hitmiss|s_pass|n_lru_nuked|bans) '

# Ten minutes of requests: how Varnish handled each URL path
timeout 600 varnishncsa -F '%{Varnish:handling}x %U' &gt; /tmp/handling.txt
sort /tmp/handling.txt | uniq -c | sort -rn | head -30

# Follow one URL through Varnish and Magento
varnishlog -g request -q 'ReqURL ~ "^/women/tops"'</code></pre>



<h3 class="wp-block-heading">Fix what keeps the hit rate low</h3>



<p class="wp-block-paragraph">Match what the log shows to the change that fixes it.</p>



<ol class="wp-block-list">
<li>Many pass or hitmiss lines on catalog pages: find what sends <code>Cache-Control: private</code>, no-cache or a block marked <code>cacheable="false"</code>.</li>


<li>Misses on the same URLs again and again, with <code>MAIN.bans</code> climbing: move imports and mass saves off-peak, and stop flushing the cache on every deploy.</li>


<li>Misses with <code>n_lru_nuked</code> climbing: Varnish is evicting pages to make room, so give it more memory.</li>


<li>Many one-off URLs: strip the extra tracking parameters, and accept that <a href="https://scandiweb.com/blog/layered-navigation-causing-problems-deal-with-it/" target="_blank" rel="noopener">layered navigation</a> filters and rare searches miss more often.</li>


<li>503 errors: raise the header limits and check the health check URL, as in the setup steps.</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-2-varnish-configuration-hit-rate-tree.png" alt="Magento 2 Varnish configuration hit-rate tree: from varnishncsa results to the fix for passes, misses, evictions and 503s" class="wp-image-26590" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-hit-rate-tree.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-hit-rate-tree-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-hit-rate-tree-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-hit-rate-tree-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-hit-rate-tree-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-hit-rate-tree-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-varnish-configuration-hit-rate-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;">Sort requests by how Varnish handled them first. Passes point to headers and cookies, repeated misses to purges or memory, and one-off misses to too many URL variants.</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>Group one busy day of requests by URL and result with varnishncsa before you edit the VCL. Tune the page types with the most misses first.</p></div>



<h2 class="wp-block-heading">What still reaches PHP when Varnish is tuned</h2>



<p class="wp-block-paragraph">Even with a tuned VCL, Varnish passes every POST, cart, checkout and account request to Magento. It also misses the first request after each purge, rare filter and search URLs, and each customer group&#8217;s first view of a page. Those shoppers wait while Magento builds the page in PHP, so the build speed sets their response time. A miss also runs the database queries behind each block, covered in our <a href="https://scandiweb.com/blog/magento-mysql-optimization/" target="_blank" rel="noopener">Magento MySQL optimization</a> guide. Server response on uncached pages is also where Magento trails most other platforms, as our <a href="https://scandiweb.com/blog/fastest-ecommerce-platform/" target="_blank" rel="noopener">fastest eCommerce platforms</a> research shows.</p>



<p class="wp-block-paragraph">A pass or a miss costs a full page build in PHP, and that build is the time those shoppers wait. Cache settings move requests between the two groups, and for the second group only the build speed counts.</p>



<p class="wp-block-paragraph"><a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a>, scandiweb&#8217;s software for the server-side page build, works on exactly those requests. It speeds up how Magento builds each page by applying Liquid, the open-source template language created at Shopify, and its core is open source. It runs on Magento 2 Open Source, Adobe Commerce and Commerce Cloud, with Luma, Hyvä or a custom theme and on any hosting, and it leaves the theme, design, data, admin, catalog, prices, checkout and orders as they are. Pages that reach Magento are built at least 2x faster, and the same server handles 3x the traffic before response times start to rise.</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">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. The method and caveats are in the <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">Expedio benchmark</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>Time a filtered category page right after a purge. That is the wait every shopper gets on a miss, and no cache setting shortens it.</p></div>



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



<h3 class="wp-block-heading">Which Varnish version should I use with Magento 2.4.9?</h3>



<p class="wp-block-paragraph">Use Varnish 8. Adobe&#8217;s system requirements list Varnish 8 for Magento 2.4.9 and 2.4.8-p5, and give a version for each older patch line. Magento&#8217;s VCL generator has no Varnish 8 template, so generate the Varnish 7 file with <code>--export-version=7</code>, then test it on staging before it goes to production.</p>



<h3 class="wp-block-heading">How do I generate the Varnish VCL for Magento 2 from the command line?</h3>



<p class="wp-block-paragraph">Run <code>bin/magento varnish:vcl:generate</code>. It prints the VCL, or writes it to a file with <code>--output-file</code>. Set <code>--export-version</code> to 7 for Varnish 7 or 8, because the default is still 6, and pass the backend host and port, the grace period, and each IP allowed to purge with <code>--access-list</code>. Then replace <code>/etc/varnish/default.vcl</code> and restart Varnish.</p>



<h3 class="wp-block-heading">Why does Varnish return 503 Backend Fetch Failed on Magento?</h3>



<p class="wp-block-paragraph">One common cause is response headers that are bigger than Varnish allows. Category pages carry a cache tag for each product in the X-Magento-Tags header, and Varnish&#8217;s default limit is 8 KB. Adobe suggests setting <code>http_resp_hdr_len</code> to your largest category&#8217;s product count times 21, for example 65536, and raising <code>http_resp_size</code> above it.</p>



<h3 class="wp-block-heading">Why are Magento pages not being purged from Varnish?</h3>



<p class="wp-block-paragraph">Magento sends a PURGE request to every host in <code>http_cache_hosts</code>, and Varnish answers 405 unless the sender&#8217;s IP is in the VCL&#8217;s acl purge list. Set the hosts with <code>bin/magento setup:config:set --http-cache-hosts</code>, add each Magento server&#8217;s IP to acl purge, then send a test PURGE from each one: 200 means Varnish accepts it, 405 means the IP is missing. Magento logs &#8220;No cache server(s) could be purged&#8221; only when it can&#8217;t reach any host.</p>



<h3 class="wp-block-heading">What is the difference between Varnish and Redis caches?</h3>



<p class="wp-block-paragraph">Varnish caches whole pages in front of the web server, so a cache hit never reaches Magento. Redis, or Valkey on Magento 2.4.9, holds Magento&#8217;s own cache data and sessions in memory, which speeds up the work Magento does when Varnish misses. Most production stores run both: Varnish for pages, Valkey or Redis for the rest.</p>



<h3 class="wp-block-heading">Is Varnish used on Adobe Commerce Cloud?</h3>



<p class="wp-block-paragraph">No. On Adobe Commerce Cloud, full page caching uses Fastly, a Varnish-based CDN, instead of a Varnish server you run yourself. Adobe installs the Fastly CDN module for Magento 2 on Pro Staging and Production and on Starter Production. Custom caching rules go into Fastly custom VCL snippets rather than a default.vcl file.</p>



<h2 class="wp-block-heading">Magento 2 Varnish configuration: what to check after every upgrade</h2>



<p class="wp-block-paragraph">A Magento 2 Varnish configuration is done when you can show three things: the VCL matches your Magento and Varnish versions, Magento&#8217;s purges reach every Varnish host, and you know your hit rate by page type. Check all three after every upgrade. Then make the requests Varnish sends on to Magento faster.</p>



<p class="wp-block-paragraph">The version table, the health check path and the marketing parameter list are the three things that change most often between releases, so re-export the VCL after each upgrade and diff it against the one in production. Where the two differ, carry your own changes into the new file, and keep a Magento 2 Varnish check on the release checklist. For the layers around Varnish, from PHP to the browser, see how to <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">speed up Magento</a> layer by layer.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Which Varnish version should I use with Magento 2.4.9?", "acceptedAnswer": {"@type": "Answer", "text": "Use Varnish 8. Adobe's system requirements list Varnish 8 for Magento 2.4.9 and 2.4.8-p5, and give a version for each older patch line. Magento's VCL generator has no Varnish 8 template, so generate the Varnish 7 file with --export-version=7, then test it on staging before it goes to production."}}, {"@type": "Question", "name": "How do I generate the Varnish VCL for Magento 2 from the command line?", "acceptedAnswer": {"@type": "Answer", "text": "Run bin/magento varnish:vcl:generate. It prints the VCL, or writes it to a file with --output-file. Set --export-version to 7 for Varnish 7 or 8, because the default is still 6, and pass the backend host and port, the grace period, and each IP allowed to purge with --access-list. Then replace /etc/varnish/default.vcl and restart Varnish."}}, {"@type": "Question", "name": "Why does Varnish return 503 Backend Fetch Failed on Magento?", "acceptedAnswer": {"@type": "Answer", "text": "One common cause is response headers that are bigger than Varnish allows. Category pages carry a cache tag for each product in the X-Magento-Tags header, and Varnish's default limit is 8 KB. Adobe suggests setting http_resp_hdr_len to your largest category's product count times 21, for example 65536, and raising http_resp_size above it."}}, {"@type": "Question", "name": "Why are Magento pages not being purged from Varnish?", "acceptedAnswer": {"@type": "Answer", "text": "Magento sends a PURGE request to every host in http_cache_hosts, and Varnish answers 405 unless the sender's IP is in the VCL's acl purge list. Set the hosts with bin/magento setup:config:set --http-cache-hosts, add each Magento server's IP to acl purge, then send a test PURGE from each one: 200 means Varnish accepts it, 405 means the IP is missing. Magento logs \"No cache server(s) could be purged\" only when it can't reach any host."}}, {"@type": "Question", "name": "What is the difference between Varnish and Redis caches?", "acceptedAnswer": {"@type": "Answer", "text": "Varnish caches whole pages in front of the web server, so a cache hit never reaches Magento. Redis, or Valkey on Magento 2.4.9, holds Magento's own cache data and sessions in memory, which speeds up the work Magento does when Varnish misses. Most production stores run both: Varnish for pages, Valkey or Redis for the rest."}}, {"@type": "Question", "name": "Is Varnish used on Adobe Commerce Cloud?", "acceptedAnswer": {"@type": "Answer", "text": "No. On Adobe Commerce Cloud, full page caching uses Fastly, a Varnish-based CDN, instead of a Varnish server you run yourself. Adobe installs the Fastly CDN module for Magento 2 on Pro Staging and Production and on Starter Production. Custom caching rules go into Fastly custom VCL snippets rather than a default.vcl file."}}]}</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 you&#x27;re moving to Varnish 8 for Magento 2.4.9, or your hit rate is lower than you expected, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>talk to our Magento team</em></a><em> about a review of your VCL and purge setup.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-2-varnish-configuration/">Magento 2 Varnish Configuration: Setup, VCL Tuning, and Hit-Rate Fixes</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Install an Extension in Magento 2: Composer, ZIP, and a No-Code Option</title>
		<link>https://scandiweb.com/blog/how-to-install-magento-2-extension/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 12:24: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 2 extensions]]></category>
		<category><![CDATA[Magento Extensions]]></category>
		<category><![CDATA[magento marketplace extension]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26707</guid>

					<description><![CDATA[<p>How to install an extension in Magento 2 with Composer or a ZIP file: the exact commands, the checks to run first, and how to roll back if it breaks.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/how-to-install-magento-2-extension/">How to Install an Extension in Magento 2: Composer, ZIP, and a No-Code Option</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-inext wp-block-lazyblock-related"><div class="related-services">
  <h3>Related Services</h3>
  <ul>
    
    <li>
      <a  href="https://scandiweb.com/magento-support" target=_blank >
        Magento Support
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-website-development" target=_blank >
        Magento Development
      </a>
    </li>
    
    <li>
      <a  href="https://scandiweb.com/magento-integration-services" target=_blank >
        Magento Integration Services
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">Installing an extension in Magento 2 (Adobe Commerce), an add-on that brings a feature such as a blog or a one-page checkout, takes a handful of commands. Most vendors print them right on the download page.</p>



<p class="wp-block-paragraph">What goes wrong is everything around those commands. The extension may need a newer version of PHP, the programming language Magento runs on, than your server has. Or a second extension you already run may change the same part of checkout. Neither problem shows up while you type. You find out when a page fails to load or checkout stops taking orders, and if the install ran on the live store, your customers find out at the same moment.</p>



<h2 class="wp-block-heading">What you need before you install a Magento 2 extension</h2>



<p class="wp-block-paragraph">Before you install an extension in Magento 2, you need command-line access to the server as the file system owner, the extension&#8217;s Composer name and version, and access keys from the Adobe Commerce Marketplace if you bought it there. You also need a staging copy of the store and a fresh database backup.</p>



<p class="wp-block-paragraph">The file system owner is the server user that owns the Magento files. On shared hosting, Adobe says this is the user your provider gives you to log in. Staging is a private copy of the store that matches the live one, and every command in this guide runs there first.</p>



<h3 class="wp-block-heading">Access keys for Adobe Commerce Marketplace extensions</h3>



<p class="wp-block-paragraph">To install a Magento 2 extension from the Marketplace, you need a pair of access keys. Magento extensions bought on the Adobe Commerce Marketplace, the former Magento Marketplace, download from repo.magento.com, which asks for them. You <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/prerequisites/authentication-keys" target="_blank" rel="noopener">create access keys in the Marketplace</a> under your account name &gt; My Profile &gt; Access Keys &gt; Create a New Access Key. The public key is the username and the private key is the password.</p>



<p class="wp-block-paragraph">Use the keys of the account that installed the store. Adobe says a key from another user or a shared account cannot be used. Check that your composer.json lists https://repo.magento.com/ under repositories. An extension bought from a vendor&#8217;s own site comes with the vendor&#8217;s own repository or a ZIP file instead.</p>



<h3 class="wp-block-heading">An extension that matches your Magento and PHP versions</h3>



<p class="wp-block-paragraph">Open the extension&#8217;s composer.json and read its require block, or check the vendor&#8217;s listing, for the Magento and PHP versions it supports. Adobe&#8217;s advice for Cloud projects, to check the required PHP version before you begin, applies to every store.</p>



<p class="wp-block-paragraph">If the extension needs a newer Magento release than yours, the install turns into an upgrade first: see <a href="https://scandiweb.com/blog/how-to-upgrade-magento-version-step-by-step-guide/" target="_blank" rel="noopener">how to upgrade Magento</a>, and check the <a href="https://scandiweb.com/blog/magento-end-of-life/" target="_blank" rel="noopener">Magento version support dates</a> to see whether your release still gets security patches. If your storefront runs on Hyvä, a theme that replaces Magento&#8217;s default Luma storefront, check now whether a compatibility module exists. The conflicts section below explains why.</p>



<h3 class="wp-block-heading">A staging copy and a backup you can restore</h3>



<p class="wp-block-paragraph">We&#8217;ve written about <a href="https://scandiweb.com/blog/best-magento-extensions/" target="_blank" rel="noopener">why staging and rollback matter</a> for every extension, so two practical points are enough here.</p>



<p class="wp-block-paragraph">Run every command on a copy of the store that matches production first. And take a database backup you can restore, with your host&#8217;s snapshot or a dump tool. Magento&#8217;s built-in backup command has been deprecated since 2.3.0 and is off by default, and Adobe points to other tools such as Percona XtraBackup.</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>Extensions from the Adobe Commerce Marketplace download from repo.magento.com, which asks for your access keys: the public key is the username and the private key is the password.</p></div>



<h2 class="wp-block-heading">How to install an extension in Magento 2 with Composer</h2>



<p class="wp-block-paragraph">To install an extension in Magento 2 with Composer, turn on maintenance mode and run composer require with the extension&#8217;s name and version. Then enable it with bin/magento module:enable and run setup:upgrade, setup:di:compile, and, in production mode, setup:static-content:deploy. Clean the cache, turn maintenance mode off, and configure the extension in the admin.</p>



<ol class="wp-block-list">
<li>Turn on maintenance mode: <code>bin/magento maintenance:enable</code> (add <code>--ip=</code> and your IP address to keep your own access).</li>


<li>Add the extension: <code>composer require vendor/module-name:version</code>, for example Adobe&#8217;s <code>composer require j2t/module-payplug:2.0.2</code>. If Composer asks for a username and password, enter your public key as the username and your private key as the password. Wait until Composer finishes without errors.</li>


<li>Check that it arrived: <code>bin/magento module:status Vendor_ModuleName</code>. The module name differs from the Composer name, and a new extension usually shows as disabled.</li>


<li>Enable it: <code>bin/magento module:enable Vendor_ModuleName --clear-static-content</code></li>


<li>Register it: <code>bin/magento setup:upgrade</code></li>


<li>Compile the code: <code>bin/magento setup:di:compile</code></li>


<li>In production mode, deploy static files: <code>bin/magento setup:static-content:deploy</code> (add your store&#8217;s locale codes, such as <code>en_US de_DE</code>, if it runs more than one language).</li>


<li>Clean the cache: <code>bin/magento cache:clean</code></li>


<li>Turn maintenance mode off with <code>bin/magento maintenance:disable</code>, then configure the extension in the admin.</li>

</ol>



<p class="wp-block-paragraph">The order follows <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/tutorials/extensions" target="_blank" rel="noopener">Adobe&#8217;s guide to third-party extensions</a>, with the static content deployment added for production mode. Composer is the PHP package manager Magento uses to download and track extensions. For what it does behind each command, our developer guide to <a href="https://scandiweb.com/blog/php-series-installing-a-composer-package/" target="_blank" rel="noopener">installing a Composer package</a> goes one level deeper.</p>



<h3 class="wp-block-heading">Developer mode or production mode: what changes</h3>



<p class="wp-block-paragraph">Check the mode with <code>bin/magento deploy:mode:show</code>. In production mode, Magento doesn&#8217;t generate static files such as CSS and JavaScript on its own, so step 7 is required. You may also be asked to rerun the compile command, and errors go to log files, never to the visitor&#8217;s screen.</p>



<p class="wp-block-paragraph">In developer mode, Magento compiles automatically and builds static files when a page asks for them, but Adobe still says to clean the old ones when you enable a module, which the <code>--clear-static-content</code> option in step 4 does. Errors display in the browser. Developer mode is not supported on Adobe Commerce Cloud.</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>After composer require, the extension is usually still disabled. It only runs once module:enable and setup:upgrade have registered it.</p></div>



<h2 class="wp-block-heading">How to install a Magento 2 extension manually from a ZIP file</h2>



<p class="wp-block-paragraph">To install a Magento 2 extension from a ZIP file, unpack it into app/code/Vendor/Module so that registration.php is in the root of that folder. Then run the same commands as a Composer install: module:enable, setup:upgrade, setup:di:compile, static content deployment in production mode, and cache:clean. Composer remains the safer route for updates and removal.</p>



<p class="wp-block-paragraph">Composer puts modules in the vendor folder. A module you unpack yourself goes in app/code, where Adobe recommends keeping a store&#8217;s own code.</p>



<ol class="wp-block-list">
<li>Unpack the archive into <code>app/code/Vendor/Module</code>, with the vendor and module folder names from the package. Check that <code>registration.php</code> is directly in that folder: every module needs one in its root.</li>


<li>If the vendor includes a shared base module, unpack that too. Mageplaza&#8217;s ZIP route, for example, has you download its Mageplaza_Core module separately, because a ZIP doesn&#8217;t pull in other packages the way Composer does.</li>


<li>Run every command as the file system owner, the server user that owns the Magento files (on shared hosting, the user your provider gives you to log in).</li>


<li>Turn on maintenance mode on a live store, then run steps 3 to 9 of the Composer list: <code>module:status</code>, <code>module:enable</code>, <code>setup:upgrade</code>, <code>setup:di:compile</code>, static content deployment in production mode, <code>cache:clean</code>.</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/11/how-to-install-magento-2-extension-composer-vs-zip.png" alt="How to install an extension in Magento 2: Composer route vs ZIP route, then the same enable and compile commands" class="wp-image-26703" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-composer-vs-zip.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-composer-vs-zip-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-composer-vs-zip-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-composer-vs-zip-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-composer-vs-zip-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-composer-vs-zip-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-composer-vs-zip-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;">Both routes end with the same commands. Composer also records the exact version and makes updates and removal one command.</figcaption></figure></div>



<h3 class="wp-block-heading">Why Composer is the safer route</h3>



<p class="wp-block-paragraph">The commands after a ZIP install are identical. Composer earns its place in what happens afterwards.</p>



<ul class="wp-block-list">
<li>composer.lock records the exact version of every package, so staging and production run identical code once you commit it.</li>


<li>An update is one command, <code>composer update vendor/module-name</code>, followed by the usual upgrade and deploy steps.</li>


<li>Adobe&#8217;s <code>module:uninstall</code> command works only for Composer packages. A ZIP install has to be removed by hand.</li>


<li>Composer checks the extension&#8217;s PHP requirement against the PHP version on your server before anything is installed.</li>

</ul>



<p class="wp-block-paragraph">A ZIP into app/code is still the right place for a custom module built for your own store.</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 module:uninstall command works only for Composer packages, so an extension unpacked into app/code has to be removed by hand.</p></div>



<h2 class="wp-block-heading">How to check the install and spot extension conflicts</h2>



<p class="wp-block-paragraph">Run bin/magento module:status with the module name to confirm the extension is enabled, then test every page it touches. If something breaks, bin/magento dev:di:info lists the plugins and the preference that change a class, so you can see whether two extensions modify the same code. On a Hyvä storefront, also check for a compatibility module.</p>



<p class="wp-block-paragraph">After you install an extension in Magento 2, three checks tell you whether it is safe to release.</p>



<h3 class="wp-block-heading">Confirm the extension is enabled</h3>



<p class="wp-block-paragraph">Run <code>bin/magento module:status Vendor_ModuleName</code> and look for &#8220;Module is enabled&#8221;. Then open the extension&#8217;s settings in the admin and load the storefront pages it changes. If the storefront shows errors, Adobe&#8217;s tip is <code>bin/magento cache:flush</code>. In production mode, errors go to the log files, so a blank or broken page means a trip to the logs.</p>



<h3 class="wp-block-heading">Plugins and preferences: when two extensions change the same code</h3>



<p class="wp-block-paragraph">A plugin runs extra code before, after, or around a Magento function. When several plugins target the same function, Magento runs them in the order set by each plugin&#8217;s sortOrder, and Adobe says this approach reduces conflicts among extensions that change the same class. A preference replaces a whole Magento class with the extension&#8217;s own class, and two extensions that replace the same class can clash. Magefan, an extension vendor, says rewriting existing classes often leads to conflicts.</p>



<p class="wp-block-paragraph">To see what already changes a class, run <code>bin/magento dev:di:info "Magento\Checkout\Block\Onepage\Success"</code>, swapping in the class you care about (this one is Adobe&#8217;s own example, the checkout success block). The command prints the preference and the plugins on that class. Run it for the classes the new extension touches, before and after the install, and compare. Vendors can also declare known conflicts in the conflict field of composer.json, and Magento then won&#8217;t enable both modules at the same time.</p>



<h3 class="wp-block-heading">Hyvä compatibility modules</h3>



<p class="wp-block-paragraph">Hyvä is a lighter storefront theme that replaces Magento&#8217;s default Luma theme. Extensions built for Luma or the blank theme need a compatibility module, which re-implements the parts that don&#8217;t work on a Hyvä storefront. The Hyvä docs on <a href="https://docs.hyva.io/hyva-themes/compatibility-modules/index.html" target="_blank" rel="noopener">Hyvä compatibility modules</a> point to the Compatibility Module Tracker, which lists the compatibility modules that exist and the state each one is in. Check it before you buy, and install the compatibility module together with the extension.</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>bin/magento dev:di:info lists every plugin and the preference on a class, so you can see which extensions already change checkout before you add another.</p></div>



<h2 class="wp-block-heading">How to disable or uninstall a Magento 2 extension</h2>



<p class="wp-block-paragraph">To roll back an extension quickly, disable it with bin/magento module:disable and clean the cache. To remove it for good, run composer remove for a Composer install, or delete its app/code folder for a ZIP install, and take it out of config.php. Ask the vendor how to revert its database changes, and test the removal on staging first.</p>



<p class="wp-block-paragraph">Adobe&#8217;s advice is to uninstall a module only if you&#8217;re certain you won&#8217;t use it again, and to disable it otherwise.</p>



<ul class="wp-block-list">
<li><strong>Roll back fast:</strong> <code>bin/magento module:disable Vendor_ModuleName --clear-static-content</code>, then clean the cache (recompile with <code>setup:di:compile</code> in production mode). Disabling keeps the code and data, so you can turn it back on.</li>


<li><strong>Remove a Composer install:</strong> <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/tutorials/uninstall-modules" target="_blank" rel="noopener">Adobe&#8217;s module:uninstall command</a>, <code>bin/magento module:uninstall Vendor_ModuleName</code>, works for Composer packages only. It runs <code>composer remove</code> and handles maintenance mode itself. Add <code>--remove-data</code> only if you want the module&#8217;s database tables and data gone too. Or run <code>composer remove vendor/module-name</code> directly.</li>


<li><strong>Remove a ZIP install:</strong> <code>rm -rf app/code/Vendor/Module</code>, then take the module out of <code>app/etc/config.php</code> if that file is in source control, and run <code>setup:upgrade</code>.</li>


<li><strong>Database changes:</strong> ask the vendor how to revert its tables and data. Adobe says to get those instructions from the vendor.</li>


<li><strong>Order:</strong> do it on staging first and check the store works there, then repeat on production.</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/11/how-to-install-magento-2-extension-safe-install-flow.png" alt="Flow for a safe Magento 2 extension install: staging copy, install and compile, test, release, and the rollback path" class="wp-image-26704" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-safe-install-flow.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-safe-install-flow-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-safe-install-flow-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-safe-install-flow-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-safe-install-flow-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-safe-install-flow-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-safe-install-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;">Every install runs on a copy of the store first, and the way back is ready before anything reaches production.</figcaption></figure></div>



<h2 class="wp-block-heading">How extension installs work on Adobe Commerce Cloud</h2>



<p class="wp-block-paragraph">On Adobe Commerce Cloud, you install an extension on your own machine, in a development branch: run composer require with &#8211;no-update, then composer update, and push composer.json and composer.lock with git. The deployment enables the extension for you. Adobe says never to enable or disable an extension while logged in to a remote environment.</p>



<p class="wp-block-paragraph">Adobe recommends a development branch for every extension you add. The steps, from <a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/configure-store/extensions" target="_blank" rel="noopener">Adobe&#8217;s Cloud extension guide</a>:</p>



<ol class="wp-block-list">
<li>On your machine, open the project folder and create or check out a development branch.</li>


<li><code>composer require vendor/module-name:version --no-update</code></li>


<li><code>composer update</code></li>


<li><code>git add -A</code>, then commit with a message such as &#8220;Install vendor/module-name&#8221;.</li>


<li><code>git push origin &lt;branch-name&gt;</code></li>


<li>After the build and deploy finish, log in to the environment over SSH and run <code>bin/magento module:status Vendor_ModuleName</code>.</li>

</ol>



<p class="wp-block-paragraph">Two things differ from a self-hosted store. Buy Marketplace extensions with the same account (MAGEID) that owns the Cloud project, which Adobe says avoids installation issues. And the deployment puts the site in maintenance mode by itself.</p>



<p class="wp-block-paragraph">The push must include composer.lock, because the remote environment reads it to install the same versions you tested. If you enable a module locally, run <code>./vendor/bin/ece-tools module:refresh</code> and commit app/etc/config.php.</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 Adobe Commerce Cloud, you never enable an extension on the server. You commit composer.json and composer.lock, and the deployment does the rest.</p></div>



<h2 class="wp-block-heading">How to install a Magento 2 extension without the command line</h2>



<p class="wp-block-paragraph">Magento 2.4 can&#8217;t install extensions from the admin: Adobe removed the Web Setup Wizard in 2.4.0, so every install runs from the command line. If you don&#8217;t have command-line access, someone else has to run the commands for you, either a developer with access to your server or an AI agent that works on a copy of your store.</p>



<p class="wp-block-paragraph">The first route is a developer with access to your server, from your agency, your host, or a freelancer, who runs the Composer steps above on staging first. Ask for the module:status output and a test of the pages the extension changes before the production release.</p>



<p class="wp-block-paragraph">Ari, the <a href="https://www.withari.ai/" target="_blank" rel="noopener">AI agent for Magento</a> built by scandiweb, is one way to do it from a chat. Its marketplace lists ready-made extensions from vendors including Amasty, Mageplaza, MagePal, Magefan, WeltPixel, and Yireo, and Ari works with 1,000+ extensions, custom ones included. Ari installs the free version on a copy of your store with customer data removed, checks it against your theme and the modules you already run, and shows you how to set it up.</p>



<p class="wp-block-paragraph">Your live store doesn&#8217;t change until a person approves the release, which arrives as a pull request. Paid versions are bought from the vendor, and Ari plans start from €99 a month per store. You can browse the marketplace and <a href="https://www.withari.ai/marketplace" target="_blank" rel="noopener">install Magento extensions in chat</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/11/how-to-install-magento-2-extension-ari-install-preview.png" alt="Ari marketplace on withari.ai showing how an install runs: the extension goes onto a preview copy of the store first" class="wp-image-26705" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-ari-install-preview.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-ari-install-preview-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-ari-install-preview-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-ari-install-preview-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-ari-install-preview-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-ari-install-preview-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/11/how-to-install-magento-2-extension-ari-install-preview-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;">Ari installs the free version of an extension on a preview copy of the store. The live store changes only when the install is released.</figcaption></figure></div>



<p class="wp-block-paragraph">For the other kinds of AI tools a Magento store can use, see our guide to <a href="https://scandiweb.com/blog/magento-ai/" target="_blank" rel="noopener">Magento AI</a>.</p>



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



<h3 class="wp-block-heading">What is the difference between a Magento extension and a module?</h3>



<p class="wp-block-paragraph">A Magento extension is packaged code that adds to or changes what Magento does. Adobe counts three kinds: modules add features, themes change how the storefront and admin look, and language packages translate them. Most extensions sold on marketplaces are modules, so in everyday use the two words mean the same thing.</p>



<h3 class="wp-block-heading">Is the Magento Marketplace the same as the Adobe Commerce Marketplace?</h3>



<p class="wp-block-paragraph">Yes. The old Magento Marketplace address, marketplace.magento.com, now redirects to commercemarketplace.adobe.com, Adobe&#8217;s store for free and paid extensions. Adobe says every extension listed there passes its Extension Quality Program, an automated check plus a manual review. To install one, you need the access keys from your Marketplace profile.</p>



<h3 class="wp-block-heading">Why doesn&#8217;t my new extension show up in the Magento admin?</h3>



<p class="wp-block-paragraph">Usually the extension is still disabled or the cache is out of date. Run <code>bin/magento module:status</code> with the module name, because Adobe notes a new extension is probably disabled after <code>composer require</code>. Enable it, run <code>setup:upgrade</code> and <code>setup:di:compile</code>, then clean the cache. If the storefront shows errors, run <code>bin/magento cache:flush</code>.</p>



<h3 class="wp-block-heading">Do I need maintenance mode to install a Magento extension?</h3>



<p class="wp-block-paragraph">Adobe lists it as optional, but it is the safer choice on a live store. <code>bin/magento maintenance:enable</code> shows visitors a 503 maintenance page while the commands run, and the <code>--ip</code> option lets your own IP address through. On Adobe Commerce Cloud, the deployment switches maintenance mode on by itself.</p>



<h3 class="wp-block-heading">Do I need to run setup:static-content:deploy after installing an extension?</h3>



<p class="wp-block-paragraph">Only in production mode. There, Magento doesn&#8217;t generate CSS, JavaScript, and image files on demand, so a new extension&#8217;s files don&#8217;t appear until you deploy them with <code>setup:static-content:deploy</code>. In developer mode, Magento builds those files when a page asks for them, so clearing the old ones with <code>--clear-static-content</code> is enough.</p>



<h3 class="wp-block-heading">How do I update a Magento 2 extension?</h3>



<p class="wp-block-paragraph">For a Composer install, run <code>composer update vendor/module-name</code>, or <code>composer require vendor/module-name</code> with the new version. Then run <code>bin/magento setup:upgrade --keep-generated</code>, <code>setup:static-content:deploy</code>, and <code>cache:clean</code>, as in Adobe&#8217;s guide. Check the new version&#8217;s Magento and PHP requirements before you start, and run the update on staging first.</p>



<h2 class="wp-block-heading">Before your next Magento 2 extension install</h2>



<p class="wp-block-paragraph">Installing an extension in Magento 2 takes a few commands, and Adobe documents each one. The work that protects your store happens around them: the version check, the conflict check, the staging run, and the rollback plan. Do them in that order, on a copy of the store, before the extension reaches production.</p>



<p class="wp-block-paragraph">Prefer Composer where the vendor offers it, since it records the exact version and makes updates and removal one command. A ZIP into app/code still works for a module built for your own store. If nobody on your side has command-line access, hand the job to a developer or to an agent that works on a copy, so the live store changes only when you say so. If you&#8217;d rather not run installs and rollbacks yourself, talk to scandiweb&#8217;s <a href="https://scandiweb.com/magento-support" target="_blank" rel="noopener">Magento support team</a>.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What is the difference between a Magento extension and a module?", "acceptedAnswer": {"@type": "Answer", "text": "A Magento extension is packaged code that adds to or changes what Magento does. Adobe counts three kinds: modules add features, themes change how the storefront and admin look, and language packages translate them. Most extensions sold on marketplaces are modules, so in everyday use the two words mean the same thing."}}, {"@type": "Question", "name": "Is the Magento Marketplace the same as the Adobe Commerce Marketplace?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. The old Magento Marketplace address, marketplace.magento.com, now redirects to commercemarketplace.adobe.com, Adobe's store for free and paid extensions. Adobe says every extension listed there passes its Extension Quality Program, an automated check plus a manual review. To install one, you need the access keys from your Marketplace profile."}}, {"@type": "Question", "name": "Why doesn't my new extension show up in the Magento admin?", "acceptedAnswer": {"@type": "Answer", "text": "Usually the extension is still disabled or the cache is out of date. Run bin/magento module:status with the module name, because Adobe notes a new extension is probably disabled after composer require. Enable it, run setup:upgrade and setup:di:compile, then clean the cache. If the storefront shows errors, run bin/magento cache:flush."}}, {"@type": "Question", "name": "Do I need maintenance mode to install a Magento extension?", "acceptedAnswer": {"@type": "Answer", "text": "Adobe lists it as optional, but it is the safer choice on a live store. bin/magento maintenance:enable shows visitors a 503 maintenance page while the commands run, and the --ip option lets your own IP address through. On Adobe Commerce Cloud, the deployment switches maintenance mode on by itself."}}, {"@type": "Question", "name": "Do I need to run setup:static-content:deploy after installing an extension?", "acceptedAnswer": {"@type": "Answer", "text": "Only in production mode. There, Magento doesn't generate CSS, JavaScript, and image files on demand, so a new extension's files don't appear until you deploy them with setup:static-content:deploy. In developer mode, Magento builds those files when a page asks for them, so clearing the old ones with --clear-static-content is enough."}}, {"@type": "Question", "name": "How do I update a Magento 2 extension?", "acceptedAnswer": {"@type": "Answer", "text": "For a Composer install, run composer update vendor/module-name, or composer require vendor/module-name with the new version. Then run bin/magento setup:upgrade --keep-generated, setup:static-content:deploy, and cache:clean, as in Adobe's guide. Check the new version's Magento and PHP requirements before you start, and run the update on staging first."}}]}</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 you&#x27;d like a second pair of eyes before the next install, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>send us the extension name</em></a><em> and your Magento version.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/how-to-install-magento-2-extension/">How to Install an Extension in Magento 2: Composer, ZIP, and a No-Code Option</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Magento Profiler: Find What&#8217;s Slowing Your Store with New Relic and Blackfire</title>
		<link>https://scandiweb.com/blog/magento-profiling/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 10:34: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=26587</guid>

					<description><![CDATA[<p>Use the Magento profiler, New Relic or Blackfire to see where an uncached page spends its time, from layout and templates to database queries.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-profiling/">Magento Profiler: Find What&#8217;s Slowing Your Store with New Relic and Blackfire</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-mprof 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/magento-support" target=_blank >
        Magento Support
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">When a Magento (Adobe Commerce) store slows down, the conversation about it tends to follow a script: the host blames the code, the developers blame the server, and someone asks whether clearing the cache would help. All three are guesses, because nobody in that conversation can see what Magento does while it builds a page.</p>



<p class="wp-block-paragraph">A Magento profiler lets you see it. It&#8217;s a tool that times each step Magento takes to build one page and shows which steps used the time. Magento comes with a basic one. New Relic, a monitoring service that records timings from every request on a live store, and Blackfire, a profiler you aim at one request at a time, go further. Which tool you pick, and which page you point it at, decides whether the result names a real culprit or sends you after the wrong one.</p>



<h2 class="wp-block-heading">What is a Magento profiler?</h2>



<p class="wp-block-paragraph">A Magento profiler is a tool that times each step Magento takes to build a page: matching the URL to a controller, loading the layout, rendering blocks and templates, running extension code and querying the database. It lists every step with its time and how often it ran, so you can see where one page spends its time.</p>



<p class="wp-block-paragraph">Two kinds of tool do this. Magento&#8217;s own profiler, Blackfire and Xdebug time one request in detail. New Relic, an APM (application performance monitoring), watches every request on the live store. They answer different questions.</p>



<h3 class="wp-block-heading">What a profile of one page shows</h3>



<p class="wp-block-paragraph">Take one page Magento has to build from scratch. It finds the controller for the URL (<code>routers_match</code>), loads and merges the layout, the XML instructions that say which blocks go on the page (<code>LAYOUT</code>), and builds the page structure (<code>generate_elements</code>). A block is one piece of the page, such as a product list, and its template is the file that turns the block&#8217;s data into HTML. Each template is rendered in turn (<code>TEMPLATE:</code> plus the file name). Along the way, Magento runs observers, extension code that responds to its events (<code>OBSERVER:</code>), and plugins, extension code wrapped around one of its own functions.</p>



<p class="wp-block-paragraph">Each block&#8217;s data comes from the database, so a block that runs once per product multiplies its queries. Magento&#8217;s own profiler has no timers for plugins or single queries. New Relic and Blackfire show both.</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-profiling-uncached-page-breakdown.png" alt="Magento profiler breakdown of one uncached page, illustrative: routing, layout, blocks and templates, database queries" class="wp-image-26584" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-uncached-page-breakdown.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-uncached-page-breakdown-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-uncached-page-breakdown-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-uncached-page-breakdown-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-uncached-page-breakdown-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-uncached-page-breakdown-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-uncached-page-breakdown-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;">Illustrative: how a profiler breaks one uncached Magento page into routing, layout, blocks, templates and database queries</figcaption></figure></div>



<h3 class="wp-block-heading">Profile a page the cache doesn&#8217;t serve</h3>



<p class="wp-block-paragraph">Most stores run a full page cache, usually Varnish, a cache that keeps finished pages and sends them without asking Magento to build them again. A page served from Varnish never reaches Magento, so there is nothing to profile. Logged-in, filtered and search pages are cached too, per customer group and per search term. They just miss more often, which is why shoppers feel them. For what the cache keeps and when it misses, read <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">how Magento&#8217;s full page cache works</a>.</p>



<p class="wp-block-paragraph">On a staging copy (a copy of the store for testing, with production data and settings), switch the page cache off with <code>bin/magento cache:disable full_page</code> so Magento builds every page, and turn it back on with <code>cache:enable full_page</code> afterwards. With html output, the profiler table appears only on a page Magento built, so no table means the page came from a cache.</p>



<p class="wp-block-paragraph">To see which page types are slow before you profile, time them from the cache and uncached, as our guide on <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">how to audit Magento performance</a> shows.</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>Profile a page your shoppers actually wait for. A page served from Varnish never reaches Magento, so there is nothing to profile. Logged-in, filtered and search pages miss the cache far more often, so start there.</p></div>



<h2 class="wp-block-heading">How to enable the Magento 2 profiler</h2>



<p class="wp-block-paragraph">To enable the Magento 2 profiler:</p>



<ol class="wp-block-list">
<li>Use a staging or local copy.</li>


<li>In the Magento root, run <code>bin/magento dev:profiler:enable html</code> (or <code>csvfile</code>).</li>


<li>Load the page you want to measure.</li>


<li>Read the table at the bottom of the page, or <code>var/log/profiler.csv</code>.</li>


<li>Run <code>bin/magento dev:profiler:disable</code> when done.</li>

</ol>



<pre class="wp-block-code"><code># Magento root, staging or local copy, as the file system owner
bin/magento dev:profiler:enable html      # table printed below each page Magento builds
bin/magento dev:profiler:enable csvfile   # or: timings written to var/log/profiler.csv
bin/magento dev:profiler:disable          # removes var/profiler.flag</code></pre>



<p class="wp-block-paragraph">The command writes <code>var/profiler.flag</code> with the output type, and disabling deletes it. The <code>MAGE_PROFILER</code> bootstrap variable does the same job, set as <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/setup/mage-profiler" target="_blank" rel="noopener">Adobe&#8217;s profiling page</a> describes. Set to <code>2</code>, it also prints dependency graphs, which list objects Magento created but never used.</p>



<p class="wp-block-paragraph">One warning from the code: Magento checks only that the flag exists and that the request asks for an HTML page. It doesn&#8217;t check the store&#8217;s mode, so on a live server every page Magento builds would carry the table, and the CSV would hold whichever request ran last. Staging or a local copy only, and disable it when you finish. Because of that HTML check, the profiler times browser page loads only. API and AJAX calls need New Relic or Blackfire.</p>



<h3 class="wp-block-heading">How to read the profiler table</h3>



<p class="wp-block-paragraph">The caption shows the memory the request used. Under it, there is one row per timer: Time in seconds, Avg, Cnt (how many times it ran), Emalloc and RealMem (memory). Nested timers are indented under their parent, so start from <code>magento</code>, the whole request, and follow the biggest child down. Read Cnt next to Time: a template rendered once per product in a list shows a high count. To compare two runs, open two csvfile outputs in a spreadsheet.</p>



<h3 class="wp-block-heading">Count queries with the database profiler</h3>



<p class="wp-block-paragraph">Magento&#8217;s database profiler lists every query a page sends, with its time and parameters, and the total count. It is switched on in <code>app/etc/env.php</code>, Magento&#8217;s main settings file for the server.</p>



<pre class="wp-block-code"><code>// app/etc/env.php, inside 'db' =&gt; ['connection' =&gt; ['default' =&gt; [ ... ]]]
'profiler' =&gt; [
    'class' =&gt; '\Magento\Framework\DB\Profiler',
    'enabled' =&gt; true,
],</code></pre>



<p class="wp-block-paragraph"><a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/storage/db-profiler" target="_blank" rel="noopener">Adobe&#8217;s database profiler page</a> has the short snippet that prints the result, which goes into <code>pub/index.php</code> after the <code>$bootstrap-&gt;run($app)</code> line. It prints the queries into the page, so staging only, and remove both when you finish. Read the total count first, then look for queries that repeat with only the ID changing, which points to a block or plugin that loads data one item at a time. When a few queries are slow rather than many being quick, the next step is the MySQL slow query log, covered in our guide to <a href="https://scandiweb.com/blog/magento-mysql-optimization/" target="_blank" rel="noopener">Magento MySQL optimization</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>The CSV output in <code>var/log/profiler.csv</code> is overwritten on every page load. Copy the file after each run and name the copy after the page and the change you tested, so you can compare a before and an after.</p></div>



<h2 class="wp-block-heading">Magento 2 New Relic integration</h2>



<p class="wp-block-paragraph">Magento 2 connects to New Relic through New Relic&#8217;s PHP agent, which runs inside PHP on the web server and sends timing data for every request to your New Relic account. New Relic lists Magento 2 among the frameworks the agent supports. On Adobe Commerce Cloud, New Relic APM is already included for Production and Staging.</p>



<p class="wp-block-paragraph">The PHP agent is a PHP add-on that sends timing data to New Relic. There, requests are grouped into transactions, such as category or product views, ranked by the time they take, with code-level and database query traces for individual requests. This is Magento performance monitoring, and it runs all the time on the live store.</p>



<h3 class="wp-block-heading">New Relic on Adobe Commerce Cloud</h3>



<p class="wp-block-paragraph">Every Adobe Commerce on cloud infrastructure project includes New Relic APM, on Pro and Starter, for Production and Staging, with the software and the license key. There is nothing to buy or install. Pro adds New Relic Infrastructure and Log Management. Two limits, from <a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/monitor/new-relic/new-relic-service" target="_blank" rel="noopener">Adobe&#8217;s New Relic service page</a>: other New Relic features aren&#8217;t available, and you can&#8217;t send data from servers outside the project. Read &#8220;Most time consuming&#8221; in the APM summary first. In Adobe&#8217;s example, product and category views sit at the top, and a customer account page that suddenly ranks high has a call or a query dragging it down.</p>



<h3 class="wp-block-heading">New Relic on your own servers</h3>



<p class="wp-block-paragraph">Install New Relic&#8217;s PHP agent on each web server: the agent runs inside PHP and records timings, and a daemon forwards the data to New Relic. New Relic lists Magento 2 as a supported framework on its <a href="https://docs.newrelic.com/docs/apm/agents/php-agent/getting-started/php-agent-compatibility-requirements/" target="_blank" rel="noopener">PHP agent compatibility page</a>. Check the agent version after a PHP upgrade: PHP 8.5, which Magento 2.4.9 runs on, needs agent 12.4.0.29 or later. For the PHP version of each release, see the <a href="https://scandiweb.com/blog/magento-2-system-requirements/" target="_blank" rel="noopener">Magento 2 system requirements</a>. Keep New Relic running during a <a href="https://scandiweb.com/blog/magento-load-testing/" target="_blank" rel="noopener">Magento load test</a>, so you can see which requests slow down first as traffic climbs.</p>



<h3 class="wp-block-heading">The New Relic Reporting module in Magento 2</h3>



<p class="wp-block-paragraph">Magento includes a module called New Relic Reporting, and it isn&#8217;t the profiler. The timing data still comes from the PHP agent, and the module needs that agent installed to do anything. What it adds is store events in your New Relic account: deployments, cache flushes, product saves, orders, and logged-in admins and customers. The settings are under Stores &gt; Settings &gt; Configuration &gt; General &gt; New Relic Reporting, and on 2.4.9 you can choose the newer NerdGraph API for deployment markers. Marking a release is optional:</p>



<pre class="wp-block-code"><code># Needs the New Relic Reporting settings filled in
bin/magento newrelic:create:deploy-marker "Release 2026-11-04" "Checkout fixes" "deploy-bot"</code></pre>



<p class="wp-block-paragraph">Adobe removed the module&#8217;s documentation in September 2025 and calls the feature deprecated, though the module still comes with 2.4.9, in the <a href="https://github.com/magento/magento2/tree/2.4-develop/app/code/Magento/NewRelicReporting" target="_blank" rel="noopener">module&#8217;s folder on GitHub</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>Before you buy a monitoring tool for a store on Adobe Commerce Cloud, open the New Relic account that came with the project. APM is included on Pro and Starter for Production and Staging.</p></div>



<h2 class="wp-block-heading">Blackfire and Xdebug: profile one request in depth</h2>



<p class="wp-block-paragraph">Blackfire is a PHP profiler that records one request in full: each function call, the time it took and what called it, shown as a call graph and a timeline. Its maker says profiling HTTP requests has no impact for other visitors. Xdebug&#8217;s profiler gives similar detail on a developer&#8217;s own copy of the store.</p>



<p class="wp-block-paragraph">A call graph is a map of which function called which, with the time each took.</p>



<h3 class="wp-block-heading">Blackfire on Adobe Commerce Cloud and other hosting</h3>



<p class="wp-block-paragraph">You start a Blackfire profile of one request from the browser or the command line. Blackfire records the calls per function, which function called which, wall time and I/O time, as a call graph or a timeline. Blackfire says Magento stores can be profiled on demand in production, staging, integration and development, and on premise an optional Magento add-on gives Magento-specific recommendations, per <a href="https://docs.blackfire.io/php/integrations/magento" target="_blank" rel="noopener">Blackfire&#8217;s Magento page</a>.</p>



<p class="wp-block-paragraph">On Adobe Commerce Cloud, Adobe stopped including free Blackfire access on April 11, 2020, for Pro and Starter, so you buy a license from Blackfire. Its Cloud guide notes that the Fastly bypass it needs is set by default there. Plans are called Development and Production, with no free trial.</p>



<h3 class="wp-block-heading">Xdebug for profiling on a developer&#8217;s machine</h3>



<p class="wp-block-paragraph">Xdebug is a PHP extension developers use for debugging and profiling. Three settings turn its profiler on:</p>



<pre class="wp-block-code"><code>; php.ini or 99-xdebug.ini on a developer's machine
xdebug.mode = profile
xdebug.start_with_request = trigger   ; only requests that carry XDEBUG_TRIGGER
xdebug.output_dir = /tmp              ; the default, files named cachegrind.out.&lt;process ID&gt;</code></pre>



<p class="wp-block-paragraph">Xdebug writes one Cachegrind file per profiled process, named <code>cachegrind.out.</code> plus the process ID, in <code>/tmp</code> by default and compressed. Open it in KCacheGrind, in QCacheGrind on Windows (turn compression off with <code>xdebug.use_compression</code>) or in PhpStorm, as the <a href="https://xdebug.org/docs/profiler" target="_blank" rel="noopener">Xdebug profiler docs</a> describe. Trigger mode limits profiling to the requests you choose. Keep Xdebug on a developer&#8217;s own copy.</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>Set <code>xdebug.start_with_request</code> to <code>trigger</code>, so Xdebug profiles only the requests you mark with <code>XDEBUG_TRIGGER</code>. Xdebug&#8217;s manual warns that profiles of complex scripts can be enormous, and a Magento page is one.</p></div>



<h2 class="wp-block-heading">Which Magento profiling tool should you use?</h2>



<p class="wp-block-paragraph">Use New Relic to find which pages and requests are slow on the live store, over days of real traffic. Use Magento&#8217;s built-in profiler on staging for a quick breakdown of one page, and its database profiler to count that page&#8217;s queries. Use Blackfire or Xdebug when you need the exact functions that make one request slow.</p>



<p class="wp-block-paragraph">If you haven&#8217;t narrowed the slowness to the page build yet, start with <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">why a Magento site gets slow</a>.</p>



<figure class="wp-block-table"><table><thead><tr><th>Tool</th><th>Question it answers</th><th>Where to run it</th><th>Where it comes from</th></tr></thead><tbody><tr><td>Magento profiler</td><td>Which steps of one page build take the time</td><td>Staging or a local copy</td><td>Built into Magento</td></tr><tr><td>Database profiler</td><td>How many queries one page sends, and how long each takes</td><td>Staging or a local copy</td><td>Built into Magento, switched on in env.php</td></tr><tr><td>New Relic APM</td><td>Which pages and requests are slow on the live store, and when</td><td>Production and staging</td><td>Included on Adobe Commerce Cloud. Elsewhere, a free tier or a paid edition</td></tr><tr><td>Blackfire</td><td>Which functions make one request slow</td><td>Any environment, on demand</td><td>A Blackfire license (Development or Production plan)</td></tr><tr><td>Xdebug</td><td>The same, on one developer&#8217;s machine</td><td>A developer&#8217;s own copy</td><td>A PHP extension the developer installs</td></tr></tbody></table><figcaption class="wp-element-caption">Magento profiling tools compared: the question each answers, where to run it and where it comes from</figcaption></figure>



<p class="wp-block-paragraph">Most teams use two, New Relic to find the slow page on the live store and a profiler to explain it on staging.</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-profiling-which-tool.png" alt="Decision flow for picking a Magento profiling tool: New Relic, built-in profiler, database profiler, Blackfire or Xdebug" class="wp-image-26585" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-which-tool.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-which-tool-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-which-tool-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-which-tool-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-which-tool-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-which-tool-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-profiling-which-tool-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;">Which Magento profiling tool answers which question</figcaption></figure></div>



<h2 class="wp-block-heading">What to fix once the profile points somewhere</h2>



<p class="wp-block-paragraph">Fix the step that takes the most time, then profile the same page again under the same conditions. In the Magento profiles our developers read, the time usually goes to extension code that runs on every request, blocks that load data once per product, or a page build that sends hundreds of database queries.</p>



<p class="wp-block-paragraph">Extension code on every request shows up as an observer or a plugin high in the list. Disable it on staging and profile again. If the time drops, remove, replace or fix it. If the slow step is your own code, a <a href="https://scandiweb.com/blog/magento-code-audit-by-certified-magento-developers/" target="_blank" rel="noopener">Magento code audit</a> reviews it with security and code quality.</p>



<p class="wp-block-paragraph">A block that loads data once per product shows as a template or a query with a high count. Load the data once for the whole list, or cache the block&#8217;s output if it is the same for every shopper.</p>



<p class="wp-block-paragraph">Sometimes the profile names no culprit. The time is spread across layout, blocks and hundreds of small queries, and the cost is how Magento builds the page itself.</p>



<p class="wp-block-paragraph">For that pattern there&#8217;s <a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a>, scandiweb&#8217;s software for Magento, with an open-source core. It changes how Magento builds each page on the server, using Liquid, the open-source template language Shopify created, and the build runs at least 2x faster. Expedio works with Magento Open Source, Adobe Commerce and Commerce Cloud, on Luma, Hyvä or custom themes and any hosting, and your theme, catalog, prices, admin and checkout stay as they are. On the same server, it handles 3x the traffic before response times start to rise.</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">Our CTO put it this way after measuring stock Magento: most of the time goes into building the page itself, &#8220;and much of that is spent fetching data piece by piece.&#8221; In a benchmark on one merchant&#8217;s Hyvä store, measured as server response time, stock Magento ran 604 database queries to build the homepage and 655 for a full category page, with no full page cache on either copy. With Expedio, the same pages ran 11 and 30. The <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">Expedio benchmark</a> covers the method and its limits.</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>In the profiler table, read the Cnt column as well as Time. A step that is quick once but runs for every product in a category list can cost more than one slow step. The fix is to load that data once for the whole list.</p></div>



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



<h3 class="wp-block-heading">Can you run the Magento profiler on a live store?</h3>



<p class="wp-block-paragraph">Not safely. The built-in profiler switches on through a flag file, <code>var/profiler.flag</code>, that covers every browser page request on that server in any mode. In HTML mode, every page Magento builds would carry the timing table, and the CSV file keeps only whichever request ran last. Profile on a staging copy with production data and settings. On the live store, use an APM such as New Relic.</p>



<h3 class="wp-block-heading">Where does the Magento 2 profiler output go?</h3>



<p class="wp-block-paragraph">With the html type, Magento prints the profiler table when the request ends, below the page it built, so you scroll to the bottom to read it. With csvfile, it writes <code>var/log/profiler.csv</code> in the Magento root, and Adobe notes the file is overwritten on each page refresh. Dependency graphs, turned on with <code>MAGE_PROFILER</code> set to 2, also show at the bottom of the page.</p>



<h3 class="wp-block-heading">Is New Relic included with Adobe Commerce Cloud?</h3>



<p class="wp-block-paragraph">Yes. Every Adobe Commerce on cloud infrastructure project includes New Relic APM, on Pro and Starter plans, for the Production and Staging environments, with the software and license key provided. Pro projects also get New Relic Infrastructure and Log Management. Adobe notes that other New Relic features aren&#8217;t available and that you can&#8217;t send data from servers outside the Cloud project.</p>



<h3 class="wp-block-heading">Is profiling the same as Magento performance monitoring?</h3>



<p class="wp-block-paragraph">No. Performance monitoring watches the live store all the time and shows which pages, requests or servers are slow, and when. Profiling takes one request and breaks it into the steps and functions that used its time. A monitoring tool such as New Relic tells you where to look, and a profiler shows why that request is slow.</p>



<h3 class="wp-block-heading">Is Blackfire still included with Adobe Commerce Cloud?</h3>



<p class="wp-block-paragraph">No. Adobe stopped including free Blackfire access in Adobe Commerce on cloud infrastructure Pro and Starter subscriptions on April 11, 2020. You can still use Blackfire on a Cloud project by buying a license from Blackfire directly and following its setup guide for Adobe Commerce Cloud. Blackfire sells Development and Production plans and doesn&#8217;t offer a free trial.</p>



<h3 class="wp-block-heading">Does New Relic have a free plan for Magento stores?</h3>



<p class="wp-block-paragraph">Yes. New Relic&#8217;s <a href="https://newrelic.com/pricing" target="_blank" rel="noopener">free tier</a> includes 100 GB of data ingest a month and one full platform user, with no credit card required. If a month&#8217;s data goes over 100 GB, ingest stops until you upgrade or the next month starts. Paid editions are Standard, Pro and Enterprise. On Adobe Commerce Cloud you don&#8217;t need it, because New Relic APM comes with the project.</p>



<h2 class="wp-block-heading">Where to start with the Magento profiler</h2>



<p class="wp-block-paragraph">Start with the Magento profiler on a staging copy, aimed at one page your shoppers wait for, with the cache out of the way. If you first need to know which pages are slow on the live store, New Relic answers that, and Blackfire or Xdebug take you down to the function that costs the time.</p>



<p class="wp-block-paragraph">Once a profile has put the problem on the server, our guide to <a href="https://scandiweb.com/blog/magento-2-performance-optimization-with-js-bundling/" target="_blank" rel="noopener">speed up Magento</a> lists the other fixes in order, from hosting to the browser. If you&#8217;d like someone to read the profile with you, our <a href="https://scandiweb.com/services/magento-performance-audit" target="_blank" rel="noopener">Magento performance audit</a> profiles your custom code and slow queries and returns a prioritized report.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Can you run the Magento profiler on a live store?", "acceptedAnswer": {"@type": "Answer", "text": "Not safely. The built-in profiler switches on through a flag file, var/profiler.flag, that covers every browser page request on that server in any mode. In HTML mode, every page Magento builds would carry the timing table, and the CSV file keeps only whichever request ran last. Profile on a staging copy with production data and settings. On the live store, use an APM such as New Relic."}}, {"@type": "Question", "name": "Where does the Magento 2 profiler output go?", "acceptedAnswer": {"@type": "Answer", "text": "With the html type, Magento prints the profiler table when the request ends, below the page it built, so you scroll to the bottom to read it. With csvfile, it writes var/log/profiler.csv in the Magento root, and Adobe notes the file is overwritten on each page refresh. Dependency graphs, turned on with MAGE_PROFILER set to 2, also show at the bottom of the page."}}, {"@type": "Question", "name": "Is New Relic included with Adobe Commerce Cloud?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Every Adobe Commerce on cloud infrastructure project includes New Relic APM, on Pro and Starter plans, for the Production and Staging environments, with the software and license key provided. Pro projects also get New Relic Infrastructure and Log Management. Adobe notes that other New Relic features aren't available and that you can't send data from servers outside the Cloud project."}}, {"@type": "Question", "name": "Is profiling the same as Magento performance monitoring?", "acceptedAnswer": {"@type": "Answer", "text": "No. Performance monitoring watches the live store all the time and shows which pages, requests or servers are slow, and when. Profiling takes one request and breaks it into the steps and functions that used its time. A monitoring tool such as New Relic tells you where to look, and a profiler shows why that request is slow."}}, {"@type": "Question", "name": "Is Blackfire still included with Adobe Commerce Cloud?", "acceptedAnswer": {"@type": "Answer", "text": "No. Adobe stopped including free Blackfire access in Adobe Commerce on cloud infrastructure Pro and Starter subscriptions on April 11, 2020. You can still use Blackfire on a Cloud project by buying a license from Blackfire directly and following its setup guide for Adobe Commerce Cloud. Blackfire sells Development and Production plans and doesn't offer a free trial."}}, {"@type": "Question", "name": "Does New Relic have a free plan for Magento stores?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. New Relic's free tier includes 100 GB of data ingest a month and one full platform user, with no credit card required. If a month's data goes over 100 GB, ingest stops until you upgrade or the next month starts. Paid editions are Standard, Pro and Enterprise. On Adobe Commerce Cloud you don't need it, because New Relic APM comes with the project."}}]}</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 which page to profile first? </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>Tell us which pages feel slow</em></a><em> and we&#x27;ll help you pick one.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-profiling/">Magento Profiler: Find What&#8217;s Slowing Your Store with New Relic and Blackfire</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Magento 2 MySQL Optimization: Slow Queries, Indexes, and Configuration</title>
		<link>https://scandiweb.com/blog/magento-mysql-optimization/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Mon, 02 Nov 2026 16:39: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=26569</guid>

					<description><![CDATA[<p>Magento 2 MySQL optimization: find slow queries, cut the queries each page runs, keep big tables in check and set the MySQL values Adobe recommends.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-mysql-optimization/">Magento 2 MySQL Optimization: Slow Queries, Indexes, and Configuration</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-mmyso 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/magento-support" target=_blank >
        Magento Support
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">Your Magento (Adobe Commerce) store has slowed down, someone checked the server, and the answer came back: the database is working too hard. That&#8217;s MySQL, or its close relative MariaDB, the software that holds every product, price, customer and order and serves them each time Magento builds a page. The verdict is often right. It just doesn&#8217;t say what to fix.</p>



<p class="wp-block-paragraph">Magento 2 MySQL optimization means finding where the database time goes, then fixing that first. Magento stores a product&#8217;s details in separate tables by type of value (text, whole numbers, prices, dates), a design called EAV (entity-attribute-value). As a result, <a href="https://experienceleague.adobe.com/en/docs/commerce-admin/catalog/catalog/catalog-flat" target="_blank" rel="noopener">Adobe&#8217;s documentation</a> says, its &#8220;SQL queries are sometimes long and complex.&#8221; A query is one request for data, written in SQL, the database&#8217;s language. On a slow store, the time usually goes to one of four places, and each one needs a different fix.</p>



<h2 class="wp-block-heading">What is Magento 2 MySQL optimization?</h2>



<p class="wp-block-paragraph">Magento 2 MySQL optimization is the work of making the database behind a Magento store answer faster and less often. It covers four jobs: finding and fixing slow queries, cutting the number of queries each page sends, keeping fast-growing tables in check, and setting MySQL or MariaDB the way Adobe advises for Magento.</p>



<p class="wp-block-paragraph">Magento talks to the database whenever it builds a page the cache doesn&#8217;t hold: logged-in views, filtered category pages, search results, cart and checkout. The admin, product imports and background jobs query it too. So database trouble shows up first on uncached pages and on busy admin days, when someone is editing the catalog or running an import.</p>



<h3 class="wp-block-heading">Why a Magento page sends so many queries</h3>



<p class="wp-block-paragraph">Under EAV, each product attribute is stored by its type of value rather than in one row per product. Adobe&#8217;s <a href="https://developer.adobe.com/commerce/php/development/components/attributes" target="_blank" rel="noopener">developer documentation</a> says objects that use EAV attributes typically store values in several MySQL tables, and that the Catalog and Customer modules are the main ones. For products, the values are kept in one table per type: <code>catalog_product_entity_varchar</code>, <code>_int</code>, <code>_decimal</code>, <code>_text</code> and <code>_datetime</code>. Each table is a separate lookup, so a page that lists many products reads many tables.</p>



<p class="wp-block-paragraph">Magento offsets this with indexers, background jobs that precompute data into ready-made tables. Without them, Adobe says, the application would have to calculate the price of every product on the fly, taking cart price rules, bundle pricing and discounts into account. Flat tables were the older answer, one wide row per product, and Adobe no longer recommends them. Our explainer on <a href="https://scandiweb.com/blog/magento-series-the-eav-model/" target="_blank" rel="noopener">Magento&#8217;s EAV model</a> walks through every attribute type and table.</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-mysql-optimization-eav-product-tables.png" alt="Magento 2 MySQL optimization diagram: one product&#x27;s details split across EAV tables by type of value" class="wp-image-26566" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-eav-product-tables.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-eav-product-tables-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-eav-product-tables-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-eav-product-tables-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-eav-product-tables-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-eav-product-tables-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-eav-product-tables-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;">Under EAV, one product&#x27;s details are stored in separate tables by type of value, so building a page takes many lookups.</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>Magento caches its built-in EAV attributes but not the custom ones a merchant adds. Adobe says caching those too decreases the insert and select requests sent to the database, at the cost of a bigger cache: run <code>bin/magento config:set dev/caching/cache_user_defined_attributes 1</code>.</p></div>



<h2 class="wp-block-heading">Where Magento database time goes</h2>



<p class="wp-block-paragraph">Time in a slow Magento database usually goes to one of four patterns:</p>



<ol class="wp-block-list">
<li>Slow queries: a few requests take seconds each.</li>


<li>Too many queries: each request is quick, but every uncached page sends a long run of them.</li>


<li>Locks: queries wait for others to finish, often during reindexing or imports.</li>


<li>Bloated tables: logs and old records pile up in tables the store uses every day.</li>

</ol>



<p class="wp-block-paragraph">A busy database doesn&#8217;t say which pattern you have, so measure first: when you <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">audit Magento performance</a>, you time each page type from the cache and uncached, which shows whether the slow pages are the ones the database builds.</p>



<figure class="wp-block-table"><table><thead><tr><th>Pattern</th><th>What you see</th><th>First check</th><th>What fixes it</th></tr></thead><tbody><tr><td>Slow queries</td><td>A few requests take seconds each, and the same ones keep coming back</td><td>The slow query log, ranked with pt-query-digest</td><td>An index, a rewritten query, or a fix to the extension that sends it</td></tr><tr><td>Too many queries</td><td>Each query is quick, but uncached pages are slow and database load rises with traffic</td><td>Count the queries per page with Magento&#8217;s database profiler, on staging</td><td>More pages from the cache, indexers on Update by Schedule, a lighter page build</td></tr><tr><td>Locks</td><td>Queries pile up waiting, often while reindexing, importing or saving in the admin</td><td>SHOW FULL PROCESSLIST during a slow spell</td><td>Update by Schedule, imports outside peak hours, no schema changes at peak</td></tr><tr><td>Bloated tables</td><td>A few tables run to gigabytes and keep growing</td><td>List the 20 largest tables</td><td>Magento&#8217;s cleanup settings and cron, extension log settings, order archive</td></tr></tbody></table><figcaption class="wp-element-caption">Where Magento database time goes: four patterns, the first check and the fix</figcaption></figure>



<p class="wp-block-paragraph">If the database stays quiet while pages are slow, the cause is somewhere else, and our guide to <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">why a Magento store gets slow</a> matches symptoms to causes.</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-mysql-optimization-where-database-time-goes.png" alt="Decision tree for where Magento database time goes: slow queries, too many queries, locks or bloated tables" class="wp-image-26567" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-where-database-time-goes.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-where-database-time-goes-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-where-database-time-goes-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-where-database-time-goes-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-where-database-time-goes-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-where-database-time-goes-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-mysql-optimization-where-database-time-goes-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 database in this order. Each &quot;yes&quot; points to a different first check and a different fix.</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>During a slow spell, run <code>SHOW FULL PROCESSLIST</code> on the database. One query running for many seconds points to a slow query. The same short query repeated across many connections points to too many queries. A pile of connections waiting on each other points to locks. A <a href="https://scandiweb.com/blog/magento-load-testing/" target="_blank" rel="noopener">load test on a staging copy</a> shows whether locks appear at your real peak.</p></div>



<h2 class="wp-block-heading">How to find slow queries in Magento</h2>



<p class="wp-block-paragraph">To find slow queries in Magento, turn on the MySQL slow query log, which records every query that runs longer than a time you set. Rank the log with pt-query-digest to see which queries cost the most in total, then run EXPLAIN on the worst ones to see whether MySQL reads a whole table where an index would do.</p>



<h3 class="wp-block-heading">Turn on the MySQL slow query log</h3>



<p class="wp-block-paragraph">The <a href="https://dev.mysql.com/doc/refman/8.4/en/slow-query-log.html" target="_blank" rel="noopener">slow query log</a> is a file where MySQL writes down every query that takes longer than a time you choose. It&#8217;s off by default, and the default threshold is 10 seconds, far too high to catch the queries shoppers feel.</p>



<pre class="wp-block-code"><code># my.cnf, [mysqld] section. A starting point: agree the threshold with your host or DBA.
slow_query_log      = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time     = 1    # example value, in seconds. MySQL's default is 10</code></pre>



<p class="wp-block-paragraph">On Adobe Commerce Cloud, the log is already written to <code>/var/log/mysql/mysql-slow.log</code>. Run it on production during your busiest days, since that&#8217;s where the real traffic is, and agree the threshold with your host or DBA before you change it.</p>



<h3 class="wp-block-heading">Rank the worst queries with pt-query-digest</h3>



<p class="wp-block-paragraph"><a href="https://docs.percona.com/percona-toolkit/pt-query-digest.html" target="_blank" rel="noopener">pt-query-digest</a> is a free Percona tool that groups the log by query shape and ranks the groups by total time, slowest first.</p>



<pre class="wp-block-code"><code>pt-query-digest /var/log/mysql/mysql-slow.log &gt; slow-query-report.txt</code></pre>



<p class="wp-block-paragraph">Read the top of the report first. A query that is moderately slow but runs thousands of times can cost more than one very slow query that runs once an hour. Adobe names this tool in its database playbook for Commerce Cloud Pro.</p>



<h3 class="wp-block-heading">Read the query plan with EXPLAIN</h3>



<p class="wp-block-paragraph">An index is a sorted lookup list, like the index at the back of a book, that lets MySQL find rows without reading the whole table. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/implementation-playbook/best-practices/maintenance/resolve-database-performance-issues" target="_blank" rel="noopener">database performance guidance</a> says to run EXPLAIN (or EXPLAIN ANALYZE on MySQL) on each top query to find out what makes it slow, and a full table read where an index would do is the usual answer.</p>



<p class="wp-block-paragraph">In a Magento store, the typical causes are a custom or extension table with no index on the column it&#8217;s filtered by, an extension query that runs once per product, and a report or export run during trading hours. Add a missing index through the module&#8217;s <code>db_schema.xml</code>, the declarative schema, so the change survives the next deploy. Adobe advises against running schema changes by hand on production, and core tables are best left alone.</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 the slow query log on for a few days that include your busiest hours, then put the threshold back. A low threshold fills the log fast, and the MySQL manual warns that logging queries that don&#8217;t use indexes makes the log grow quickly.</p></div>



<h2 class="wp-block-heading">How to make Magento run fewer database queries</h2>



<p class="wp-block-paragraph">The fastest database query is the one Magento never sends. Serve as many pages as possible from the full page cache, which answers without reaching Magento or the database, keep indexers on Update by Schedule so heavy recalculation runs in the background, and lighten the page build, which decides how many queries every uncached page sends.</p>



<p class="wp-block-paragraph">Count before you tune. Magento&#8217;s database profiler, switched on in a staging copy, shows how many queries one page sends, so you can tell a 50-query page from a 600-query one before changing anything.</p>



<h3 class="wp-block-heading">Serve more pages from the full page cache</h3>



<p class="wp-block-paragraph">Varnish is a caching server placed in front of Magento that keeps finished pages and sends them without building them again. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cache/varnish/config-varnish" target="_blank" rel="noopener">Varnish guidance</a> notes that requests Varnish answers never reach the web server, so a cached page sends no database queries at all. Logged-in, filtered and search pages are cached too, per customer group and per search term, they just miss more often. Fewer cache variants means more hits.</p>



<h3 class="wp-block-heading">Keep indexers on Update by Schedule</h3>



<p class="wp-block-paragraph">Indexers precompute catalog data such as final prices into ready-made tables, and cron is Magento&#8217;s scheduler, which runs background jobs every minute. On Update on Save, every admin save triggers a recalculation, and Adobe says that on large stores with frequent updates this degrades database performance. On Update by Schedule, database triggers note what changed in changelog tables ending in <code>_cl</code>, cron applies the changes every minute, and a separate job clears processed rows every 5 minutes.</p>



<p class="wp-block-paragraph">Two warnings. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/implementation-playbook/best-practices/planning/database-on-cloud" target="_blank" rel="noopener">database configuration playbook</a> says switching modes creates triggers through DDL statements that can lock tables, so do it in maintenance mode with cron off. And don&#8217;t add custom triggers of your own, which Adobe doesn&#8217;t support. If an indexer is stuck or keeps falling behind, our list of <a href="https://scandiweb.com/blog/magento-indexers-known-issues-and-fixes/" target="_blank" rel="noopener">known indexer problems and their fixes</a> covers the usual causes.</p>



<h3 class="wp-block-heading">Make each page build ask for less</h3>



<p class="wp-block-paragraph">The remaining queries come from building each uncached page: the layout, its blocks and the data every block loads. Profile one slow page with a tool such as New Relic or Blackfire, then remove or replace the blocks and modules that query the most. Our <a href="https://scandiweb.com/blog/magento-profiling/" target="_blank" rel="noopener">Magento profiler guide</a> shows how to read a profile of one slow page. Extensions that load data they never show are a common find.</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, works on this part. 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">Our CTO&#8217;s benchmark found that in stock Magento, most of the time goes into building the page itself, &#8220;and much of that is spent fetching data piece by piece.&#8221; In a benchmark on one merchant&#8217;s Hyvä store, measured as server response time, a full category page ran 30 database queries with Expedio instead of 655, and the homepage ran 11 instead of 604. Both copies of the store ran on the same server with no full page cache, so Magento built every request. 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>



<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 count the queries one page sends, switch on Magento&#8217;s database profiler on a staging copy. It lists every query on the page with its time, plus the total count, so you can compare the same page before and after a change.</p></div>



<h2 class="wp-block-heading">Magento database maintenance: keep big tables in check</h2>



<p class="wp-block-paragraph">Magento database maintenance means keeping the tables that grow every day at a steady size: cron history, abandoned carts, visitor records, report events and indexer changelogs. Magento has a setting or a cron job for each of them, so most of the work is making sure cron runs and the settings fit your store.</p>



<h3 class="wp-block-heading">The tables that grow every day</h3>



<p class="wp-block-paragraph">Some tables get a new row for every visit, every cart and every scheduled job, so they grow whether or not the store sells anything.</p>



<figure class="wp-block-table"><table><thead><tr><th>Table</th><th>What fills it</th><th>What keeps it in check</th></tr></thead><tbody><tr><td><code>cron_schedule</code></td><td>A row for every scheduled background job</td><td>Cron history settings (Stores &gt; Settings &gt; Configuration &gt; Advanced &gt; System &gt; Cron). By default, successful runs are kept 60 minutes and failed ones 3 days</td></tr><tr><td><code>quote</code></td><td>Shopping carts, including abandoned ones</td><td>Quote Lifetime (days), 30 by default. A daily cron job deletes carts not updated within it, with their items and addresses</td></tr><tr><td><code>customer_visitor</code></td><td>A row for each visitor session</td><td>A daily cron job removes records older than the cookie lifetime plus one day</td></tr><tr><td><code>report_event</code>, <code>report_viewed_product_index</code></td><td>Product views and other shopper events for reports</td><td>Stores &gt; Settings &gt; Configuration &gt; General &gt; Reports. Adobe recommends turning reports off if you don&#8217;t use them</td></tr><tr><td>Tables ending in <code>_cl</code></td><td>Changes waiting for indexers on Update by Schedule</td><td>A cron job clears processed rows every 5 minutes, as long as cron runs and indexers keep up</td></tr><tr><td><code>sales_order</code>, <code>sales_order_grid</code> and other sales tables</td><td>Orders, invoices, shipments and credit memos</td><td>Never delete them. On Adobe Commerce, archive old orders, and use asynchronous grid indexing</td></tr><tr><td>Extension tables (logs, imports, feeds)</td><td>Whatever the extension records</td><td>The extension&#8217;s own cleanup setting, or its vendor</td></tr></tbody></table><figcaption class="wp-element-caption">Magento tables that grow, what fills them and what keeps them in check</figcaption></figure>



<p class="wp-block-paragraph">Everything in that table depends on cron running, which Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-admin/systems/tools/cron" target="_blank" rel="noopener">cron settings page</a> describes, and none of it touches orders. Before you delete anything yourself, back up the database, test on a staging copy and run it outside peak hours.</p>



<p class="wp-block-paragraph">To see which tables need attention, list the largest ones. This query is adapted from the size check in Adobe&#8217;s database playbook, reads only, and is safe on production.</p>



<pre class="wp-block-code"><code>-- The 20 largest tables in the store's database, in MB
SELECT table_name,
       ROUND((data_length + index_length) / 1024 / 1024) AS size_mb
FROM information_schema.TABLES
WHERE table_schema = DATABASE()
ORDER BY (data_length + index_length) DESC
LIMIT 20;</code></pre>



<p class="wp-block-paragraph">Large database tables are a standard line in our store health checks, and the same few kinds of table come up again and again.</p>



<h3 class="wp-block-heading">Three structural checks</h3>



<p class="wp-block-paragraph">Adobe&#8217;s playbook also lists three checks on how tables are built, each a quick query away.</p>



<ul class="wp-block-list">
<li>Every table on InnoDB. Extensions sometimes add tables in the older MyISAM format, which Adobe says to convert.</li>


<li>Every table with a primary key. Without one, InnoDB adds a hidden 6-byte key shared across all such tables, which can cause contention when several writes land at once.</li>


<li>No duplicate indexes. Each extra index is one more thing MySQL updates on every write, and a duplicate adds nothing to reads.</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>Before you delete anything, list your 20 largest tables. In our store health checks, the biggest are often log tables written by extensions, product-view reports and indexer changelogs. Each has a setting, a cron job or a vendor option that keeps it in check.</p></div>



<h2 class="wp-block-heading">Which MySQL settings matter for Magento?</h2>



<p class="wp-block-paragraph">The MySQL settings that matter most for Magento are the InnoDB buffer pool, sized to keep Magento&#8217;s index tables in memory, max_connections, matched to the number of PHP workers, and the temporary table limits that indexers need. Run a database version Adobe lists for your release: MySQL 8.4 or MariaDB 12.3 for Magento 2.4.9.</p>



<h3 class="wp-block-heading">Supported MySQL and MariaDB versions</h3>



<p class="wp-block-paragraph">Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/system-requirements" target="_blank" rel="noopener">system requirements</a> list the database versions for each release.</p>



<figure class="wp-block-table"><table><thead><tr><th>Magento release</th><th>MySQL</th><th>MariaDB</th></tr></thead><tbody><tr><td>2.4.9</td><td>8.4</td><td>12.3 (Commerce Cloud: 12.3 recommended, or 11.8)</td></tr><tr><td>2.4.8-p5</td><td>8.4</td><td>11.4, 11.8</td></tr><tr><td>2.4.8 to 2.4.8-p4</td><td>8.4</td><td>11.4</td></tr><tr><td>2.4.7-p10</td><td>Not supported</td><td>10.11, 11.8</td></tr><tr><td>2.4.7-p9</td><td>8.0</td><td>10.11</td></tr></tbody></table><figcaption class="wp-element-caption">Supported MySQL and MariaDB versions by Magento release (Adobe system requirements, updated October 13, 2026)</figcaption></figure>



<p class="wp-block-paragraph">MySQL 8.0 reached end of support on April 30, 2026, and Adobe supports only the combinations it lists. For PHP, search and cache versions too, see our <a href="https://scandiweb.com/blog/magento-2-system-requirements/" target="_blank" rel="noopener">Magento 2 system requirements</a> guide. Upgrade the database before Magento when moving to 2.4.9. Adobe&#8217;s own wording is to upgrade to MariaDB 12.3 before you upgrade to 2.4.9.</p>



<h3 class="wp-block-heading">The settings Adobe calls out</h3>



<p class="wp-block-paragraph">The InnoDB buffer pool is the memory where MySQL keeps the tables and indexes it reads most. Adobe doesn&#8217;t publish a full tuning guide, because each store and environment is different, but its <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/prerequisites/database-server/mysql" target="_blank" rel="noopener">general MySQL guidelines</a> and <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/performance-best-practices/software" target="_blank" rel="noopener">software recommendations</a> name a few settings.</p>



<figure class="wp-block-table"><table><thead><tr><th>Setting</th><th>What it controls</th><th>Adobe&#8217;s guidance</th><th>MySQL 8.4 default</th></tr></thead><tbody><tr><td><code>innodb_buffer_pool_size</code></td><td>Memory where InnoDB keeps table and index data</td><td>Large enough to keep all index tables in memory</td><td>128 MB</td></tr><tr><td><code>innodb_buffer_pool_instances</code></td><td>How that memory is split</td><td>At least 1 GB per instance</td><td>1, for pools of 1 GB or less</td></tr><tr><td><code>max_connections</code></td><td>Connections open at once</td><td>Match your PHP threads: about 300 small, 1,000 medium</td><td>151</td></tr><tr><td><code>innodb_thread_concurrency</code></td><td>Threads InnoDB runs at once</td><td>2 × (CPUs + disks)</td><td>0</td></tr><tr><td><code>tmp_table_size</code>, <code>max_heap_table_size</code></td><td>Temporary tables kept in memory</td><td>Higher for indexers, for example 64M</td><td>16 MB</td></tr><tr><td><code>max_allowed_packet</code></td><td>Largest single request</td><td>Above 16 MB for large product imports</td><td>64 MB</td></tr><tr><td><code>explicit_defaults_for_timestamp</code></td><td>How date columns get default values</td><td>Must be ON</td><td>ON (OFF on Commerce Cloud&#8217;s MariaDB)</td></tr></tbody></table><figcaption class="wp-element-caption">MySQL settings for Magento: Adobe guidance and MySQL 8.4 defaults</figcaption></figure>



<p class="wp-block-paragraph">MySQL 8.4 already starts <code>max_allowed_packet</code> at 64 MB, so check the current value with <code>SHOW VARIABLES LIKE 'max_allowed_packet'</code> before changing it. The values below are starting points, with verified sources only.</p>



<pre class="wp-block-code"><code># my.cnf, [mysqld] section. Starting points from Adobe's MySQL guidance.
# Size innodb_buffer_pool_size to your own server, then test on staging.
explicit_defaults_for_timestamp = ON
tmp_table_size                  = 64M    # Adobe's example value for indexers
max_heap_table_size             = 64M
max_connections                 = 300    # Adobe: about 300 small, 1,000 medium. Match your PHP threads

# MariaDB 10.4 or 10.6 only, where reindexing runs slower
optimizer_switch                    = 'rowid_filter=off'
optimizer_use_condition_selectivity = 1</code></pre>



<p class="wp-block-paragraph">Commerce Cloud Pro customers can&#8217;t change some of these themselves, so open a ticket with Adobe support.</p>



<h3 class="wp-block-heading">Read replicas and split databases</h3>



<p class="wp-block-paragraph">A replica is a read-only copy of the database. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/implementation-playbook/best-practices/planning/mysql-configuration" target="_blank" rel="noopener">MySQL configuration best practices</a> recommend a read-only connection (<code>MYSQL_USE_SLAVE_CONNECTION</code>) on Commerce Cloud Pro when you expect high database load. On your own servers, replication must be row-based. Don&#8217;t start a split database, which Adobe deprecated in 2.4.2. In our view, a replica takes reads off the main server and does nothing for slow queries or locks.</p>



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



<h3 class="wp-block-heading">What MySQL version does Magento 2.4.9 support?</h3>



<p class="wp-block-paragraph">Magento 2.4.9 supports MySQL 8.4 and MariaDB 12.3 on-premises, and Adobe Commerce Cloud runs it on MariaDB 12.3 (recommended) or 11.8. Release 2.4.8 supports MySQL 8.4 and MariaDB 11.4, plus 11.8 from patch 2.4.8-p5. MySQL 8.0 reached end of support on April 30, 2026, and neither 2.4.8 nor 2.4.9 lists it.</p>



<h3 class="wp-block-heading">How much memory should MySQL get on a Magento server?</h3>



<p class="wp-block-paragraph">Give the InnoDB buffer pool, the memory where MySQL keeps table and index data, enough room to hold Magento&#8217;s index tables, as Adobe advises. <a href="https://dev.mysql.com/doc/refman/8.4/en/innodb-buffer-pool.html" target="_blank" rel="noopener">The MySQL manual</a> notes that on a dedicated database server, up to 80% of physical memory often goes to the buffer pool. The default is 128 MB, so check that someone changed it, and split the pool so each instance gets at least 1 GB.</p>



<h3 class="wp-block-heading">Should you use the flat catalog in Magento 2?</h3>



<p class="wp-block-paragraph">No. Adobe no longer recommends flat catalogs and says continued use is known to cause performance degradation and other indexing issues, on 2.3.x and later. Flat tables copied each product into one wide row to avoid EAV lookups, and current Magento relies on its indexers and search engine instead. Before you switch them off, check whether any extension still depends on flat tables, as Adobe warns.</p>



<h3 class="wp-block-heading">How do you clean up a Magento database safely?</h3>



<p class="wp-block-paragraph">Back up the database, test on a staging copy, and let Magento&#8217;s own settings and cron jobs do most of the work: cron history lifetimes, the quote lifetime, report settings and changelog cleanup. Never delete orders, invoices or other sales records, and don&#8217;t empty indexer changelog tables by hand. For tables an extension writes, use the extension&#8217;s own cleanup option or ask its vendor.</p>



<h3 class="wp-block-heading">Should a Magento store run MySQL or MariaDB?</h3>



<p class="wp-block-paragraph">Either works if the version is one Adobe lists for your Magento release, because Adobe supports only the combinations it lists. Adobe Commerce Cloud runs MariaDB. If you&#8217;re on MariaDB 10.4 or 10.6 with an older release, Adobe recommends <code>optimizer_switch='rowid_filter=off'</code> and <code>optimizer_use_condition_selectivity = 1</code>, because reindexing runs slower on those versions.</p>



<h3 class="wp-block-heading">Can a read-only database replica speed up Magento?</h3>



<p class="wp-block-paragraph">It can take read traffic off the main database. On Adobe Commerce Cloud Pro, Adobe recommends turning on <code>MYSQL_USE_SLAVE_CONNECTION</code> when you expect high database load, so read-only traffic goes to a read-only node. On your own servers, replication must be row-based, because Adobe doesn&#8217;t support statement-based replication. Don&#8217;t plan a split database: Adobe deprecated that feature in version 2.4.2.</p>



<h2 class="wp-block-heading">Where to start with Magento 2 MySQL optimization</h2>



<p class="wp-block-paragraph">Magento 2 MySQL optimization starts with finding where the database time goes, and only then changing settings or servers. Find the slow queries, cut the queries each page sends, keep the fast-growing tables in check, and set the configuration to Adobe&#8217;s guidance, in that order.</p>



<p class="wp-block-paragraph">A bigger database server is the last step on that list, because a store that sends 600 queries to build one page will keep the new server busy too. The slow query log and the database profiler take an afternoon to set up and tell you which of the four patterns you have. Our Magento support team runs these checks in every store health check. The database is one layer of a Magento store, and to work through the others, from hosting to the browser, use 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>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What MySQL version does Magento 2.4.9 support?", "acceptedAnswer": {"@type": "Answer", "text": "Magento 2.4.9 supports MySQL 8.4 and MariaDB 12.3 on-premises, and Adobe Commerce Cloud runs it on MariaDB 12.3 (recommended) or 11.8. Release 2.4.8 supports MySQL 8.4 and MariaDB 11.4, plus 11.8 from patch 2.4.8-p5. MySQL 8.0 reached end of support on April 30, 2026, and neither 2.4.8 nor 2.4.9 lists it."}}, {"@type": "Question", "name": "How much memory should MySQL get on a Magento server?", "acceptedAnswer": {"@type": "Answer", "text": "Give the InnoDB buffer pool, the memory where MySQL keeps table and index data, enough room to hold Magento's index tables, as Adobe advises. The MySQL manual notes that on a dedicated database server, up to 80% of physical memory often goes to the buffer pool. The default is 128 MB, so check that someone changed it, and split the pool so each instance gets at least 1 GB."}}, {"@type": "Question", "name": "Should you use the flat catalog in Magento 2?", "acceptedAnswer": {"@type": "Answer", "text": "No. Adobe no longer recommends flat catalogs and says continued use is known to cause performance degradation and other indexing issues, on 2.3.x and later. Flat tables copied each product into one wide row to avoid EAV lookups, and current Magento relies on its indexers and search engine instead. Before you switch them off, check whether any extension still depends on flat tables, as Adobe warns."}}, {"@type": "Question", "name": "How do you clean up a Magento database safely?", "acceptedAnswer": {"@type": "Answer", "text": "Back up the database, test on a staging copy, and let Magento's own settings and cron jobs do most of the work: cron history lifetimes, the quote lifetime, report settings and changelog cleanup. Never delete orders, invoices or other sales records, and don't empty indexer changelog tables by hand. For tables an extension writes, use the extension's own cleanup option or ask its vendor."}}, {"@type": "Question", "name": "Should a Magento store run MySQL or MariaDB?", "acceptedAnswer": {"@type": "Answer", "text": "Either works if the version is one Adobe lists for your Magento release, because Adobe supports only the combinations it lists. Adobe Commerce Cloud runs MariaDB. If you're on MariaDB 10.4 or 10.6 with an older release, Adobe recommends optimizer_switch='rowid_filter=off' and optimizer_use_condition_selectivity = 1, because reindexing runs slower on those versions."}}, {"@type": "Question", "name": "Can a read-only database replica speed up Magento?", "acceptedAnswer": {"@type": "Answer", "text": "It can take read traffic off the main database. On Adobe Commerce Cloud Pro, Adobe recommends turning on MYSQL_USE_SLAVE_CONNECTION when you expect high database load, so read-only traffic goes to a read-only node. On your own servers, replication must be row-based, because Adobe doesn't support statement-based replication. Don't plan a split database: Adobe deprecated that feature in version 2.4.2."}}]}</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 you&#x27;re not sure which of the four patterns your store has, </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 find where the database time goes.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-mysql-optimization/">Magento 2 MySQL Optimization: Slow Queries, Indexes, and Configuration</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Magento 2 System Requirements: Server Sizing for Real Traffic</title>
		<link>https://scandiweb.com/blog/magento-2-system-requirements/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Mon, 02 Nov 2026 14:21: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=26582</guid>

					<description><![CDATA[<p>Magento 2 system requirements for 2.4.6 to 2.4.9: PHP, database, OpenSearch, Valkey and Varnish versions, and how to size the server for your traffic.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-2-system-requirements/">Magento 2 System Requirements: Server Sizing for Real Traffic</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-mreqs 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-hosting" target=_blank >
        Magento Hosting
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">You&#8217;re planning a Magento (Adobe Commerce) upgrade or a move to a new host, and the first page of the plan is Adobe&#8217;s list of required software: PHP (the programming language Magento runs on), the database, the search engine, the cache, the web server. It looks like half the plan is done. Then the next question on the same page asks how much processing power, memory and storage the new server should have, and nothing on the list answers it.</p>



<p class="wp-block-paragraph">The Magento 2 system requirements tell you which software versions a release runs on. How big the server must be is a separate question, and it&#8217;s the one with a price tag: the hosting bill every month, and the orders you lose if pages slow down in the busiest hour of a sale.</p>



<h2 class="wp-block-heading">What are the Magento 2 system requirements?</h2>



<p class="wp-block-paragraph">Magento 2.4.9, the latest release, needs PHP 8.5, MySQL 8.4 or MariaDB 12.3, OpenSearch 3, Valkey 9, Varnish 8, nginx 1.30, RabbitMQ 4.3 or ActiveMQ Artemis 2, and Composer 2.10, on 64-bit Linux. Adobe supports only the combinations in its table, and each patch release can change them.</p>



<p class="wp-block-paragraph">Adobe publishes one table per release line and updates it with every patch release, most recently on October 13, 2026. It supports only the combinations in <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/system-requirements" target="_blank" rel="noopener">Adobe&#8217;s table</a>, so a stack that is close enough can mean Adobe Support asks you to change a version before it investigates a problem.</p>



<figure class="wp-block-table"><table><thead><tr><th>Requirement</th><th>2.4.9</th><th>2.4.8-p5</th><th>2.4.7-p10</th><th>2.4.6-p15</th></tr></thead><tbody><tr><td>PHP</td><td>8.5</td><td>8.3, 8.4</td><td>8.2, 8.3</td><td>8.1, 8.2</td></tr><tr><td>MySQL</td><td>8.4</td><td>8.4</td><td>Not supported</td><td>Not supported</td></tr><tr><td>MariaDB</td><td>12.3</td><td>11.4, 11.8</td><td>10.11, 11.8</td><td>10.11</td></tr><tr><td>OpenSearch</td><td>3</td><td>3</td><td>2.19, 3</td><td>2.19, 3</td></tr><tr><td>Valkey (cache and sessions)</td><td>9</td><td>8.1</td><td>8.1</td><td>8.1</td></tr><tr><td>Redis (cache)</td><td>Not supported</td><td>Not supported</td><td>Not supported</td><td>Not supported</td></tr><tr><td>Varnish</td><td>8</td><td>8</td><td>8</td><td>8</td></tr><tr><td>nginx</td><td>1.30</td><td>1.30</td><td>1.30</td><td>1.30</td></tr><tr><td>RabbitMQ or ActiveMQ Artemis</td><td>4.3 or 2</td><td>4.3 or 2</td><td>4.3 or 2</td><td>4.3 or 2</td></tr><tr><td>Composer</td><td>2.10</td><td>2.10</td><td>2.10</td><td>2.2.26+</td></tr><tr><td>Standard support ends</td><td>May 31, 2029</td><td>May 31, 2028</td><td>May 31, 2027 (extended to May 31, 2028)</td><td>Ended Aug 11, 2026 (extended to Aug 31, 2027)</td></tr></tbody></table><figcaption class="wp-element-caption">Magento 2 system requirements by release: latest patches of 2.4.6 to 2.4.9 (Adobe, updated October 13, 2026)</figcaption></figure>



<p class="wp-block-paragraph">On-premises Magento 2 system requirements for the latest patch of each supported release line, from Adobe&#8217;s table updated October 13, 2026. Support dates from Adobe&#8217;s lifecycle policy. Extended support applies to Adobe Commerce.</p>



<p class="wp-block-paragraph">These are the Magento 2 requirements for the latest patch of each line, and the Magento version requirements change with every patch, so read the column for the patch you run. Each line also has an end date, and our list of <a href="https://scandiweb.com/blog/magento-end-of-life/" target="_blank" rel="noopener">Magento end of life dates</a> covers the support periods and patches in detail. End of life applies to each release line, and the platform itself has no end date.</p>



<h3 class="wp-block-heading">Magento PHP version by release</h3>



<p class="wp-block-paragraph">Magento 2.4.9 needs PHP 8.5. Adobe allows PHP 8.4 only while you upgrade and dropped PHP 8.2 and 8.3 for this release, per the <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/release/notes/adobe-commerce/2-4-9" target="_blank" rel="noopener">2.4.9 release notes</a>. Magento 2.4.8 runs on PHP 8.3 or 8.4, 2.4.7 on 8.2 or 8.3, and 2.4.6 on 8.1 or 8.2.</p>



<p class="wp-block-paragraph">The Magento PHP requirements also follow PHP&#8217;s own calendar. PHP 8.2 stops receiving security fixes on December 31, 2026, per the <a href="https://www.php.net/supported-versions.php" target="_blank" rel="noopener">PHP supported versions</a> list, so a 2.4.6 or 2.4.7 store on 8.2 has to move before then.</p>



<p class="wp-block-paragraph">Install the PHP extensions on Adobe&#8217;s list, among them bcmath, intl, mbstring, pdo_mysql and sodium. Keep OPcache on, PHP&#8217;s built-in cache of compiled code, and apply the same PHP settings to the command line and the web server, since cron and deploys run from the command line.</p>



<h3 class="wp-block-heading">Database, search and cache versions</h3>



<p class="wp-block-paragraph">MySQL and MariaDB are two compatible database servers, and Magento runs on either. Magento 2.4.9 lists MySQL 8.4 or MariaDB 12.3. MySQL 8.0 reached end of support on April 30, 2026, and Adobe&#8217;s tables for 2.4.6 and 2.4.7 now list MariaDB only.</p>



<p class="wp-block-paragraph">OpenSearch is the search engine behind catalog search and layered navigation filters. Adobe lists OpenSearch 3 for 2.4.8 and 2.4.9, and 2.19 or 3 for 2.4.6 and 2.4.7. Elasticsearch 7.17 reached end of support on January 15, 2026, and Elasticsearch 8 stays listed for 2.4.7 and 2.4.8 only.</p>



<p class="wp-block-paragraph">Valkey is an open-source data store that works like Redis and holds Magento&#8217;s cache and sessions. Varnish is a page cache that runs in front of the web server. Adobe lists Valkey 9 for 2.4.9, and Redis is no longer supported as the cache on current patches, per <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/implementation-playbook/best-practices/planning/redis-valkey-service-configuration" target="_blank" rel="noopener">Adobe&#8217;s Valkey and Redis guidance</a>. Varnish 8 appears in every latest-patch column. For setup, see our <a href="https://scandiweb.com/blog/magento-2-varnish-configuration/" target="_blank" rel="noopener">Magento 2 Varnish configuration</a> guide. For the message queue, Adobe lists RabbitMQ 4.3 or ActiveMQ Artemis 2, and names Artemis as the long-term broker.</p>



<h3 class="wp-block-heading">Web server, operating system and other requirements</h3>



<p class="wp-block-paragraph">Every current table lists nginx 1.30 with PHP-FPM, the process manager that runs PHP for the web server. Apache 2.4 last appears in Adobe&#8217;s tables for 2.4.8-p2, 2.4.7-p6 and 2.4.6-p11. Magento runs on 64-bit Linux only, such as Red Hat Enterprise Linux, Ubuntu or Debian.</p>



<p class="wp-block-paragraph">You also need a valid SSL certificate (self-signed ones are not supported), TLS 1.2 or later for PayPal and repo.magento.com, a mail server, and Composer 2.10 (2.2.26 or later on 2.4.6). Keep Xdebug on development machines only: Adobe says the module alone can add up to 30% to response time even with no debug session running.</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 the row for your exact patch. On 2.4.8, patch p4 lists Varnish 7.7, Valkey 8 and nginx 1.28, while p5 moves to Varnish 8, Valkey 8.1 and nginx 1.30.</p></div>



<h2 class="wp-block-heading">Adobe Commerce system requirements on Cloud</h2>



<p class="wp-block-paragraph">Adobe Commerce on Cloud has its own table. For 2.4.9 it lists PHP 8.5, MariaDB 12.3 (recommended) or 11.8, OpenSearch 3, Valkey 9, RabbitMQ 4.3, ActiveMQ Artemis 2 and nginx 1.30, with Fastly as the page cache in place of Varnish. Magento Open Source has no separate table, so self-hosted stores check the on-premises one.</p>



<p class="wp-block-paragraph">On Cloud, Adobe sets the services and their versions in the project&#8217;s <code>services.yaml</code> file. The Pro production environment runs three virtual machines behind a load balancer, and each one carries the whole stack: Fastly, nginx with PHP-FPM, Valkey or Redis, OpenSearch and one node of a Galera MariaDB cluster, as Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/architecture/pro-architecture" target="_blank" rel="noopener">Pro architecture</a> page describes. When capacity goes up, the three machines are resized one at a time, so the site stays up.</p>



<p class="wp-block-paragraph">From the Pro 48 cluster up, a project can move to the scaled architecture: at least six nodes, three for the database and services and three for the web server. The service tier grows only by making its servers bigger, while the web tier grows by adding servers.</p>



<p class="wp-block-paragraph">Magento Open Source has no table of its own. Adobe lists its PHP extensions on the same requirements page, so a self-hosted Open Source store uses the on-premises table above. Stores on <a href="https://scandiweb.com/blog/adobe-commerce-as-a-cloud-service/" target="_blank" rel="noopener">Adobe Commerce as a Cloud Service</a>, Adobe&#8217;s fully managed version, don&#8217;t run this stack themselves: Adobe manages the infrastructure, patching and upgrades.</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 Commerce Cloud Pro, every production node runs the whole stack. Only the scaled architecture, from the Pro 48 cluster up, splits web and service nodes. Find out which one you have before you plan a capacity increase.</p></div>



<h2 class="wp-block-heading">Magento server requirements vs the capacity your traffic needs</h2>



<p class="wp-block-paragraph">Magento server requirements list the software versions a release runs on. Capacity is how many requests a server can answer before pages slow down, and it depends on four things: traffic at your busiest hour, how many pages come from the cache, how long Magento takes to build the rest, and background jobs such as indexing.</p>



<p class="wp-block-paragraph">A server can meet every line of Adobe&#8217;s table and still slow down at the first sale, because the Magento 2 server requirements say nothing about how many shoppers arrive at once.</p>



<h3 class="wp-block-heading">What decides how much server a Magento store needs</h3>



<p class="wp-block-paragraph">Four numbers decide it, and only the first one shows up in a marketing calendar.</p>



<ul class="wp-block-list">
<li>Peak traffic: requests in the busiest hour, the number that sizes the server. A monthly visitor count hides it.</li>


<li>Cache hit rate: the share of pages served ready-made by Varnish, or by Fastly on Cloud. Those requests never reach the web server.</li>


<li>Build time: how long Magento takes to build a page the cache doesn&#8217;t have. It grows with catalog size, extensions, filters and search.</li>


<li>Background work: cron jobs, indexing, imports and the admin, which use the same CPU and memory as shoppers do.</li>

</ul>



<p class="wp-block-paragraph">Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/performance-best-practices/hardware" target="_blank" rel="noopener">hardware recommendations</a> put the first two together in one sentence: &#8220;Commerce web nodes serve all requests that are not cached or cannot be cached through the application.&#8221;</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-2-system-requirements-versions-vs-capacity.png" alt="Magento 2 system requirements as a stack of software versions beside the four inputs that set server capacity" class="wp-image-26579" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-versions-vs-capacity.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-versions-vs-capacity-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-versions-vs-capacity-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-versions-vs-capacity-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-versions-vs-capacity-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-versions-vs-capacity-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-versions-vs-capacity-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;">Magento system requirements fix the software. The server size comes from your own traffic, cache and page build times.</figcaption></figure></div>



<h3 class="wp-block-heading">Why cache misses set the size of the web tier</h3>



<p class="wp-block-paragraph">The full page cache keeps a separate copy of a page per customer group, store, currency and language, and a separate copy of search results per search term. So logged-in shoppers, filtered category pages and searches miss far more often than a plain category page does. Cart, checkout and account pages, plus anything sent as a form submission, always go to Magento. After a deploy or a cache flush, every page misses until shoppers or a cache warmer refill it.</p>



<p class="wp-block-paragraph">Each miss keeps a CPU core busy for as long as Magento takes to build the page, while hits barely touch the web servers. That is why the web tier is sized for misses, and why the hit rate matters as much as the traffic figure. Our guide to the <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">Magento full page cache</a> explains which pages miss and how to cut the misses.</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>Size the server for the busiest hour. A store with a modest monthly audience can still need a large web tier when a sale sends most of a day&#8217;s shoppers in at once.</p></div>



<h2 class="wp-block-heading">How to size a Magento server for your traffic</h2>



<p class="wp-block-paragraph">To size a Magento server:</p>



<ol class="wp-block-list">
<li>Measure requests at your busiest hour and your cache hit rate.</li>


<li>Count CPU cores with Adobe&#8217;s formula, expected requests divided by two plus cron processes.</li>


<li>Size memory for PHP, the database and the caches.</li>


<li>Give each tier its own servers and plan for peaks.</li>


<li>Load test at that size.</li>

</ol>



<p class="wp-block-paragraph">The five steps turn your own numbers into the right server for Magento 2, in terms a host or a developer can quote against.</p>



<h3 class="wp-block-heading">1. Measure peak requests and the cache hit rate</h3>



<p class="wp-block-paragraph">From your hosting dashboard, your CDN or New Relic, a monitoring service that records every request, take two numbers: requests per second in the busiest hour of your busiest day, and the share of them served from the cache. Monthly visitor counts don&#8217;t show the peak, and the peak is what the server has to survive.</p>



<p class="wp-block-paragraph">Before we size a server for a store we host, we ask for visit counts, requests, cache usage, media size and database size. Then time how long uncached pages take to build, one page type at a time. Our guide on <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">how to audit Magento performance</a> walks through it. As a sanity check first, Adobe expects any page with cacheable blocks to load in under 150 ms when Varnish is working.</p>



<h3 class="wp-block-heading">2. Count CPU cores with Adobe&#8217;s formula</h3>



<p class="wp-block-paragraph">Adobe&#8217;s rule of thumb is that &#8220;One CPU core can serve around two (sometimes up to four) Commerce requests effectively.&#8221; Its formula for the web tier:</p>



<p class="wp-block-paragraph"><code>cores = (expected requests / 2) + cron processes</code></p>



<p class="wp-block-paragraph">&#8220;Expected requests&#8221; means requests reaching Magento at the same moment, so only cache misses count. The hit rate from step 1 turns peak traffic into that number.</p>



<p class="wp-block-paragraph">As an example, say your monitoring shows about 20 requests reaching Magento at the same moment at peak, and the server runs 4 cron processes. The formula gives 20 divided by 2, plus 4: 14 cores across the web servers, before any headroom.</p>



<p class="wp-block-paragraph">Add headroom above the peak you measured, and keep cron&#8217;s share in the sum. Indexing and imports compete with shoppers for the same cores, and a reindex that lands in the busiest hour shows up as slow pages.</p>



<h3 class="wp-block-heading">3. Size memory for PHP, the database and the caches</h3>



<p class="wp-block-paragraph">Adobe publishes no single RAM figure for a production store. It gives memory per PHP process instead, and the figure depends on what the process does.</p>



<figure class="wp-block-table"><table><thead><tr><th>What the PHP process does</th><th>Memory per process (Adobe)</th></tr></thead><tbody><tr><td>Serves storefront pages only</td><td>256 MB</td></tr><tr><td>Serves admin pages on a large catalog</td><td>1 GB</td></tr><tr><td>Runs cron indexing on a large catalog</td><td>More than 256 MB</td></tr><tr><td>Compiles code and deploys static files</td><td>756 MB (Adobe sets the limit at 1 GB)</td></tr><tr><td>Runs a whole store on one server</td><td>2 GB</td></tr><tr><td>Pipeline deployment</td><td>2 GB on the build server, 1 GB on web servers</td></tr></tbody></table><figcaption class="wp-element-caption">PHP memory per process by task (Adobe hardware recommendations)</figcaption></figure>



<p class="wp-block-paragraph">PHP memory per process, from Adobe&#8217;s hardware recommendations. Multiply by the PHP workers you run at peak.</p>



<p class="wp-block-paragraph">Total PHP memory is arithmetic: memory per process times the PHP workers you run at peak. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/installation-guide/prerequisites/php-settings" target="_blank" rel="noopener">PHP settings</a> page sets the limit at 1G for compiling and deploying and 2G for debugging.</p>



<p class="wp-block-paragraph">The database should get memory close to half the size of its data, by Adobe&#8217;s guidance, so its indexes stay in memory. Our guide to <a href="https://scandiweb.com/blog/magento-mysql-optimization/" target="_blank" rel="noopener">Magento MySQL optimization</a> covers the database settings in detail. Varnish needs enough to hold your most popular pages. Valkey (or Redis on older releases) holds all other caches, and the block cache grows with SKUs times store views, so a large catalog with many store views needs more. Keep sessions in their own instance. Upgrades can need up to 2 GB of RAM, and Adobe says to add a swap file on a server with less.</p>



<h3 class="wp-block-heading">4. Give each tier its own servers and plan for peaks</h3>



<p class="wp-block-paragraph">A tier is a group of servers that does one job: web, database, search or cache. Adobe&#8217;s guidance is to install Varnish on a separate server in front of the web tier. Keep staging on its own resources too, so test runs and imports don&#8217;t take CPU from shoppers.</p>



<p class="wp-block-paragraph">For short peaks, <a href="https://scandiweb.com/blog/server-autoscaling-in-magento-2/" target="_blank" rel="noopener">server autoscaling in Magento 2</a> adds web servers while traffic is high and removes them afterward. On Commerce Cloud, Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/architecture/autoscaling" target="_blank" rel="noopener">auto scaling</a> adds web nodes when CPUs across the web tier run at 75% for a minute while traffic climbs 20% for five minutes, within your contracted limits, and a planned upsize needs 48 business hours&#8217; notice.</p>



<p class="wp-block-paragraph">If you&#8217;d rather not run the tiers yourself, these are the <a href="https://scandiweb.com/services/magento-hosting" target="_blank" rel="noopener">Magento hosting requirements</a> our team provisions for every store we host.</p>



<h3 class="wp-block-heading">5. Load test at the size you plan to run</h3>



<p class="wp-block-paragraph">Run one round with the full page cache on and one with it off, to see what the server can build on a bad day. Raise the load in steps and note where response times bend: that point is your capacity. Adobe enables Cloud auto scaling on production only after load testing on staging, and that order holds anywhere. Our <a href="https://scandiweb.com/blog/black-friday-code-freeze/" target="_blank" rel="noopener">Black Friday load-testing plan</a> sets the target, the traffic mix and the pass criteria. Our guide to <a href="https://scandiweb.com/blog/magento-load-testing/" target="_blank" rel="noopener">Magento load testing</a> covers the tools and the run, step by step.</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-2-system-requirements-sizing-flow.png" alt="Flow for sizing a Magento server: peak requests, cache misses, CPU cores, memory, then a load test at that size" class="wp-image-26580" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-sizing-flow.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-sizing-flow-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-sizing-flow-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-sizing-flow-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-sizing-flow-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-sizing-flow-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-2-system-requirements-sizing-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;">Size a Magento server from the peak down: requests that reach Magento, then cores, memory and a load test at that size.</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>A web server that only serves the storefront needs a quarter of the PHP memory per process that admin work on a large catalog does, by Adobe&#8217;s figures. Keeping the admin, cron and deploys off the storefront servers makes each one cheaper to size.</p></div>



<h2 class="wp-block-heading">How faster page builds change the server you need</h2>



<p class="wp-block-paragraph">Every page the cache doesn&#8217;t serve keeps a CPU core busy while Magento builds it, so a faster build lets the same server answer more requests before response times rise. Our <a href="https://scandiweb.com/blog/fastest-ecommerce-platform/" target="_blank" rel="noopener">fastest eCommerce platform</a> research shows how Magento&#8217;s server response compares with other platforms. Adding servers also raises capacity, yet each uncached page still takes just as long to build, and every extra server adds to the monthly bill. A <a href="https://scandiweb.com/blog/magento-profiling/" target="_blank" rel="noopener">Magento profiler</a> shows which steps of that build take the time.</p>



<p class="wp-block-paragraph">This is the part <a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> works on. Expedio is scandiweb&#8217;s Magento module with an open-source core. 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">Faster builds show up as capacity. 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 the same data and no full page cache, so Magento built every request. With Expedio, the same server handled 3x the traffic before response times started to rise, and the homepage ran 11 database queries instead of 604. The <a href="https://scandiweb.com/blog/expedio-benchmark/" target="_blank" rel="noopener">Expedio benchmark</a> covers the method and what it didn&#8217;t test, including cart and checkout.</p>



<p class="wp-block-paragraph">Server size is one layer of a fast store. To work through the others, from caching to the browser, use 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>



<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 add servers, check how long uncached pages take to build. If a faster build lets each core serve twice as many requests, the next hardware purchase can wait.</p></div>



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



<h3 class="wp-block-heading">What PHP version does Magento 2.4.9 need?</h3>



<p class="wp-block-paragraph">Magento 2.4.9 needs PHP 8.5 in production. Adobe allows PHP 8.4 only while you upgrade and dropped PHP 8.2 and 8.3 for this release. Magento 2.4.8 runs on PHP 8.3 or 8.4, and 2.4.7 on 8.2 or 8.3. PHP 8.2 stops receiving security fixes on December 31, 2026, so plan any move off it before then.</p>



<h3 class="wp-block-heading">How much RAM does a Magento 2 server need?</h3>



<p class="wp-block-paragraph">Adobe publishes no single RAM figure for a production Magento server. It gives memory per PHP process instead: 256 MB for a web server that only serves the storefront, 1 GB for admin work on a large catalog, and 2 GB for a single-server store. Multiply that by the PHP workers you run at peak, then add the database, search and caches.</p>



<h3 class="wp-block-heading">How many CPU cores does a Magento store need?</h3>



<p class="wp-block-paragraph">Adobe&#8217;s rule of thumb is that one CPU core can serve around two Magento requests effectively, sometimes up to four. Its formula is the number of expected requests divided by two, plus the number of cron processes. Count only the requests that reach Magento, because pages served from Varnish, or Fastly on Commerce Cloud, never reach the web server.</p>



<h3 class="wp-block-heading">Does Magento 2.4.9 still support Redis?</h3>



<p class="wp-block-paragraph">No. Adobe doesn&#8217;t support Redis as the cache for Adobe Commerce 2.4.9, or for patch releases after 2.4.5-p16, 2.4.6-p14, 2.4.7-p9 and 2.4.8-p4. Use Valkey instead, an open-source data store that works like Redis. Version 9 is listed for 2.4.9, and Adobe recommends separate instances for sessions, the cache and the full page cache.</p>



<h3 class="wp-block-heading">Does Magento 2 run on nginx or Apache?</h3>



<p class="wp-block-paragraph">Adobe&#8217;s current requirement tables list nginx 1.30 as the web server for every supported release line, with PHP running through PHP-FPM. Apache 2.4 last appears for 2.4.8-p2, 2.4.7-p6 and 2.4.6-p11 in Adobe&#8217;s older tables. Adobe supports only the combinations it lists, so nginx is the safe choice for a new or upgraded store.</p>



<h3 class="wp-block-heading">Can you run Magento 2 on Windows or macOS?</h3>



<p class="wp-block-paragraph">Not in production. Adobe supports Magento 2 only on 64-bit Linux, such as Red Hat Enterprise Linux, Ubuntu or Debian, and says Microsoft Windows and macOS are not supported. For local development on Windows or a Mac, run Magento inside a Linux container or virtual machine, so your setup matches the server it will run on.</p>



<h2 class="wp-block-heading">Check the Magento 2 system requirements, then size for your peak</h2>



<p class="wp-block-paragraph">The Magento 2 system requirements are the fixed part of the job: one table per release, checked against your exact patch. The server size is the part only your store can answer, from its peak traffic, its cache hit rate and how long its pages take to build. Measure those first, then buy the server.</p>



<p class="wp-block-paragraph">Adobe&#8217;s table changed on October 13, 2026, and patch releases keep changing it, so read it again before every upgrade. Re-run the sizing before each sale season too, because catalog size, extensions and the cache hit rate drift from one year to the next. If the numbers point to a new host, <a href="https://scandiweb.com/blog/finding-the-best-magento-hosting-providers-in-2023/" target="_blank" rel="noopener">compare Magento hosting providers</a> against them before you sign.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What PHP version does Magento 2.4.9 need?", "acceptedAnswer": {"@type": "Answer", "text": "Magento 2.4.9 needs PHP 8.5 in production. Adobe allows PHP 8.4 only while you upgrade and dropped PHP 8.2 and 8.3 for this release. Magento 2.4.8 runs on PHP 8.3 or 8.4, and 2.4.7 on 8.2 or 8.3. PHP 8.2 stops receiving security fixes on December 31, 2026, so plan any move off it before then."}}, {"@type": "Question", "name": "How much RAM does a Magento 2 server need?", "acceptedAnswer": {"@type": "Answer", "text": "Adobe publishes no single RAM figure for a production Magento server. It gives memory per PHP process instead: 256 MB for a web server that only serves the storefront, 1 GB for admin work on a large catalog, and 2 GB for a single-server store. Multiply that by the PHP workers you run at peak, then add the database, search and caches."}}, {"@type": "Question", "name": "How many CPU cores does a Magento store need?", "acceptedAnswer": {"@type": "Answer", "text": "Adobe's rule of thumb is that one CPU core can serve around two Magento requests effectively, sometimes up to four. Its formula is the number of expected requests divided by two, plus the number of cron processes. Count only the requests that reach Magento, because pages served from Varnish, or Fastly on Commerce Cloud, never reach the web server."}}, {"@type": "Question", "name": "Does Magento 2.4.9 still support Redis?", "acceptedAnswer": {"@type": "Answer", "text": "No. Adobe doesn't support Redis as the cache for Adobe Commerce 2.4.9, or for patch releases after 2.4.5-p16, 2.4.6-p14, 2.4.7-p9 and 2.4.8-p4. Use Valkey instead, an open-source data store that works like Redis. Version 9 is listed for 2.4.9, and Adobe recommends separate instances for sessions, the cache and the full page cache."}}, {"@type": "Question", "name": "Does Magento 2 run on nginx or Apache?", "acceptedAnswer": {"@type": "Answer", "text": "Adobe's current requirement tables list nginx 1.30 as the web server for every supported release line, with PHP running through PHP-FPM. Apache 2.4 last appears for 2.4.8-p2, 2.4.7-p6 and 2.4.6-p11 in Adobe's older tables. Adobe supports only the combinations it lists, so nginx is the safe choice for a new or upgraded store."}}, {"@type": "Question", "name": "Can you run Magento 2 on Windows or macOS?", "acceptedAnswer": {"@type": "Answer", "text": "Not in production. Adobe supports Magento 2 only on 64-bit Linux, such as Red Hat Enterprise Linux, Ubuntu or Debian, and says Microsoft Windows and macOS are not supported. For local development on Windows or a Mac, run Magento inside a Linux container or virtual machine, so your setup matches the server it will run on."}}]}</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>Planning an upgrade or a move and want a second opinion on the numbers? </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>Send us your peak traffic</em></a><em> and current setup, and we&#x27;ll help you size the server.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-2-system-requirements/">Magento 2 System Requirements: Server Sizing for Real Traffic</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Fastest eCommerce Platform? Server Response Times for 12 Platforms</title>
		<link>https://scandiweb.com/blog/fastest-ecommerce-platform/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Mon, 02 Nov 2026 11:58: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=26559</guid>

					<description><![CDATA[<p>scandiweb compared Chrome data for 12 eCommerce platforms: which give shoppers a fast server response, with September 2026 numbers for each one.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/fastest-ecommerce-platform/">The Fastest eCommerce Platform? Server Response Times for 12 Platforms</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-fecpl 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/magento-support" target=_blank >
        Magento Support
      </a>
    </li>
    
  </ul>
</div>
</div>


<p class="wp-block-paragraph">Every eCommerce platform says it&#8217;s fast, and every vendor has a demo store that loads in a blink. A demo can&#8217;t show how a platform performs across thousands of real stores, with real catalogs, real hosting and real shoppers on their phones. That&#8217;s usually the question behind a search for the fastest eCommerce platform: before you choose a platform, or blame the one you run, you want to know how fast stores on it really are.</p>



<p class="wp-block-paragraph">scandiweb looked at the first thing every shopper waits for: time to first byte (TTFB), how long a store&#8217;s server takes to start sending a page. Until that first byte arrives, the screen stays blank. We compared 12 eCommerce platforms on the Chrome UX Report, Google&#8217;s dataset of real visits from Chrome users, for September 2026, and checked whether the differences hold for sites of the same size, in different countries and over the past three years.</p>



<h2 class="wp-block-heading">Key findings</h2>



<p class="wp-block-paragraph">Seven numbers summarize the study. Each one comes from scandiweb&#8217;s analysis of Chrome UX Report data, served through the HTTP Archive Tech Report, for September 2026 and for the three Septembers before it. Unless a finding says otherwise, every figure is the share of sites whose 75th-percentile mobile time to first byte was 800 ms or less.</p>



<ul class="wp-block-list">
<li>scandiweb&#8217;s analysis of Chrome UX Report data for September 2026 found that 83.8% of Shopify sites (n = 430,634) gave mobile visitors a good time to first byte, the highest share of the 12 eCommerce platforms compared.</li>


<li>In the same September 2026 data, 23.0% of Magento sites (n = 31,799) had a good mobile time to first byte, ranking Magento 10th of 12 platforms, ahead of WooCommerce (12.1%, n = 519,794) and VTEX (4.8%, n = 3,198).</li>


<li>The median Magento site&#8217;s 75th-percentile mobile time to first byte fell between 1,200 and 1,299 ms in September 2026, more than twice the 500–599 ms of the median Shopify site, according to scandiweb&#8217;s analysis.</li>


<li>Among the 100,000 most visited sites, 23.0% of Magento sites (n = 739) had a good mobile time to first byte in September 2026, against 78.9% of Shopify sites (n = 1,829), scandiweb found.</li>


<li>Magento sites built with the Hyvä theme passed all three Core Web Vitals on mobile 66.4% of the time in September 2026 (n = 4,593), against 44.6% for Magento overall, but their good time-to-first-byte share was 23.2%, almost the same as Magento&#8217;s 23.0%.</li>


<li>Between September 2023 and September 2026, the share of Magento sites with a good mobile time to first byte rose from 16.1% to 23.0%, while Shopify&#8217;s rose from 78.1% to 83.8%, scandiweb&#8217;s trend analysis of Chrome UX Report data shows.</li>


<li>For visitors in the United States in September 2026, 13.7% of Magento sites had a good mobile time to first byte, against 88.9% of Shopify sites, the widest gap of the three countries scandiweb checked.</li>

</ul>



<h2 class="wp-block-heading">How scandiweb measured eCommerce platform speed</h2>



<p class="wp-block-paragraph">scandiweb pulled Chrome UX Report field data for 12 eCommerce platforms and for all websites from the HTTP Archive Tech Report API on October 29, 2026. September 2026 is the snapshot month, and September 2023 to September 2026 is the trend. The main measure is the share of sites whose 75th-percentile time to first byte was 800 ms or less, with mobile and desktop counted separately.</p>



<p class="wp-block-paragraph">The 12 platforms are Shopify, Webflow, Squarespace, Wix, BigCommerce, SAP Commerce Cloud, Shopware, Salesforce Commerce Cloud, PrestaShop, Magento, WooCommerce and VTEX. Magento sites running the Hyvä theme appear as a separate row, and &#8220;All websites&#8221; is the reference row for every site with Chrome data.</p>



<p class="wp-block-paragraph">The instrument is the <a href="https://httparchive.org/reports/techreport/landing" target="_blank" rel="noopener">HTTP Archive Tech Report</a>. It serves Chrome UX Report field data aggregated per technology, where the technology is detected by HTTP Archive&#8217;s monthly crawl using Wappalyzer rules. The API is public and needs no key, and its <a href="https://github.com/HTTPArchive/tech-report-apis/blob/main/apps/report-api/README.md" target="_blank" rel="noopener">methodology is documented on GitHub</a>. The pull took 104 calls with 0 failures.</p>



<p class="wp-block-paragraph">Each site counts once, by its 75th-percentile value over a 28-day window. A site has a good time to first byte when that value is 800 ms or less, which means the server started responding within 0.8 seconds on at least three out of four visits. <a href="https://web.dev/articles/ttfb" target="_blank" rel="noopener">Google&#8217;s TTFB guidance</a> calls 0.8 seconds or less good and more than 1.8 seconds poor.</p>



<p class="wp-block-paragraph">A site passes Core Web Vitals when its 75th-percentile Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift are all good. The <a href="https://web.dev/articles/vitals" target="_blank" rel="noopener">Web Vitals thresholds</a> are 2.5 seconds, 200 milliseconds and 0.1. In the <a href="https://developer.chrome.com/docs/crux/methodology/metrics" target="_blank" rel="noopener">Chrome UX Report methodology</a>, TTFB is listed as an experimental metric and is only collected on full page loads.</p>



<p class="wp-block-paragraph">Popularity tiers use the Chrome UX Report rank: the top 1 million, 100,000, 10,000 and 1,000 origins. Where a tier has a small sample, its n is reported next to the figure. Cells with fewer than 20 sites are shown as counts rather than percentages.</p>



<p class="wp-block-paragraph">Country means where the visitor was, as recorded by Chrome. It says nothing about where the store is hosted.</p>



<h2 class="wp-block-heading">Which eCommerce platform is fastest?</h2>



<p class="wp-block-paragraph">Shopify, Webflow, Squarespace and Wix lead on server response. In September 2026, 83.8% of Shopify sites gave mobile visitors a good time to first byte, followed by Webflow at 77.5%, Squarespace at 76.6% and Wix at 73.1%. Magento ranks 10th of 12 at 23.0%, and only WooCommerce (12.1%) and VTEX (4.8%) are lower. The figure for all websites with Chrome data is 45.9%.</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/fastest-ecommerce-platform-good-ttfb-by-platform.png" alt="Bar chart: Shopify 83.8% of sites have good mobile TTFB, Magento 23.0%, all websites 45.9%, September 2026" class="wp-image-26555" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-good-ttfb-by-platform.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-good-ttfb-by-platform-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-good-ttfb-by-platform-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-good-ttfb-by-platform-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-good-ttfb-by-platform-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-good-ttfb-by-platform-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-good-ttfb-by-platform-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;">Share of sites with a good mobile time to first byte, September 2026, Chrome UX Report via HTTP Archive</figcaption></figure></div>



<figure class="wp-block-table"><table><thead><tr><th>Platform</th><th>Good TTFB, mobile</th><th>Good TTFB, desktop</th><th>CWV pass, mobile</th><th>CWV pass, desktop</th><th>Good LCP, mobile</th><th>Good INP, mobile</th><th>Good CLS, mobile</th><th>Origins tested (mobile TTFB)</th></tr></thead><tbody><tr><td>Shopify</td><td>83.8%</td><td>92.6%</td><td>76.2%</td><td>79.5%</td><td>87.7%</td><td>86.7%</td><td>92.4%</td><td>430,634</td></tr><tr><td>Webflow</td><td>77.5%</td><td>94.1%</td><td>71.5%</td><td>83.4%</td><td>77.8%</td><td>89.3%</td><td>94.5%</td><td>7,908</td></tr><tr><td>Squarespace</td><td>76.6%</td><td>89.9%</td><td>71.0%</td><td>76.1%</td><td>78.0%</td><td>97.3%</td><td>89.5%</td><td>83,353</td></tr><tr><td>Wix</td><td>73.1%</td><td>67.7%</td><td>79.5%</td><td>85.5%</td><td>83.3%</td><td>92.2%</td><td>97.9%</td><td>112,516</td></tr><tr><td>BigCommerce</td><td>59.7%</td><td>78.6%</td><td>62.5%</td><td>55.6%</td><td>83.6%</td><td>96.7%</td><td>73.1%</td><td>11,360</td></tr><tr><td>SAP Commerce Cloud</td><td>47.2%</td><td>58.4%</td><td>36.1%</td><td>36.1%</td><td>63.7%</td><td>74.9%</td><td>57.3%</td><td>1,850</td></tr><tr><td>All websites</td><td>45.9%</td><td>58.2%</td><td>52.8%</td><td>60.8%</td><td>65.6%</td><td>79.4%</td><td>83.4%</td><td>8,345,086</td></tr><tr><td>Shopware</td><td>44.0%</td><td>49.6%</td><td>84.0%</td><td>79.8%</td><td>90.4%</td><td>96.6%</td><td>94.2%</td><td>8,239</td></tr><tr><td>Salesforce Commerce Cloud</td><td>34.3%</td><td>46.2%</td><td>38.4%</td><td>45.1%</td><td>72.3%</td><td>61.4%</td><td>66.5%</td><td>3,666</td></tr><tr><td>PrestaShop</td><td>25.8%</td><td>32.5%</td><td>61.4%</td><td>62.3%</td><td>73.6%</td><td>90.4%</td><td>85.8%</td><td>47,678</td></tr><tr><td>Magento with Hyvä</td><td>23.2%</td><td>23.7%</td><td>66.4%</td><td>61.7%</td><td>77.2%</td><td>90.2%</td><td>89.5%</td><td>4,593</td></tr><tr><td>Magento</td><td>23.0%</td><td>22.7%</td><td>44.6%</td><td>45.6%</td><td>58.1%</td><td>84.4%</td><td>70.9%</td><td>31,799</td></tr><tr><td>WooCommerce</td><td>12.1%</td><td>12.4%</td><td>39.3%</td><td>39.3%</td><td>43.5%</td><td>91.4%</td><td>88.7%</td><td>519,794</td></tr><tr><td>VTEX</td><td>4.8%</td><td>8.3%</td><td>3.9%</td><td>4.9%</td><td>8.7%</td><td>39.3%</td><td>24.2%</td><td>3,198</td></tr></tbody></table><figcaption class="wp-element-caption">Good TTFB and Core Web Vitals pass by eCommerce platform, all sites, September 2026 (Chrome UX Report via HTTP Archive)</figcaption></figure>



<p class="wp-block-paragraph">The four leaders have one thing in common. Shopify, Webflow, Squarespace and Wix all run every store on the vendor&#8217;s own infrastructure, so the merchant never picks a host, a cache or a server size. That is an observation, and the data doesn&#8217;t show that it is the cause. Hosting, CDN use and the size of a typical store all differ between platforms, and this study can&#8217;t separate those factors.</p>



<p class="wp-block-paragraph">Desktop numbers follow the same order with higher values. 92.6% of Shopify sites and 94.1% of Webflow sites have a good desktop time to first byte, against 22.7% of Magento sites. Wix is the exception, with a lower desktop share (67.7%) than mobile (73.1%).</p>



<p class="wp-block-paragraph">Magento&#8217;s position is specific. It is 10th of 12, and the data doesn&#8217;t support calling it the slowest. WooCommerce, which includes hundreds of thousands of small sites, and VTEX are both lower. If the platform choice itself is on the table, our comparison of <a href="https://scandiweb.com/blog/magento-vs-shopify-ecommerce-platform-comparison/" target="_blank" rel="noopener">Magento and Shopify beyond speed</a> covers catalog size, B2B needs and customization.</p>



<h2 class="wp-block-heading">Does the gap hold for sites of the same size?</h2>



<p class="wp-block-paragraph">Yes. Among the 1 million most visited sites, 20.5% of Magento sites (n = 7,956) had a good mobile time to first byte, against 85.7% of Shopify sites (n = 47,951). Among the top 100,000, the figures are 23.0% for Magento (n = 739) and 78.9% for Shopify (n = 1,829). Only in the top 10,000 does the gap narrow, and that cell holds 29 Magento sites.</p>



<figure class="wp-block-table"><table><thead><tr><th>Platform</th><th>ALL</th><th>Top 1M</th><th>Top 100k</th><th>Top 10k</th><th>Top 1k</th></tr></thead><tbody><tr><td>Shopify</td><td>83.8%</td><td>85.7%</td><td>78.9%</td><td>64.3% (n=42)</td><td>0 of 1</td></tr><tr><td>Webflow</td><td>77.5%</td><td>74.6%</td><td>11 of 19</td><td>–</td><td>–</td></tr><tr><td>Squarespace</td><td>76.6%</td><td>70.2%</td><td>7 of 10</td><td>–</td><td>–</td></tr><tr><td>Wix</td><td>73.1%</td><td>61.2%</td><td>9 of 11</td><td>1 of 1</td><td>–</td></tr><tr><td>BigCommerce</td><td>59.7%</td><td>80.3%</td><td>81.1% (n=53)</td><td>–</td><td>–</td></tr><tr><td>SAP Commerce Cloud</td><td>47.2%</td><td>40.7%</td><td>38.4%</td><td>40.0% (n=20)</td><td>–</td></tr><tr><td>All websites</td><td>45.9%</td><td>54.9%</td><td>61.6%</td><td>67.8%</td><td>67.2%</td></tr><tr><td>Shopware</td><td>44.0%</td><td>35.3%</td><td>39.1% (n=23)</td><td>1 of 1</td><td>–</td></tr><tr><td>Salesforce Commerce Cloud</td><td>34.3%</td><td>32.8%</td><td>33.3%</td><td>30.0% (n=40)</td><td>–</td></tr><tr><td>PrestaShop</td><td>25.8%</td><td>23.3%</td><td>26.2%</td><td>1 of 1</td><td>–</td></tr><tr><td>Magento with Hyvä</td><td>23.2%</td><td>21.8%</td><td>16.5%</td><td>1 of 3</td><td>–</td></tr><tr><td>Magento</td><td>23.0%</td><td>20.5%</td><td>23.0%</td><td>37.9% (n=29)</td><td>–</td></tr><tr><td>WooCommerce</td><td>12.1%</td><td>14.8%</td><td>34.8%</td><td>5 of 7</td><td>–</td></tr><tr><td>VTEX</td><td>4.8%</td><td>5.6%</td><td>9.8%</td><td>3 of 9</td><td>–</td></tr></tbody></table><figcaption class="wp-element-caption">Good mobile TTFB by popularity tier (CrUX rank), September 2026</figcaption></figure>



<p class="wp-block-paragraph">The popularity cut was the main test of whether the ranking is an artifact of site size. A platform full of small hobby stores could look slow because of its sites, and a platform full of large stores could look fast for the same reason. Comparing sites of similar popularity removes much of that.</p>



<p class="wp-block-paragraph">The gap survived the test. For all websites, the good-TTFB share rises with popularity, from 45.9% overall to 54.9% in the top 1 million and 61.6% in the top 100,000. Magento does not follow that curve until the top 10,000, where it reaches 37.9% against Shopify&#8217;s 64.3%, a gap of 26.4 points.</p>



<p class="wp-block-paragraph">BigCommerce is the one platform where the popularity cut changes the picture. Its overall share is 59.7%, but among the top 100,000 sites it reaches 81.1% (n = 53), above Shopify&#8217;s 78.9% in the same tier.</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>Compare your store with sites of a similar size, not with the platform average. A top-100k Magento store should be measured against the 23.0% in that tier, and a top-10k store against 37.9%.</p></div>



<h2 class="wp-block-heading">How long does a typical store take to respond?</h2>



<p class="wp-block-paragraph">The median Magento site&#8217;s 75th-percentile mobile time to first byte fell in the 1,200–1,299 ms bucket in September 2026. The median Shopify site fell in 500–599 ms, so Magento&#8217;s figure is more than twice as long. The median for all websites was 800–899 ms, just outside the 800 ms line that counts as good.</p>



<figure class="wp-block-table"><table><thead><tr><th>Platform</th><th>Mobile, all sites</th><th>Desktop, all sites</th><th>Mobile, top 100k</th><th>Origins (mobile, all)</th></tr></thead><tbody><tr><td>Shopify</td><td>500–599 ms</td><td>400–499 ms</td><td>500–599 ms</td><td>430,635</td></tr><tr><td>Wix</td><td>500–599 ms</td><td>500–599 ms</td><td>400–499 ms</td><td>112,520</td></tr><tr><td>Squarespace</td><td>500–599 ms</td><td>400–499 ms</td><td>700–799 ms</td><td>83,356</td></tr><tr><td>Webflow</td><td>500–599 ms</td><td>300–399 ms</td><td>500–599 ms</td><td>7,910</td></tr><tr><td>BigCommerce</td><td>700–799 ms</td><td>600–699 ms</td><td>400–499 ms</td><td>11,359</td></tr><tr><td>All websites</td><td>800–899 ms</td><td>600–699 ms</td><td>600–699 ms</td><td>8,301,496</td></tr><tr><td>SAP Commerce Cloud</td><td>800–899 ms</td><td>700–799 ms</td><td>900–999 ms</td><td>1,850</td></tr><tr><td>Shopware</td><td>800–899 ms</td><td>800–899 ms</td><td>800–899 ms</td><td>8,239</td></tr><tr><td>Salesforce Commerce Cloud</td><td>900–999 ms</td><td>800–899 ms</td><td>900–999 ms</td><td>3,666</td></tr><tr><td>PrestaShop</td><td>1,000–1,099 ms</td><td>1,000–1,099 ms</td><td>1,000–1,099 ms</td><td>47,656</td></tr><tr><td>Magento with Hyvä</td><td>1,100–1,199 ms</td><td>1,100–1,199 ms</td><td>1,200–1,299 ms</td><td>4,593</td></tr><tr><td>Magento</td><td>1,200–1,299 ms</td><td>1,200–1,299 ms</td><td>1,200–1,299 ms</td><td>31,783</td></tr><tr><td>WooCommerce</td><td>1,700–1,799 ms</td><td>1,600–1,699 ms</td><td>1,000–1,099 ms</td><td>519,180</td></tr><tr><td>VTEX</td><td>1,900–1,999 ms</td><td>1,700–1,799 ms</td><td>1,300–1,399 ms</td><td>3,198</td></tr></tbody></table><figcaption class="wp-element-caption">Median store p75 TTFB by platform, in 100 ms buckets, September 2026</figcaption></figure>



<p class="wp-block-paragraph">These are ranges because the Chrome UX Report publishes TTFB as a histogram in 100 ms buckets. The median is the bucket that the middle site falls into, so a Magento store at the median had a 75th-percentile TTFB somewhere between 1,200 and 1,299 ms. The exact millisecond isn&#8217;t available.</p>



<p class="wp-block-paragraph">The shape matters as much as the median. Four hosted platforms share the 500–599 ms bucket on mobile. Magento, PrestaShop and Hyvä stores cluster above one second, and WooCommerce and VTEX medians are above 1.7 seconds, close to the 1.8 second line that Google calls poor.</p>



<p class="wp-block-paragraph">Site size changes the median for some platforms and not for Magento. Among the top 100,000 sites, the median WooCommerce store improves to 1,000–1,099 ms and BigCommerce to 400–499 ms. The median Magento store stays at 1,200–1,299 ms, the same bucket as across all sites.</p>



<h2 class="wp-block-heading">Why do some platforms pass Core Web Vitals with a slow server?</h2>



<p class="wp-block-paragraph">Because Core Web Vitals and time to first byte measure different things. Shopware sites pass all three Core Web Vitals most often of the 12 platforms, at 84.0%, yet only 44.0% of them have a good time to first byte. Magento sites on Hyvä pass Core Web Vitals 66.4% of the time, against 44.6% for Magento overall, while their good-TTFB share is 23.2%, almost identical to Magento&#8217;s 23.0%.</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/fastest-ecommerce-platform-ttfb-vs-core-web-vitals.png" alt="Dumbbell chart: Magento with Hyvä passes Core Web Vitals 66.4% of the time but has good TTFB on 23.2% of sites" class="wp-image-26556" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-vs-core-web-vitals.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-vs-core-web-vitals-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-vs-core-web-vitals-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-vs-core-web-vitals-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-vs-core-web-vitals-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-vs-core-web-vitals-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-vs-core-web-vitals-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;">Good server response and Core Web Vitals pass rates per platform, mobile, September 2026</figcaption></figure></div>



<p class="wp-block-paragraph">TTFB isn&#8217;t a Core Web Vital. Google&#8217;s TTFB article states that because it isn&#8217;t one of the three, a site doesn&#8217;t have to meet the good threshold to pass. The three vitals measure what the shopper sees and feels after the first byte arrives: how fast the largest element paints, how quickly taps get a response, and how much the layout jumps.</p>



<p class="wp-block-paragraph">The Hyvä rows show what that split means for a Magento store. Hyvä is a frontend theme, and the frontend work moved the Core Web Vitals pass rate from 44.6% to 66.4% and <a href="https://scandiweb.com/blog/magento-slow-after-hyva/" target="_blank" rel="noopener">left server response where it was</a>. The same pattern holds for Lighthouse, where the median Hyvä store scores 48 against 35 for Magento overall. If a Hyvä project is on your plan, 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 it changes and what it doesn&#8217;t.</p>



<figure class="wp-block-table"><table><thead><tr><th>Platform</th><th>Lighthouse performance, mobile</th><th>JavaScript, mobile</th><th>Total page, mobile</th><th>Origins Sep 2023 → Sep 2026 (mobile)</th></tr></thead><tbody><tr><td>Shopify</td><td>48</td><td>2,288 KB</td><td>4,015 KB</td><td>323,755 → 452,270</td></tr><tr><td>Webflow</td><td>59</td><td>1,192 KB</td><td>4,044 KB</td><td>6,666 → 8,417</td></tr><tr><td>Squarespace</td><td>30</td><td>1,495 KB</td><td>3,571 KB</td><td>100,253 → 92,762</td></tr><tr><td>Wix</td><td>60</td><td>1,928 KB</td><td>2,995 KB</td><td>115,955 → 123,133</td></tr><tr><td>BigCommerce</td><td>37</td><td>1,098 KB</td><td>2,896 KB</td><td>15,475 → 11,787</td></tr><tr><td>SAP Commerce Cloud</td><td>29</td><td>1,568 KB</td><td>4,172 KB</td><td>2,878 → 1,888</td></tr><tr><td>All websites</td><td>48</td><td>732 KB</td><td>2,564 KB</td><td>9,992,628 → 8,739,300</td></tr><tr><td>Shopware</td><td>39</td><td>606 KB</td><td>3,240 KB</td><td>13,620 → 8,649</td></tr><tr><td>Salesforce Commerce Cloud</td><td>31</td><td>1,674 KB</td><td>4,701 KB</td><td>4,744 → 3,701</td></tr><tr><td>PrestaShop</td><td>34</td><td>850 KB</td><td>2,832 KB</td><td>74,749 → 49,565</td></tr><tr><td>Magento with Hyvä</td><td>48</td><td>767 KB</td><td>2,247 KB</td><td>1,158 → 4,696</td></tr><tr><td>Magento</td><td>35</td><td>1,270 KB</td><td>3,390 KB</td><td>52,651 → 32,588</td></tr><tr><td>WooCommerce</td><td>37</td><td>811 KB</td><td>2,948 KB</td><td>650,543 → 553,677</td></tr><tr><td>VTEX</td><td>42</td><td>2,092 KB</td><td>3,774 KB</td><td>4,237 → 3,230</td></tr></tbody></table><figcaption class="wp-element-caption">Good mobile TTFB and Core Web Vitals pass, September 2023 to September 2026</figcaption></figure>



<p class="wp-block-paragraph">The JavaScript column makes the same point from the other direction. The median Shopify site loads 2,288 KB of JavaScript on mobile, the most of the 12 platforms, and still has the best time to first byte. TTFB is measured before any script runs, so the amount of JavaScript a page carries has no effect on it.</p>



<p class="wp-block-paragraph">Shopware is the opposite case. Its median page carries 606 KB of JavaScript, the least of the 12, which fits its 84.0% Core Web Vitals pass rate. Its server response is close to the all-websites average.</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>Passing Core Web Vitals doesn&#8217;t mean the server is fast. Check TTFB separately, because a store can show green vitals in Search Console while its server takes more than a second to respond.</p></div>



<h2 class="wp-block-heading">Has Magento&#8217;s server response improved since 2023?</h2>



<p class="wp-block-paragraph">Yes, mostly in the last year. The share of Magento sites with a good mobile time to first byte was 16.1% in September 2023, 16.7% in 2024, 16.6% in 2025 and 23.0% in 2026. Magento&#8217;s Core Web Vitals pass rate doubled over the same period, from 22.2% to 44.6%. Shopify went from 78.1% to 83.8%, so the gap between the two stayed close to 60 points.</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/fastest-ecommerce-platform-ttfb-trend.png" alt="Line chart: Magento good TTFB rose from 16.1% to 23.0% since September 2023 while Shopify stayed near 84%" class="wp-image-26557" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-trend.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-trend-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-trend-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-trend-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-trend-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-trend-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/fastest-ecommerce-platform-ttfb-trend-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;">Share of sites with a good mobile time to first byte, monthly, September 2023 to September 2026</figcaption></figure></div>



<figure class="wp-block-table"><table><thead><tr><th>Platform</th><th>TTFB 2023</th><th>TTFB 2024</th><th>TTFB 2025</th><th>TTFB 2026</th><th>CWV 2023</th><th>CWV 2024</th><th>CWV 2025</th><th>CWV 2026</th></tr></thead><tbody><tr><td>Shopify</td><td>78.1%</td><td>86.0%</td><td>82.6%</td><td>83.8%</td><td>59.5%</td><td>71.8%</td><td>76.2%</td><td>76.2%</td></tr><tr><td>Webflow</td><td>35.2%</td><td>40.2%</td><td>40.1%</td><td>77.5%</td><td>47.1%</td><td>57.9%</td><td>61.8%</td><td>71.5%</td></tr><tr><td>Squarespace</td><td>73.7%</td><td>73.6%</td><td>79.1%</td><td>76.6%</td><td>41.5%</td><td>62.2%</td><td>65.0%</td><td>71.0%</td></tr><tr><td>Wix</td><td>69.4%</td><td>38.7%</td><td>52.2%</td><td>73.1%</td><td>47.9%</td><td>57.8%</td><td>69.4%</td><td>79.5%</td></tr><tr><td>BigCommerce</td><td>13.2%</td><td>58.6%</td><td>57.1%</td><td>59.7%</td><td>39.4%</td><td>55.6%</td><td>61.6%</td><td>62.5%</td></tr><tr><td>SAP Commerce Cloud</td><td>38.2%</td><td>41.2%</td><td>45.6%</td><td>47.2%</td><td>19.4%</td><td>20.7%</td><td>30.3%</td><td>36.1%</td></tr><tr><td>All websites</td><td>41.2%</td><td>42.7%</td><td>42.6%</td><td>45.9%</td><td>43.2%</td><td>48.1%</td><td>50.5%</td><td>52.8%</td></tr><tr><td>Shopware</td><td>35.2%</td><td>35.2%</td><td>34.6%</td><td>44.0%</td><td>70.7%</td><td>76.0%</td><td>78.5%</td><td>84.0%</td></tr><tr><td>Salesforce Commerce Cloud</td><td>20.8%</td><td>22.7%</td><td>26.2%</td><td>34.3%</td><td>21.1%</td><td>23.9%</td><td>35.6%</td><td>38.4%</td></tr><tr><td>PrestaShop</td><td>18.9%</td><td>21.5%</td><td>22.3%</td><td>25.8%</td><td>39.0%</td><td>44.0%</td><td>55.9%</td><td>61.4%</td></tr><tr><td>Magento with Hyvä</td><td>24.7%</td><td>16.9%</td><td>17.3%</td><td>23.2%</td><td>51.4%</td><td>48.8%</td><td>62.2%</td><td>66.4%</td></tr><tr><td>Magento</td><td>16.1%</td><td>16.7%</td><td>16.6%</td><td>23.0%</td><td>22.2%</td><td>26.4%</td><td>39.2%</td><td>44.6%</td></tr><tr><td>WooCommerce</td><td>13.6%</td><td>13.9%</td><td>12.4%</td><td>12.1%</td><td>23.0%</td><td>31.5%</td><td>35.6%</td><td>39.3%</td></tr><tr><td>VTEX</td><td>2.3%</td><td>1.7%</td><td>2.3%</td><td>4.8%</td><td>2.9%</td><td>4.3%</td><td>4.6%</td><td>3.9%</td></tr></tbody></table><figcaption class="wp-element-caption">Good mobile TTFB by country of the visitor, September 2026</figcaption></figure>



<p class="wp-block-paragraph">The gap to Shopify was 62.0 points in September 2023 and 60.8 points in September 2026. Magento gained 6.9 points on server response over three years, and Shopify gained 5.7, so the distance between them barely moved. All websites gained 4.7 points over the same period.</p>



<p class="wp-block-paragraph">The Core Web Vitals trend is different. Magento&#8217;s pass rate rose every year, from 22.2% to 26.4%, 39.2% and 44.6%. Most of that came from the browser side, which is the same pattern the Hyvä rows show in a single snapshot.</p>



<p class="wp-block-paragraph">Two hosted platforms made large jumps in a single year. Webflow went from 40.1% to 77.5% between September 2025 and September 2026, and BigCommerce from 13.2% to 58.6% between 2023 and 2024. The data records the change and doesn&#8217;t say what caused it.</p>



<p class="wp-block-paragraph">The adoption figures in Table 6 are context, and they are detection counts rather than market share. HTTP Archive detected Magento on 52,651 mobile origins in September 2023 and 32,588 in September 2026, a drop of 38.1%. Over the same period, Hyvä detections rose from 1,158 to 4,696, about four times as many, and Shopify from 323,755 to 452,270, up 39.7%.</p>



<p class="wp-block-paragraph">Those counts depend on which sites have enough Chrome traffic to be included and on what the crawl can detect from a homepage. A store that moved to a headless frontend usually stops being detected as Magento even though the backend hasn&#8217;t changed.</p>



<h2 class="wp-block-heading">Does the gap change by country?</h2>



<p class="wp-block-paragraph">The size of the gap changes, and the direction doesn&#8217;t. For visitors in the United States, 13.7% of Magento sites had a good mobile time to first byte against 88.9% of Shopify sites. In the United Kingdom the figures are 26.7% and 94.1%, and in Germany 33.0% and 91.9%. Magento&#8217;s best country in the set, Germany, still trails Shopify&#8217;s weakest country, the United States, by 55.9 points.</p>



<figure class="wp-block-table"><table><thead><tr><th>Platform</th><th>United States</th><th>United Kingdom</th><th>Germany</th></tr></thead><tbody><tr><td>Shopify</td><td>88.9%</td><td>94.1%</td><td>91.9%</td></tr><tr><td>Webflow</td><td>85.8%</td><td>89.4%</td><td>89.0%</td></tr><tr><td>Squarespace</td><td>93.0%</td><td>96.6%</td><td>94.7%</td></tr><tr><td>Wix</td><td>82.3%</td><td>92.5%</td><td>92.1%</td></tr><tr><td>BigCommerce</td><td>72.6%</td><td>82.3%</td><td>56.3%</td></tr><tr><td>SAP Commerce Cloud</td><td>41.5%</td><td>48.7%</td><td>57.1%</td></tr><tr><td>All websites</td><td>54.8%</td><td>61.6%</td><td>58.8%</td></tr><tr><td>Shopware</td><td>6.2%</td><td>33.8%</td><td>49.4%</td></tr><tr><td>Salesforce Commerce Cloud</td><td>31.0%</td><td>39.5%</td><td>41.4%</td></tr><tr><td>PrestaShop</td><td>10.4%</td><td>29.4%</td><td>27.8%</td></tr><tr><td>Magento with Hyvä</td><td>11.9%</td><td>28.2%</td><td>30.9%</td></tr><tr><td>Magento</td><td>13.7%</td><td>26.7%</td><td>33.0%</td></tr><tr><td>WooCommerce</td><td>17.8%</td><td>20.4%</td><td>20.1%</td></tr><tr><td>VTEX</td><td>4.4%</td><td>14.8% (n=27)</td><td>10.0% (n=40)</td></tr></tbody></table><figcaption class="wp-element-caption">Context: median Lighthouse performance, JavaScript and page weight on mobile, September 2026, and origins detected</figcaption></figure>



<p class="wp-block-paragraph">The country in this table is where the visitor was, as Chrome recorded it. It is a cut of the same sites by who visited them, so a store with shoppers in several countries appears in more than one column.</p>



<p class="wp-block-paragraph">Distance is part of time to first byte. TTFB includes the DNS lookup, the connection, the TLS handshake and the trip between the visitor and the server, so a store hosted far from its shoppers pays for that distance on every page view before the server has done any work.</p>



<p class="wp-block-paragraph">Shopware is the clearest case in the table. For visitors in Germany, 49.4% of Shopware sites respond fast, against 6.2% for visitors in the United States. The data doesn&#8217;t record where those sites are hosted, but the pattern is what distance would produce.</p>



<p class="wp-block-paragraph">For Magento the spread is smaller. Its best figure, 33.0% in Germany, is still below the all-websites average in every column, so distance alone doesn&#8217;t explain where Magento stands.</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>Test from where your shoppers are. Distance shows up in TTFB, and a server that responds in 400 ms from the same city can be well past 800 ms from another continent.</p></div>



<h2 class="wp-block-heading">What this means for Magento stores</h2>



<p class="wp-block-paragraph">The rest of this section is interpretation. The data shows which sites respond fast, and the reasoning about why, and about what to do, is ours. On Magento, most of the gap to the hosted platforms is server response, the part of the wait that happens before the browser has received anything to draw.</p>



<p class="wp-block-paragraph">Frontend projects lift Core Web Vitals and don&#8217;t move TTFB. The Hyvä rows show it in a snapshot, and Magento&#8217;s trend shows it over three years: the Core Web Vitals pass rate doubled while the share with good server response moved 6.9 points. A theme changes what the browser does once the page arrives.</p>



<p class="wp-block-paragraph">Server response moves with server work. The levers are how much of your traffic the <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">full page cache</a> covers, where and how the store is hosted, and how long Magento takes to build a page the cache doesn&#8217;t hold. The last one is where most Magento stores still lose time, because logged-in customers, filtered category pages, search results and the first visit after a deploy all miss the cache more often. Our guide to <a href="https://scandiweb.com/blog/why-is-magento-slow/" target="_blank" rel="noopener">why a Magento site gets slow</a> covers the other causes.</p>



<p class="wp-block-paragraph"><a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> is scandiweb&#8217;s module that speeds up how Magento builds each page on the server. The page build is at least 2x faster, so the same server handles 3x the traffic before response times start to rise. It works with Luma, Hyvä or a custom theme and leaves the theme and the data as they are. How we measured that is 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">A faster page build doesn&#8217;t close the whole gap to Shopify on its own. TTFB also includes network time, from the DNS lookup to the distance between the visitor and the server, and no module changes that. Hosting location, a CDN in front of the store and the cache hit rate each decide part of the number.</p>



<p class="wp-block-paragraph">If you want to work through the layers in order, 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> covers server, caching, database and frontend fixes, and our post on how to <a href="https://scandiweb.com/blog/reduce-initial-server-response-time/" target="_blank" rel="noopener">reduce initial server response time</a> covers the diagnostics. <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">Auditing your store&#8217;s performance</a> measures where your store&#8217;s time goes before you commission any of 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>The gap is the work done before the first byte, which is where Magento stores can still gain the most. Measure TTFB on a filtered category page while logged in, then compare it with the cached homepage.</p></div>



<h2 class="wp-block-heading">What we expected and did not find</h2>



<p class="wp-block-paragraph">Two expectations didn&#8217;t hold. We expected Hyvä stores to show some server-side gain, and they don&#8217;t. We expected the gap to Shopify to disappear among the 10,000 most visited sites, and it narrows without closing. Both results point the same way: server response on Magento depends on server work, and neither a newer frontend nor a larger site changes that on its own.</p>



<p class="wp-block-paragraph">The Hyvä expectation came from how those stores are built. Hyvä stores tend to be newer builds, often on newer hosting, so some server-side gain seemed likely. The data shows 23.2% with a good mobile time to first byte against 23.0% for Magento overall, and the median Hyvä store responds one bucket faster, at 1,100–1,199 ms against 1,200–1,299 ms.</p>



<p class="wp-block-paragraph">The top-tier expectation came from the all-websites curve, where the share of fast sites rises with popularity. Among the top 10,000 sites, 37.9% of Magento stores (n = 29) respond fast against 64.3% of Shopify stores (n = 42). That is a gap of 26.4 points on a small sample, and it is still a gap.</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 new theme changes what the browser does. It doesn&#8217;t change how fast Magento starts sending the page, so budget a server project alongside any Hyvä migration.</p></div>



<h2 class="wp-block-heading">Limitations</h2>



<p class="wp-block-paragraph">This study describes which sites respond fast in Chrome&#8217;s field data. It doesn&#8217;t explain why, and it doesn&#8217;t prove that the platform causes the difference. The six limitations below apply to every number in this article, and each one should be read before any figure is quoted.</p>



<h3 class="wp-block-heading">Chrome only</h3>



<p class="wp-block-paragraph">The Chrome UX Report covers real Chrome users who opted in to usage statistics, and only origins with enough traffic to be included. Safari and Firefox visits aren&#8217;t in it, and a store whose shoppers are mostly on iPhones is represented by its Chrome visitors alone.</p>



<h3 class="wp-block-heading">Origin level, homepage detection</h3>



<p class="wp-block-paragraph">Each site counts once, by its 75th-percentile time to first byte over a 28-day window. Platforms are detected by HTTP Archive&#8217;s crawl, using Wappalyzer rules, from the homepage. Some stores may be misclassified. Headless storefronts usually aren&#8217;t detected as their backend platform. &#8220;Magento&#8221; includes both Magento Open Source and Adobe Commerce.</p>



<h3 class="wp-block-heading">TTFB covers more than the platform</h3>



<p class="wp-block-paragraph">Time to first byte includes redirects, the DNS lookup, the connection, the TLS handshake, network distance and the server&#8217;s work. The data shows which sites are fast. It doesn&#8217;t show why, and it doesn&#8217;t prove the platform causes the difference. Hosting, CDN use, the visitor&#8217;s location and site size all vary by platform. This is correlation only.</p>



<h3 class="wp-block-heading">Samples differ in size</h3>



<p class="wp-block-paragraph">WooCommerce includes hundreds of thousands of small sites, and Shopify more than 430,000. SAP Commerce Cloud has 1,850 origins and Magento with Hyvä 4,593. Some cells in the top tiers are small, and their n is reported next to the figure. Cells under n = 20 are shown as counts.</p>



<h3 class="wp-block-heading">Moderate originality</h3>



<p class="wp-block-paragraph">Each platform&#8217;s numbers can be looked up one technology at a time on HTTP Archive&#8217;s site. This study&#8217;s contribution is the 12-platform comparison, the popularity-tier control, the split between time to first byte and Core Web Vitals, the country cut and the three-year trend in one place. The annual re-run makes it a series.</p>



<h3 class="wp-block-heading">Medians in buckets</h3>



<p class="wp-block-paragraph">Median time to first byte comes from 100 ms histogram buckets, so it&#8217;s reported as a range. A median of 1,200–1,299 ms means the middle site fell somewhere in that bucket. The data doesn&#8217;t give a single millisecond value.</p>



<h2 class="wp-block-heading">What we will measure next</h2>



<p class="wp-block-paragraph">Three additions are planned. scandiweb will re-run this analysis every September, so the trend in Table 4 gains a column each year on the same instrument and the same definitions. The next edition will also split desktop and mobile by country, and it will add uncached page build times measured directly on a sample of stores.</p>



<p class="wp-block-paragraph">The annual re-run is the main one. The 2023 to 2026 trend already shows that Magento&#8217;s server response moved mostly in the last year, and a yearly series will show whether that continues.</p>



<p class="wp-block-paragraph">The desktop-by-country cut tests the distance explanation. If the country pattern in Table 5 comes from where stores are hosted, it should appear on desktop too, and the mobile and desktop columns should move together.</p>



<p class="wp-block-paragraph">The uncached build measurement addresses the biggest limitation. Chrome&#8217;s field data can&#8217;t separate network time from server work, and measuring how long Magento takes to build a page with the cache empty, on a sample of real stores, is the only way to see how much of the gap the server itself accounts for.</p>



<h2 class="wp-block-heading">Frequently asked questions</h2>



<h3 class="wp-block-heading">Which eCommerce platform is the fastest?</h3>



<p class="wp-block-paragraph">On server response in September 2026, Shopify. According to scandiweb&#8217;s analysis of Chrome UX Report data, 83.8% of Shopify sites gave mobile visitors a good time to first byte, followed by Webflow at 77.5%, Squarespace at 76.6% and Wix at 73.1%. All four run every store on the vendor&#8217;s own infrastructure. The ranking covers server response only, and Shopware leads on Core Web Vitals at 84.0%.</p>



<h3 class="wp-block-heading">Is Magento slower than Shopify?</h3>



<p class="wp-block-paragraph">On server response, yes, for most stores. In September 2026, 23.0% of Magento sites had a good mobile time to first byte against 83.8% of Shopify sites, and the median Magento store responded in 1,200–1,299 ms against 500–599 ms. The gap holds among sites of similar popularity and in all three countries checked. The data doesn&#8217;t show whether the platform itself is the cause.</p>



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



<p class="wp-block-paragraph">800 ms or less at the 75th percentile, which means the server starts responding within 0.8 seconds on at least three out of four visits. Google&#8217;s TTFB guidance calls that good and more than 1.8 seconds poor. In September 2026, 45.9% of all websites with Chrome data met the good threshold on mobile, and the median site fell in the 800–899 ms bucket.</p>



<h3 class="wp-block-heading">Does Hyvä make Magento faster?</h3>



<p class="wp-block-paragraph">In the browser, yes. Magento sites running Hyvä passed all three Core Web Vitals on mobile 66.4% of the time in September 2026, against 44.6% for Magento overall, and their median Lighthouse score was 48 against 35. On the server, no. Their good time-to-first-byte share was 23.2%, almost the same as Magento&#8217;s 23.0%, because a theme changes what the browser does after the first byte arrives.</p>



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



<p class="wp-block-paragraph">No. The three Core Web Vitals are Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift. Google&#8217;s TTFB guidance says that because TTFB isn&#8217;t one of them, a site doesn&#8217;t have to meet the good threshold to pass. The Chrome UX Report lists it as an experimental metric collected on full page loads only. A store can pass Core Web Vitals with a slow server, as Shopware&#8217;s numbers show.</p>



<h3 class="wp-block-heading">Why are hosted platforms faster on server response?</h3>



<p class="wp-block-paragraph">The data doesn&#8217;t say. The four leaders on time to first byte all run every store on the vendor&#8217;s own infrastructure, so the merchant never picks a host, a cache or a server size, and that is an observation rather than a proven cause. Hosting, CDN use, the visitor&#8217;s location and the size of a typical store all vary by platform, and this study measures correlation only.</p>



<h2 class="wp-block-heading">Cite this research</h2>



<ul class="wp-block-list">
<li>Title: &#8220;The Fastest eCommerce Platform? Server Response Times for 12 Platforms&#8221;</li>


<li>Author: scandiweb</li>


<li>Published: November 3, 2026</li>


<li>URL: https://scandiweb.com/blog/fastest-ecommerce-platform/</li>


<li>Data: Chrome UX Report via HTTP Archive Tech Report, September 2026.</li>

</ul>



<p class="wp-block-paragraph">Press and analyst enquiries about the dataset or the method can go to <a href="https://scandiweb.com/contact" target="_blank" rel="noopener">our team</a>.</p>



<h2 class="wp-block-heading">Where the fastest eCommerce platform wins, and what Magento can do</h2>



<p class="wp-block-paragraph">The fastest eCommerce platform on server response in September 2026 was Shopify, with 83.8% of sites giving mobile visitors a good time to first byte, and Magento ranked 10th of 12 at 23.0%. The gap held among sites of similar popularity, in the United States, the United Kingdom and Germany, and across three years of data. Magento gained seven points since 2023 while Shopify gained almost six, so the distance between them stayed close to 60 points.</p>



<p class="wp-block-paragraph">The Hyvä numbers carry the practical lesson. A frontend theme lifted the Core Web Vitals pass rate from 44.6% to 66.4% and left server response at 23.2%, almost the same as Magento overall. Browser work and server work are separate projects, and most Magento stores have done more of the first than the second.</p>



<p class="wp-block-paragraph">Time to first byte is where a Magento store can still gain the most, and it is also the number most stores haven&#8217;t measured on their own.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Which eCommerce platform is the fastest?", "acceptedAnswer": {"@type": "Answer", "text": "On server response in September 2026, Shopify. According to scandiweb's analysis of Chrome UX Report data, 83.8% of Shopify sites gave mobile visitors a good time to first byte, followed by Webflow at 77.5%, Squarespace at 76.6% and Wix at 73.1%. All four run every store on the vendor's own infrastructure. The ranking covers server response only, and Shopware leads on Core Web Vitals at 84.0%."}}, {"@type": "Question", "name": "Is Magento slower than Shopify?", "acceptedAnswer": {"@type": "Answer", "text": "On server response, yes, for most stores. In September 2026, 23.0% of Magento sites had a good mobile time to first byte against 83.8% of Shopify sites, and the median Magento store responded in 1,200–1,299 ms against 500–599 ms. The gap holds among sites of similar popularity and in all three countries checked. The data doesn't show whether the platform itself is the cause."}}, {"@type": "Question", "name": "What is a good TTFB for an online store?", "acceptedAnswer": {"@type": "Answer", "text": "800 ms or less at the 75th percentile, which means the server starts responding within 0.8 seconds on at least three out of four visits. Google's TTFB guidance calls that good and more than 1.8 seconds poor. In September 2026, 45.9% of all websites with Chrome data met the good threshold on mobile, and the median site fell in the 800–899 ms bucket."}}, {"@type": "Question", "name": "Does Hyvä make Magento faster?", "acceptedAnswer": {"@type": "Answer", "text": "In the browser, yes. Magento sites running Hyvä passed all three Core Web Vitals on mobile 66.4% of the time in September 2026, against 44.6% for Magento overall, and their median Lighthouse score was 48 against 35. On the server, no. Their good time-to-first-byte share was 23.2%, almost the same as Magento's 23.0%, because a theme changes what the browser does after the first byte arrives."}}, {"@type": "Question", "name": "Is TTFB a Core Web Vital?", "acceptedAnswer": {"@type": "Answer", "text": "No. The three Core Web Vitals are Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift. Google's TTFB guidance says that because TTFB isn't one of them, a site doesn't have to meet the good threshold to pass. The Chrome UX Report lists it as an experimental metric collected on full page loads only. A store can pass Core Web Vitals with a slow server, as Shopware's numbers show."}}, {"@type": "Question", "name": "Why are hosted platforms faster on server response?", "acceptedAnswer": {"@type": "Answer", "text": "The data doesn't say. The four leaders on time to first byte all run every store on the vendor's own infrastructure, so the merchant never picks a host, a cache or a server size, and that is an observation rather than a proven cause. Hosting, CDN use, the visitor's location and the size of a typical store all vary by platform, and this study measures correlation only."}}]}</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>To find out where your store falls on these charts, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>ask us to measure your server response</em></a><em> before you commission anything else.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/fastest-ecommerce-platform/">The Fastest eCommerce Platform? Server Response Times for 12 Platforms</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Magento Load Testing: How to Benchmark Your Store for Peak Traffic</title>
		<link>https://scandiweb.com/blog/magento-load-testing/</link>
		
		<dc:creator><![CDATA[Rolands Jermolajevs]]></dc:creator>
		<pubDate>Mon, 02 Nov 2026 09:47: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>
		<category><![CDATA[website optimization]]></category>
		<guid isPermaLink="false">https://scandiweb.com/blog/?p=26564</guid>

					<description><![CDATA[<p>Magento load testing, step by step: generate test data with the Magento Performance Toolkit, pick JMeter or k6, and find your store's limit before peak.</p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-load-testing/">Magento Load Testing: How to Benchmark Your Store for Peak Traffic</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="lazyblock-related-mlote 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">You can find out how much traffic your Magento (Adobe Commerce) store can take before a big sale, while there is still time to fix what breaks. That is the job of Magento load testing: a tool sends the store a crowd of simulated shoppers, adds more of them step by step, and records the point where pages start to slow down.</p>



<p class="wp-block-paragraph">Magento used to come with that test built in. Up to version 2.4.5, every install carried scripts for JMeter, a free load-testing program, in a folder called the Magento Performance Toolkit. Adobe removed the scripts in version 2.4.6, released in March 2023. The folder now does one job: it fills a test copy of your store with products, customers and orders. The traffic comes from a tool you pick, such as JMeter or k6, another free tool, aimed at a copy of the store that matches the live one.</p>



<h2 class="wp-block-heading">What is Magento load testing?</h2>



<p class="wp-block-paragraph">Magento load testing sends a copy of your store many simulated shoppers at once and raises the traffic in steps while it measures three numbers: requests per second, response time and errors. The result is your store&#8217;s capacity, the traffic level where response times start to climb, which you then compare with your real peak.</p>



<p class="wp-block-paragraph">Three numbers describe each step of the test. Requests per second is how many requests, mostly page loads, the server answers each second. Response time at the <a href="https://grafana.com/docs/k6/latest/using-k6/thresholds/" target="_blank" rel="noopener">95th percentile</a>, or p95, is the time that 95 out of every 100 requests beat, so a few slow pages can&#8217;t hide behind a good average. Single-page server timing is covered in our guide to <a href="https://scandiweb.com/blog/reduce-initial-server-response-time/" target="_blank" rel="noopener">reducing server response time</a>. Error rate is the share of requests that fail or time out.</p>



<p class="wp-block-paragraph">Plot p95 against traffic and the line stays nearly flat, then bends upward as the server runs short of something: CPU, PHP workers or database connections. The bend is the store&#8217;s capacity.</p>



<p class="wp-block-paragraph">Load testing is one part of Magento performance testing, and timing single pages for one visitor comes first. The load test tells you how long those timings hold once the crowd arrives.</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-load-testing-stepped-load.png" alt="Magento load testing chart: response time stays flat through rising traffic steps, then bends upward at the store&#x27;s capacity" class="wp-image-26561" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-stepped-load.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-stepped-load-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-stepped-load-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-stepped-load-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-stepped-load-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-stepped-load-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-stepped-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;">Raise the traffic in steps. Capacity is the last step before response times start to climb.</figcaption></figure></div>



<h3 class="wp-block-heading">Load test vs stress test</h3>



<p class="wp-block-paragraph"><a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/develop/test/guidance" target="_blank" rel="noopener">Adobe&#8217;s testing guidance</a> for Commerce on Cloud separates the two. A load test measures response times and errors under the load you expect, for example a set number of concurrent users who each complete a set number of transactions in a set time, and it shows the response time of the transactions that matter to the business. A stress test pushes past that, to see whether the system still performs &#8220;when the current load goes well above the expected maximum&#8221;. Run the load test first, then keep raising the traffic into a stress test to see what breaks first.</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>Track response time at the 95th percentile. An average can stay calm while one request in twenty waits several times longer, and those slow requests are often for pages Magento has to build from scratch.</p></div>



<h2 class="wp-block-heading">What the Magento Performance Toolkit does today</h2>



<p class="wp-block-paragraph">The Magento Performance Toolkit is a folder that comes with Magento 2 at setup/performance-toolkit. Today it generates test data: one command fills a store with products, categories, customers and orders in one of five sizes, from small to extra large. Up to Magento 2.4.5, it also held JMeter load-test scripts, which Adobe has since removed.</p>



<p class="wp-block-paragraph">It gives you half of a load test: a store full of data. The traffic comes from somewhere else.</p>



<h3 class="wp-block-heading">The five profiles and what they generate</h3>



<p class="wp-block-paragraph">Each profile is an XML file that sets how much of everything the generator creates. <a href="https://experienceleague.adobe.com/en/docs/commerce-operations/configuration-guide/cli/generate-data" target="_blank" rel="noopener">Adobe&#8217;s profile table</a> gives these values:</p>



<figure class="wp-block-table"><table><thead><tr><th>Profile</th><th>Websites / store views</th><th>Simple products</th><th>Configurable products</th><th>Categories</th><th>Customers</th><th>Orders</th></tr></thead><tbody><tr><td>Small</td><td>1 / 1</td><td>800</td><td>16</td><td>30</td><td>200</td><td>80</td></tr><tr><td>Medium</td><td>3 / 3</td><td>24,000</td><td>640</td><td>300</td><td>2,000</td><td>50,000</td></tr><tr><td>Medium multi-site</td><td>25 / 50</td><td>4,000</td><td>879</td><td>100</td><td>2,000</td><td>50,000</td></tr><tr><td>Large</td><td>5 / 5</td><td>300,000</td><td>8,000</td><td>3,000</td><td>5,000</td><td>100,000</td></tr><tr><td>Extra large</td><td>5 / 5</td><td>600,000</td><td>16,000</td><td>6,000</td><td>10,000</td><td>150,000</td></tr></tbody></table><figcaption class="wp-element-caption">Magento Performance Toolkit profiles and what each one generates (Adobe documentation)</figcaption></figure>



<p class="wp-block-paragraph">Source: Adobe&#8217;s profile table. Configurable products have 24 options each, except 79 of the medium multi-site ones, which have 200.</p>



<p class="wp-block-paragraph">Pick the profile closest to your catalog: medium has 24,000 simple products, large has 300,000, and medium multi-site suits a store that runs many websites and store views from one install. A sanitized copy of your own data is better when you can use it, because your own attributes and extensions shape the work Magento does on every page.</p>



<h3 class="wp-block-heading">How to generate the test data</h3>



<pre class="wp-block-code"><code>bin/magento setup:performance:generate-fixtures -s setup/performance-toolkit/profiles/ce/medium.xml
bin/magento indexer:reindex</code></pre>



<p class="wp-block-paragraph">Use <code>profiles/ee</code> on Adobe Commerce. Disable cron jobs before you start.</p>



<p class="wp-block-paragraph">Adobe&#8217;s instructions say to disable all cron jobs before the generator runs and to reindex when it finishes. The <code>-s</code> option skips the reindex, so the generator needs fewer resources, though the total time doesn&#8217;t drop. Adobe&#8217;s docs write the command as <code>setup:perf:generate-fixtures</code>, the same command in its short form.</p>



<p class="wp-block-paragraph">The toolkit&#8217;s README for 2.4.5 said the large profile can take up to 4 hours, and that medium or large may need MySQL <code>tmp_table_size</code> and <code>max_heap_table_size</code> of 512 MB or more and a PHP <code>memory_limit</code> of 1 GB or more. Run it on a throwaway copy, never on production, since it writes products, customers and orders into whatever database it points at.</p>



<h3 class="wp-block-heading">What happened to the JMeter scripts</h3>



<p class="wp-block-paragraph">Up to Magento 2.4.5, the folder also held two JMeter scripts, <code>benchmark.jmx</code> and <code>benchmark_2015.jmx</code>, that imitated shoppers browsing, searching, adding to cart and checking out, plus admin users. Adobe removed both in August 2022, and Magento 2.4.6, released in March 2023, was the first release without them. Some guides still describe them as part of every install.</p>



<p class="wp-block-paragraph">The 2.4.5 versions are still in <a href="https://github.com/magento/magento2/tree/2.4.5/setup/performance-toolkit" target="_blank" rel="noopener">the 2.4.5 toolkit folder on GitHub</a>, with a README that explains each setting, so they work as a template. They were written for older releases, so check every request against your store before you trust a result.</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 Performance Toolkit&#8217;s data generator writes test products, customers and orders into the database it runs against. Point it at a throwaway copy of the store, never at production.</p></div>



<h2 class="wp-block-heading">Load testing tools for Magento: JMeter, k6, Gatling and Locust</h2>



<p class="wp-block-paragraph">The common load testing tools for Magento are JMeter, k6, Gatling and Locust. All four are free and open source. They differ mainly in how you write the test: JMeter in a visual editor, k6 in JavaScript, Gatling in Java or JavaScript, and Locust in Python. Pick the one your developers already read and can maintain.</p>



<figure class="wp-block-table"><table><thead><tr><th>Tool</th><th>How you write a test</th><th>License</th><th>Worth knowing for Magento</th></tr></thead><tbody><tr><td>Apache JMeter</td><td>Visual editor, saved as a .jmx file</td><td>Apache 2.0</td><td>Adobe&#8217;s old toolkit scripts were JMeter files. Build in the editor, run from the command line. Needs Java 8 or later.</td></tr><tr><td>Grafana k6</td><td>JavaScript</td><td>AGPL-3.0</td><td>Can start requests at a set rate, whatever the store&#8217;s response time</td></tr><tr><td>Gatling</td><td>Java, JavaScript or TypeScript</td><td>Apache 2.0</td><td>Tests live as code, next to the store&#8217;s code</td></tr><tr><td>Locust</td><td>Python</td><td>MIT</td><td>Can spread one test across several machines</td></tr></tbody></table><figcaption class="wp-element-caption">Load testing tools for Magento compared: JMeter, k6, Gatling and Locust</figcaption></figure>



<p class="wp-block-paragraph">The install steps are on the home pages of <a href="https://jmeter.apache.org/" target="_blank" rel="noopener">Apache JMeter</a>, <a href="https://grafana.com/docs/k6/latest/" target="_blank" rel="noopener">Grafana k6</a>, <a href="https://docs.gatling.io/" target="_blank" rel="noopener">Gatling</a> and <a href="https://locust.io/" target="_blank" rel="noopener">Locust</a>. Adobe&#8217;s Cloud testing guide also lists Siege, and New Relic, which watches the server while a load tool sends traffic. The two answer different questions: the load tool shows when the store slows down, and monitoring shows why.</p>



<h3 class="wp-block-heading">Set the load in requests per second</h3>



<p class="wp-block-paragraph">Most tools start a number of virtual shoppers, and each one waits for a page before asking for the next. When the store slows down, each of them asks less often, so the test eases off exactly when it should push. k6&#8217;s documentation on <a href="https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/" target="_blank" rel="noopener">open and closed models</a> puts it plainly: when the system under test starts to respond more slowly, a closed-model test waits.</p>



<p class="wp-block-paragraph">The fix is an open model. Requests start at the rate you set, whatever the store&#8217;s response time, so a struggling store gets the same traffic as a healthy one. In k6 that is the ramping-arrival-rate executor. Other tools may offer something similar, so check your tool&#8217;s documentation for an open model or an arrival rate. Read your results in requests per second, the unit the Expedio benchmark below also reports.</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 test with virtual shoppers who each wait for a page before asking for the next sends fewer requests as the store slows down, so a struggling store looks healthier than it is. Set the load in requests per second instead.</p></div>



<h2 class="wp-block-heading">How to run a Magento server load test, step by step</h2>



<p class="wp-block-paragraph">To run a Magento server load test:</p>



<ol class="wp-block-list">
<li>Build a test copy that matches production.</li>


<li>Pick the pages and journeys to test.</li>


<li>Measure a baseline at low traffic.</li>


<li>Raise the requests per second in steps.</li>


<li>Find the step where response times bend upward.</li>


<li>Change one thing and run the same test again.</li>

</ol>



<h3 class="wp-block-heading">1. Build a test copy that matches production</h3>



<p class="wp-block-paragraph">Match production on server size and count, Magento version, extensions, theme, PHP version, cache setup (Varnish, and Valkey or Redis) and search engine. Check the versions against the <a href="https://scandiweb.com/blog/magento-2-system-requirements/" target="_blank" rel="noopener">Magento 2 system requirements</a> for your release. For data, use a sanitized copy of production with personal data removed, or the Performance Toolkit profile closest to your catalog size. Run the load tool from a separate machine, so it doesn&#8217;t compete with the store for CPU. If production adds servers when traffic rises, as with <a href="https://scandiweb.com/blog/server-autoscaling-in-magento-2/" target="_blank" rel="noopener">server autoscaling in Magento 2</a>, decide whether the test copy should do the same: with it on you measure the cluster, with it off you measure one server.</p>



<h3 class="wp-block-heading">2. Pick the pages and the cache setting</h3>



<p class="wp-block-paragraph">Use real URLs from your catalog: category pages, filtered categories, product pages, searches and the cart. Add logged-in journeys, since each customer group gets its own cache copies, so logged-in pages miss the cache more often. Run once with the <a href="https://scandiweb.com/blog/magento-full-page-cache/" target="_blank" rel="noopener">Magento full page cache</a> on, the way shoppers get the store, and once with it off, to see what the server can build on its own, which is the load it faces after a deploy or a cache flush. On Adobe Commerce Cloud, Fastly is the full page cache. On your own servers, the <a href="https://scandiweb.com/blog/magento-2-varnish-configuration/" target="_blank" rel="noopener">Varnish configuration</a> decides which pages the cache can serve.</p>



<p class="wp-block-paragraph">The old toolkit script&#8217;s cache-hit setting defaulted to 100%, so out of the box it measured a store where every page came from the cache. For a sale, the target, the traffic mix and the pass criteria are in our <a href="https://scandiweb.com/blog/black-friday-code-freeze/" target="_blank" rel="noopener">Black Friday load-testing plan</a>.</p>



<h3 class="wp-block-heading">3. Measure a baseline at low traffic</h3>



<p class="wp-block-paragraph">Run one or two requests per second for a few minutes and record p95 per page type. At this level, your numbers should match the single-page timings you get when you <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">audit Magento performance</a>. If the cache is on, refill the top pages first with a <a href="https://scandiweb.com/blog/magento-cache-warmer/" target="_blank" rel="noopener">cache warmer</a> or a scripted crawl, or the first minutes measure an empty cache. As a sanity check, Adobe says that with Varnish working, cacheable pages load in less than 150 ms.</p>



<h3 class="wp-block-heading">4. Raise the load in steps</h3>



<p class="wp-block-paragraph">Increase the rate in steps, doubling it each time for example, and hold each step for a few minutes, long enough for the numbers to settle. At each step record the requests per second the store actually answered, p95, the error rate, and CPU and database load from your monitoring, whether that is New Relic or the host&#8217;s dashboards. In k6, the ramping-arrival-rate executor steps the rate up on a schedule you set.</p>



<h3 class="wp-block-heading">5. Find the step where response times bend</h3>



<p class="wp-block-paragraph">Capacity is the last step before p95 rises faster than the traffic, or before errors appear. Write it down in requests per second, and note what ran out first, CPU, PHP workers or the database, because that tells you whether the fix is more servers or cheaper requests. To see which code uses that time, <a href="https://scandiweb.com/blog/magento-profiling/" target="_blank" rel="noopener">profile the slow page</a>. If the database ran out first, our guide to <a href="https://scandiweb.com/blog/magento-mysql-optimization/" target="_blank" rel="noopener">Magento MySQL optimization</a> covers slow queries and indexes. Then compare the number with your real peak, and the gap between the two is what the next few weeks need to close.</p>



<h3 class="wp-block-heading">6. Change one thing and run it again</h3>



<p class="wp-block-paragraph">Same copy, same data, same script, same steps, and the cache reset the same way before each run. Repeat each step several times and compare the medians, so one noisy run can&#8217;t decide the result. One change per comparison: a PHP upgrade, a new server size or a module, never all three at once.</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-load-testing-fair-test-setup.png" alt="Fair load test setup: two copies of one Magento store on the same server, with the same data and the same traffic script" class="wp-image-26562" style="display:block;margin:0 auto;max-width:100%;height:auto;" srcset="https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-fair-test-setup.png 1672w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-fair-test-setup-300x169.png 300w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-fair-test-setup-1024x576.png 1024w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-fair-test-setup-150x84.png 150w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-fair-test-setup-768x432.png 768w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-fair-test-setup-1536x864.png 1536w, https://scandiweb.com/blog/wp-content/uploads/2026/10/magento-load-testing-fair-test-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;">A fair comparison: two copies of the store on one server, with the same data and the same traffic, and one change between them.</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>Change one thing between runs. If you upgrade PHP, add a server and switch on a cache in the same week, a better result can&#8217;t tell you which change made the difference.</p></div>



<h2 class="wp-block-heading">What a fair load test looks like, with a worked example</h2>



<p class="wp-block-paragraph">A fair load test compares two versions of a store under identical conditions: the same server, the same data, the same cache settings and the same traffic, with one change between them. Repeating each run many times keeps one noisy result from deciding the outcome. Our Expedio benchmark followed that setup.</p>



<p class="wp-block-paragraph"><a href="https://scandiweb.com/solutions/magento/expedio" target="_blank" rel="noopener">Expedio</a> is scandiweb&#8217;s Magento module with an open-source core. 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">To measure it, we ran the kind of fair test this guide describes. 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, one as it runs today and one on Expedio, with the same data, the same hardware and no full-page cache on either, so Magento had to build every page. The test covered eight page types in 162 runs and 487,115 requests. Stock Magento&#8217;s category page climbed to 400 ms at 20 requests per second, the point where it began to struggle. With Expedio, the same server handles 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> has the full method and its limits.</p>



<p class="wp-block-paragraph">What to copy from it, whatever you are comparing:</p>



<ul class="wp-block-list">
<li>One round with the full page cache off, to see the build capacity rather than the cache&#8217;s.</li>


<li>Page types tested one at a time as well as mixed, so one slow template can&#8217;t hide in an average.</li>


<li>The benchmark&#8217;s own rule: &#8220;if an optimization would help both stores equally, we didn&#8217;t make it&#8221;. Every change in a comparison has to belong to the thing you are testing.</li>

</ul>



<h2 class="wp-block-heading">How to load test Adobe Commerce Cloud</h2>



<p class="wp-block-paragraph">On Adobe Commerce Cloud, open a support ticket before you load test, naming the environments, the tools and the time frame. Adobe&#8217;s testing guide covers load tests on Staging and Production before launch, and asks you to add results to the ticket and to note, with a date and time, when testing is complete.</p>



<p class="wp-block-paragraph">Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/commerce-on-cloud/user-guide/develop/test/staging-and-production" target="_blank" rel="noopener">Staging and Production testing guide</a> lists the tools it expects: JMeter for spiked traffic such as flash sales, Siege, and New Relic, which comes with Cloud projects and finds the processes that slow down. It also asks you to review the Performance Toolkit before launch. The toolkit&#8217;s data generator works on Cloud projects, since Adobe marks it for on-premises and Cloud (PaaS) projects, and not for Adobe Commerce as a Cloud Service.</p>



<p class="wp-block-paragraph">If your peak will run on a temporarily upsized cluster, book the upsize first and test at that size. Adobe&#8217;s <a href="https://experienceleague.adobe.com/en/docs/support-resources/adobe-support-tools-guide/adobe-commerce-support/how-to-request-temporary-adobe-commerce-on-cloud-infrastructure-upsize" target="_blank" rel="noopener">temporary upsize request page</a> says non-emergency requests need 48 business hours&#8217; notice, and the Holiday Surge option is offered only from October to December. Adobe doesn&#8217;t connect the upsize to load testing. We do, because a test on the smaller cluster tells you about a server you won&#8217;t be running on peak day.</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 temporary upsize on Adobe Commerce Cloud needs 48 business hours&#8217; notice, and the Holiday Surge option is offered only from October to December. Book it before the load test, so you test at the size you will run at peak.</p></div>



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



<h3 class="wp-block-heading">Is the Magento Performance Toolkit still part of Magento 2.4?</h3>



<p class="wp-block-paragraph">Partly. The setup/performance-toolkit folder still comes with Magento 2.4, and its five profiles still generate test data with bin/magento setup:performance:generate-fixtures. The JMeter load-test scripts that used to sit beside them, benchmark.jmx and benchmark_2015.jmx, were removed, and Magento 2.4.6 was the first release without them. Today you pair the toolkit&#8217;s data with a load-testing tool of your choice.</p>



<h3 class="wp-block-heading">How long does it take to generate Performance Toolkit data?</h3>



<p class="wp-block-paragraph">It depends on the profile and the server. Adobe&#8217;s notes for the toolkit said the large profile, with 300,000 simple products, can take up to 4 hours to generate. To use fewer resources, run the generator with the -s option to skip indexing, then run bin/magento indexer:reindex when it finishes. Disable cron jobs before you start, as Adobe&#8217;s instructions require.</p>



<h3 class="wp-block-heading">Which tool is best for Magento load testing?</h3>



<p class="wp-block-paragraph">The best tool is the one your developers can maintain. JMeter has the longest Magento history, since Adobe&#8217;s old toolkit scripts were JMeter files. k6 suits teams that write JavaScript and can hold a fixed rate of requests per second. Gatling suits Java teams, and Locust suits Python teams. All four are free and open source.</p>



<h3 class="wp-block-heading">How many users should a Magento load test simulate?</h3>



<p class="wp-block-paragraph">Work from your own analytics. Take the traffic of your busiest past peak, express it as requests per second, and test past it in steps until response times rise. A user count on its own says little, because a simulated shopper who pauses between pages sends far fewer requests than one who doesn&#8217;t. The old toolkit&#8217;s default of 100 users was only a starting value.</p>



<h3 class="wp-block-heading">What is the difference between load testing and stress testing?</h3>



<p class="wp-block-paragraph">A load test measures how fast the store responds under the traffic you expect. Adobe describes it as testing a number of concurrent users who each perform a set number of transactions in a set time. A stress test goes past that, to see whether the system still performs when the load goes well above the expected maximum. Run the load test first, then push on into a stress test.</p>



<h3 class="wp-block-heading">Can you load test a store on Adobe Commerce Cloud?</h3>



<p class="wp-block-paragraph">Yes. Open a support ticket first, naming the environments you will test, the tools you will use and the time frame. Adobe&#8217;s testing guide covers load tests on Staging and Production before launch. Add your results to the ticket as you go, and when you finish, note in the ticket that testing is complete, with a date and time stamp.</p>



<h2 class="wp-block-heading">Run your Magento load test before the next peak</h2>



<p class="wp-block-paragraph">Magento load testing answers one question before every peak: how much traffic your store takes before response times start to rise. The Performance Toolkit supplies the test data, a tool such as JMeter or k6 supplies the traffic, and a fair setup, one change at a time on the same server, makes the result something you can act on.</p>



<p class="wp-block-paragraph">When the test shows a limit you need to raise, 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 15 fixes in order, from the server to the browser. Run the first test now, while there are still weeks to act on what it finds, and keep the script. The same test after each change is what turns a guess about capacity into a number you can plan a sale around.</p>



<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Is the Magento Performance Toolkit still part of Magento 2.4?", "acceptedAnswer": {"@type": "Answer", "text": "Partly. The setup/performance-toolkit folder still comes with Magento 2.4, and its five profiles still generate test data with bin/magento setup:performance:generate-fixtures. The JMeter load-test scripts that used to sit beside them, benchmark.jmx and benchmark_2015.jmx, were removed, and Magento 2.4.6 was the first release without them. Today you pair the toolkit's data with a load-testing tool of your choice."}}, {"@type": "Question", "name": "How long does it take to generate Performance Toolkit data?", "acceptedAnswer": {"@type": "Answer", "text": "It depends on the profile and the server. Adobe's notes for the toolkit said the large profile, with 300,000 simple products, can take up to 4 hours to generate. To use fewer resources, run the generator with the -s option to skip indexing, then run bin/magento indexer:reindex when it finishes. Disable cron jobs before you start, as Adobe's instructions require."}}, {"@type": "Question", "name": "Which tool is best for Magento load testing?", "acceptedAnswer": {"@type": "Answer", "text": "The best tool is the one your developers can maintain. JMeter has the longest Magento history, since Adobe's old toolkit scripts were JMeter files. k6 suits teams that write JavaScript and can hold a fixed rate of requests per second. Gatling suits Java teams, and Locust suits Python teams. All four are free and open source."}}, {"@type": "Question", "name": "How many users should a Magento load test simulate?", "acceptedAnswer": {"@type": "Answer", "text": "Work from your own analytics. Take the traffic of your busiest past peak, express it as requests per second, and test past it in steps until response times rise. A user count on its own says little, because a simulated shopper who pauses between pages sends far fewer requests than one who doesn't. The old toolkit's default of 100 users was only a starting value."}}, {"@type": "Question", "name": "What is the difference between load testing and stress testing?", "acceptedAnswer": {"@type": "Answer", "text": "A load test measures how fast the store responds under the traffic you expect. Adobe describes it as testing a number of concurrent users who each perform a set number of transactions in a set time. A stress test goes past that, to see whether the system still performs when the load goes well above the expected maximum. Run the load test first, then push on into a stress test."}}, {"@type": "Question", "name": "Can you load test a store on Adobe Commerce Cloud?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Open a support ticket first, naming the environments you will test, the tools you will use and the time frame. Adobe's testing guide covers load tests on Staging and Production before launch. Add your results to the ticket as you go, and when you finish, note in the ticket that testing is complete, with a date and time stamp."}}]}</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 you want us to review your load-test setup or your results before the next peak, </em><a href="https://scandiweb.com/contact" target="_blank" rel="noreferrer noopener"><em>get in touch with our team</em></a><em>.</em></p></p>
<p>The post <a rel="nofollow" href="https://scandiweb.com/blog/magento-load-testing/">Magento Load Testing: How to Benchmark Your Store for Peak Traffic</a> appeared first on <a rel="nofollow" href="https://scandiweb.com/blog">scandiweb</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<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. Our guide on how to <a href="https://scandiweb.com/blog/how-to-audit-magento-performance/" target="_blank" rel="noopener">audit Magento performance</a> shows how to take those measurements for each page type.</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. On Magento, our <a href="https://scandiweb.com/blog/magento-profiling/" target="_blank" rel="noopener">Magento profiler guide</a> shows how to do that with New Relic or Blackfire. 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. How Magento compares with other platforms on this metric is in our <a href="https://scandiweb.com/blog/fastest-ecommerce-platform/" target="_blank" rel="noopener">fastest eCommerce platform</a> research.</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. Our <a href="https://scandiweb.com/blog/magento-2-varnish-configuration/" target="_blank" rel="noopener">Magento 2 Varnish configuration</a> guide covers the setup step by step. 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>
	</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 42/196 objects using Redis
Page Caching using Disk: Enhanced 

Served from: scandiweb.com @ 2026-11-07 17:19:08 by W3 Total Cache
-->