A slow Magento store loses sales and search visibility. We find out exactly why your pages are slow — server, cache, database, theme or third-party scripts — and fix the causes in order of impact, measured with real-user Core Web Vitals rather than a single Lighthouse run.
Magento is fast when it is configured correctly and slow when it is not. The most common causes we find are full-page cache misses (Varnish not configured, or blocks that make pages uncacheable), cache and sessions stored on disk instead of Valkey or Redis, indexers set to "Update on Save", heavy cron jobs and slow database queries from extensions.
On the frontend, Luma's RequireJS and Knockout.js stack, large unoptimised images, web fonts and third-party tags such as chat, reviews and marketing pixels delay rendering and make interactions sluggish. Since March 2024, Google measures responsiveness with Interaction to Next Paint (INP), which is often where Luma stores struggle most on mobile.
We profile both sides, fix the biggest problems first and confirm the improvement with field data from the Chrome UX Report and your own monitoring.
Server-side and frontend work, prioritised by measured impact.
Varnish or Fastly configured with the Magento VCL, cache-busting blocks found and fixed, and hit rate monitored.
Separate instances for cache, full-page cache and sessions, with eviction policies and compression tuned.
Slow query analysis, MySQL 8.4 or MariaDB tuning, indexers on "Update by Schedule" and cron health.
Responsive images in WebP or AVIF, correct dimensions, lazy loading below the fold and priority hints for the LCP image.
Reduce and defer JavaScript, audit third-party tags and fix long tasks that hurt Interaction to Next Paint.
When Luma is the bottleneck, migrating to Hyvä removes most frontend JavaScript and is often the biggest single improvement.
1. Is full-page cache actually hitting? Load a category page twice and check the response headers. With Varnish, an X-Magento-Cache-Debug: HIT header (in developer mode) or a high Varnish hit rate shows the cache is working. Frequent misses usually mean a block with cacheable="false" in layout XML.
2. Are indexers on schedule? Run bin/magento indexer:show-mode. Indexers set to "Update on Save" slow down admin saves and imports on large catalogues; "Update by Schedule" processes changes in the background through cron.
3. Is cron healthy? Check the cron_schedule table for jobs stuck in "running" or a growing list of "missed" jobs. Broken cron silently stops indexing, emails and cache cleaning.
4. Where are cache and sessions stored? File-based cache and sessions on busy stores create disk contention. Valkey or Redis is the standard for production.
5. What is your LCP element? In PageSpeed Insights, find the Largest Contentful Paint element on mobile. If it is a lazy-loaded hero image, removing lazy loading and adding fetchpriority="high" is often a quick improvement.
Performance work without measurement is guesswork. Every change we make is tied to a metric.
We record field Core Web Vitals, server response times and cache hit rates before changing anything.
Fixes are ranked by expected impact and effort, so you see results early in the project.
We use profilers and APM tools to find the exact templates, blocks, queries and plugins that cost time.
Optional monthly monitoring catches regressions from new extensions, tags or content.
Most optimisation projects take two to four weeks. Field data takes up to 28 days to reflect changes fully.
Collect field and lab data for key templates: home, category, product, cart and checkout.
Profile server and frontend, review configuration, extensions, cache and third-party scripts.
Cache, Valkey/Redis, database, indexers, cron and PHP configuration.
Images, fonts, CSS, JavaScript and third-party tags; Hyvä migration if agreed.
Compare against baseline, monitor field data and document results.
Send us your store URL. We will look at your Core Web Vitals field data and the main bottlenecks and reply with the top fixes we would make.
Within one business day, Mon–Fri
No obligation. We reply within one business day.