Six markets, 48,112 customers, zero downtime.
The situation
A US direct-to-consumer supplements brand needed to restructure its payments setup — the kind of change Shopify only allows on a fresh store. The catch list was long: six Shopify Markets with per-market price lists, Recharge subscriptions driving a large share of revenue, tens of thousands of customers with carefully maintained email and SMS consents, and a theme whose product pages were driven almost entirely by metafields — including json fields that embedded references to files and other products.
What made it hard
- 11,058 metafields, many of them reference types. A naive copy leaves those references pointing at objects in the old store — the theme renders, but every custom section is silently broken.
- Markets and price lists. Fixed per-variant prices in six currencies had to land on the right variants in the new store, matched by SKU, not by ID.
- Consent integrity. Email and SMS opt-ins had to arrive with their original states and timestamps — re-opting anyone in would be a compliance violation, dropping anyone would burn revenue.
- Subscriptions. Recharge plans needed to re-map to the new store's products; active subscribers moved through Recharge's official store-to-store process, coordinated around the cutover date.
How the migration ran
The full manifest moved in dependency order — files first, then metaobjects and metafield definitions, then products, so that by the time reference metafields were written, every object they pointed at already existed on the new store and could be re-pointed correctly. Image URLs inside product descriptions were rewritten to the new store's CDN. The live store was never written to; it kept selling throughout.
Then the entire migration ran a second time. Result: zero records created — the machine-checked proof that pass one missed nothing.
The numbers
- Products & variants: 1,284 / 1,284 matched
- Customers: 48,112 / 48,112 matched, consents intact
- Metafields: 11,058 / 11,058 matched, references re-pointed
- Markets: 6 / 6 with per-market price lists verified price-by-price
- Second pass: created 0 records · Downtime: 0 minutes
Fixed-price Shopify to Shopify migration, verified twice, zero downtime.
See packages & book →