The problem
Atlas had grown a WooCommerce store from a few hundred products to more than forty thousand, and every year of growth had been absorbed by another plugin. Category pages took over four seconds to render on a mid-range phone, the search was returning stale results, and the checkout dropped roughly one in five customers on the payment step.
The commercial pressure was straightforward: paid traffic was rising in cost while mobile conversion fell. Nobody wanted a redesign. They wanted the same catalogue to be fast and reliable.
What we found in the audit
We started with a two-day audit rather than a proposal. Four findings shaped everything afterwards:
- Eleven plugins touched the price. Discounts, tiers and tax rules were calculated in sequence on every page view, uncached.
- Images were served at full resolution. A category page transferred 14 MB to render twenty product tiles.
- Search ran against the live database. Every query locked the same tables the checkout depended on.
- Nothing was measured. There was no performance baseline, so no one could tell which change had helped.
The approach
We kept WordPress as the content and product source — the merchandising team knew it and had no appetite to relearn — and moved the storefront to Next.js in front of it. Pricing logic moved out of the plugin chain into a small Node.js service with its own cache, so a price calculation happens once rather than on every render.
Phase one — instrumentation
Before touching the build we shipped monitoring: field Core Web Vitals, funnel events on the checkout, and an error budget. The scope named a target of a 1.2s Largest Contentful Paint on a throttled 4G connection so success was a number, not an opinion.
Phase two — storefront and pricing service
Category and product pages became statically generated with incremental revalidation, hydrating only the interactive parts. The pricing service exposed one documented endpoint, with the tier and discount rules ported across as tested functions rather than a plugin stack.
Phase three — staged cutover
We ran the new storefront on a subdomain against live data for eleven days, mirrored traffic to compare responses, then moved DNS with the redirect map in place. Search rankings were checked daily for a fortnight afterwards; none of the top 200 URLs lost position.
The result
Median page load fell from 2.4 seconds to 0.8. Mobile conversion rose 34% over the following quarter against the same ad spend, and the checkout drop-off on the payment step halved. Because the price service is cached, Black Friday traffic ran on the same infrastructure without a scaling scramble.
Atlas now maintain the storefront with their own developer, using the handover documentation and repository we delivered. We stayed on for three months of support and have been on a monthly care plan since.