The rebuild was beautiful. Then we put the real store inside it.
The situation
An agency had spent a quarter rebuilding a merchant's storefront in a development store: new Online Store 2.0 theme, restructured templates, everything driven by metaobjects and metafields. It looked perfect — with twelve placeholder products in it. Launch required the real store: full catalog, blog archive, customers, and the metafield data every new template depended on. The merchant refused a multi-week content freeze, and CSVs can't carry metaobjects at all.
What made it hard
- Metaobject-driven templates. The new sections rendered from metaobject entries and reference metafields — exactly the data CSV round-trips destroy.
- A moving target. Production kept taking orders and adding products during the weeks of UAT.
- 214 blog posts and pages with SEO that had to arrive at identical URLs.
How the migration ran
Because every import is an idempotent upsert, the migration doubled as a sync. The first pass loaded the full catalog, metaobjects, content and customers under the new theme weeks before launch. During UAT it re-ran three times — each pass moving only what had changed in production. The final top-up sync ran the morning of launch: the content freeze lasted under an hour instead of weeks.
The numbers
- Metaobjects & reference metafields: 100% re-pointed, zero dangling references
- Blogs & pages: 214 / 214 matched, URLs identical
- Re-migration syncs during UAT: 3, all verified clean
- Content freeze at launch: < 1 hour · Downtime: 0 minutes
Fixed-price Shopify to Shopify migration, verified twice, zero downtime.
See packages & book →