[ Case study ]
The retailer's aging self-hosted store went down for hours every promotion. Checkout failed silently on mobile Safari for a subset of customers, orders were reconciled by hand each night, and the one developer who understood the platform had left.
CLIENT a 40-SKU home goods retailer — FOCUS Run the old store and the new one in parallel
Representative examplesEvery case study in this library is an illustrative composite of the kind of engagement we deliver — written to show our method and standards, not to name clients.
Selling lamps, ceramics, and textiles through one self-hosted web store, the retailer ran on a platform installed before its current staff arrived. Forty products carried long-tail variants — fabric, size, care instructions — that made each record richer than its category suggested. The team of three handled merchandising, packing, and the books, with orders reconciled against the payment gateway by hand each evening. Promotions drove their best weeks, and the holiday quarter carried the year. When the developer who understood the platform left, the store became something the team operated rather than maintained.
The retailer's aging self-hosted store went down for hours every promotion. Checkout failed silently on mobile Safari for a subset of customers, orders were reconciled by hand each night, and the one developer who understood the platform had left.
We proposed rebuilding on Shopify while the legacy store kept trading, then cutting over well before the holiday freeze. The core reasoning: the platform's failures were structural — hosting, checkout codebase, and admin all needed replacing at once — but the risk lived in data, not design. So we ran both stores in parallel with a product-by-product parity check, migrated products, customers, and order history in staged passes behind a redirect map, and kept the legacy stack warm with a tested rollback for two weeks after DNS flipped. Every risky prerequisite was retired early so the cutover itself stayed small.
Just as important is what we ruled out, and why:
The Shopify build ran on a staging domain with a product-by-product parity check against the legacy catalog, so discrepancies surfaced while both systems were still safe.
Products, customers, and order history migrated in batches with a redirect map — search equity checked per batch, not at the end.
DNS flipped on a quiet Tuesday with the legacy store kept warm for two weeks and a tested rollback plan; the risky prerequisites were retired early so the cutover itself stayed small.
Delivered by the systems pod — 2 engineers + commerce lead over 10 weeks, phased, with working increments reviewed with the client every week.
Obstacle
The parity check surfaced more discrepancies than expected — dozens of legacy records carried variant data entered freehand over the years, with no consistent naming.
Handled: We built a normalization pass into the migration script, mapped each legacy field to its Shopify equivalent, and re-ran per batch until parity ran clean.
Obstacle
Two weeks before cutover, a parity test order reproduced the mobile Safari failure on the legacy store — a payment app conflict nobody had diagnosed.
Handled: We isolated it with a test gateway and ruled the app out of the new build entirely, which simplified the checkout plan and the app budget.
The headline: checkout conversion rate, the two months after cutover versus the two months before, like-for-like traffic — 3.1% → 4.6%, read from Order data reconciled against analytics. A second check: minutes of unplanned downtime since cutover at 0.
Promotion weeks no longer start with a war room. The team spends the evening before a sale checking stock and imagery instead of rebooting a server, and the nightly reconciliation has shrunk to glancing at a dashboard. Editing a price or adding a product is a five-minute self-service task, which changed how often the catalog actually gets refreshed. Most telling: when a payment app misbehaved during a sale after cutover, they identified it themselves and swapped it without calling us.
The result was read from Order data reconciled against analytics against the pre-engagement baseline over the stated window, with a guardrail check on minutes of unplanned downtime since cutover. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.
What we would do differently
We would have discovered the mobile-Safari checkout bug on the legacy store first — it turned out to be a payment-app conflict, and knowing that early would have changed the app plan.
[ Related service ]
[ Related builds ]
−87% 0Gift-checkout failure reports, in the two gift seasons after launch versus the two before
14 0Mispriced-checkout incidents per month, three months post-fix versus three months before
[ Next step ]
Next case study