A 900-person distributor modernized without a big-bang cutover
2 days to make a pricing change, down from roughly six weeks
Checkout had been down for nineteen minutes on the previous peak day, and the cloud bill had roughly tripled in two years — because every performance problem had been answered by making the instance bigger.
off the monthly cloud bill, after the architecture changed rather than before
mobile largest contentful paint on the top twenty category pages, from 4.8s
the previous year's peak order rate carried with no checkout errors above baseline
Figures are as reported by the client over the period named in the body below, and were not independently audited by us.
Working on something like this?
Get an estimateCheckout was down for nineteen minutes on the previous peak day. The cloud bill had roughly tripled in two years. Those two facts were being treated as separate problems, and they were the same problem.
Every performance complaint over those two years had been answered the same way — a larger instance. That works, briefly, and it is the most expensive way to buy time. It also hides the cause, because a bottleneck that has been outgrown twice looks like a capacity issue rather than a query issue.
A read replica and a cache went in front of the catalogue in the first fortnight, on the existing stack. This was deliberately unglamorous and deliberately first: resizing instances around a broken access pattern buys a cheaper version of the same architecture, and then the replatform inherits it.
Next.js in front, the existing commerce platform behind. The backend was working, the team knew it, and the order and inventory data lived there. Replacing it as well would have doubled the project and put the system of record in the blast radius of a front-end deadline.
Traffic moved one category at a time behind a routing rule, starting with a mid-volume one rather than the largest or the smallest. The first week of real traffic on the new storefront was therefore a test with a rollback measured in seconds, and the eleven plugins were retired one at a time as each category left them behind.
Including the shape of the spike — the sharp arrival at the top of the hour, the sustained plateau, the long tail. A synthetic ramp finds the throughput ceiling and misses the failure that only happens when everything arrives together, which is the one that took checkout down.
With the query fixed and the storefront rendering statically where it could, the instance sizing that had accumulated over two years was simply wrong in the other direction. That is where most of the 35% came from — not from a discount, and not from a reservation.
Their team, their on-call rota, a rehearsed rollback, and two failures injected without warning. The point was not to prove the system worked. It was to find out whether the people who would be awake in November knew what to do, while it was still September.
It was the obvious candidate — it was old, it was the thing the plugins attached to, and replatforming it would have been a cleaner architecture at the end. It was also where every order, price, and stock level lived, and it was not the bottleneck.
Replacing a working system of record because a different part of the stack is slow is how a five-month project becomes a fourteen-month one. The test we apply is simple: name the symptom, then name the component causing it. If those are different components, fix the second one and leave the first alone.
off the monthly cloud bill
mobile LCP on the top twenty category pages, from 4.8s
the previous peak order rate, no checkout errors above baseline
The 35% is the number a buyer notices, but the mechanism is the order of operations. The bill fell because the architecture changed first and the sizing changed second. Doing it the other way round — the standard cost-optimization engagement — would have found perhaps a third of it, and the peak-day outage would have happened again.
Headless earns its keep in specific conditions and is an expensive answer outside them. We would rather name those before quoting.
The build capability is cloud solutions for eCommerce and the release side is DevOps for eCommerce. The engagement shape is cloud and DevOps, the stack is Next.js, and if the bill is the reason you are reading this, what actually drives cloud migration cost covers the pattern this project ran into.
A bigger instance is not a fix. It is a receipt for the fix you did not make.
“We had been told for two years that the fix was a bigger database. The fix was one query and a cache in front of it.”
Tell us what is not working. You will get a scoped estimate and an architecture you own, not a capability deck.
2 days to make a pricing change, down from roughly six weeks
99.9% service availability across the port-in weekend
4 days median referral to first appointment, down from eleven, over two quarters