Case Study
From 30-second category pages
to about one second.
Without replatforming.
A Finnish mobile-electronics retailer on headless Magento: a custom Nuxt storefront over GraphQL, a headless CMS, and Kubernetes on Google Cloud. The shop looked like proof that "Magento is slow". It wasn't.
20–30 s → ~1 s
Heaviest category page
~2.5 s → under 1 s
Time to first byte, site-wide
~3,000 → 0
Pages rated red for layout shift (CLS)
0
Open issues since early 2026
Slow, inconsistent, and blamed on Magento.
Category pages took 20–30 seconds, worst where products had many variants.
Every page waited about 2.5 seconds before anything arrived.
Around 3,000 pages failed Google's layout-stability test.
Customers saw different prices and stock on the listing, the product page and the cart.
Features that work out of the box on standard Magento (Klarna checkout, server-side Meta tracking, even the sitemap) had to be custom-built for the storefront.
Analytics events fired before tracking had loaded, so they were silently lost.
We measured each layer separately.
Backend response time and frontend render time were measured on their own: the step most teams skip, and the reason the real causes had stayed hidden.
Three findings:
Over-fetching. The storefront asked for every attribute of every product variant, and the backend returned all of it, on every page. Trimming the queries to what the page actually shows saved up to 20 seconds on its own.
Split hosting. The frontend and backend ran in separate environments, so every page paid an extra network round trip. Moving them into the same cluster saved about half a second per page by itself.
Unsynchronised caches. Three cache layers expired on their own schedules, with no way for Magento to tell the storefront that something had changed. That's why prices and stock disagreed between pages.
What we changed.
Trimmed and split the category queries.
Gave category and search their own templates, and reserved layout space for content loaded from the CMS.
Built cache invalidation end to end: saving a product in Magento now clears exactly the right storefront cache entries. Stock comes from its own uncached request, so it's always live.
Moved the frontend into the backend's Kubernetes cluster and rebalanced resources. Smaller footprint, more stable, no extra hardware.
Fixed analytics tracking and the page heading structure.
Built the Klarna checkout, server-side Meta tracking and sitemap for the custom storefront.