From Wix to Custom Without Downtime: Dual-Run Migrations with Feature Flags
by Marc David, Founder & Lead Developer
Starting point and goals
A UK collectibles retailer was scaling on TikTok Shopping with a live Wix site and a growing catalog. They needed tighter control of SEO, real pre-order logic, lower fees through Stripe, and a faster storefront, but could not afford downtime. Our brief was simple to say and hard to do: improve everything without breaking what already works.
Dual-run, not big bang
We ran the new stack in parallel with the existing Wix setup. A scheduled ingestion service mirrored the Wix catalog into our database, enriched the data model where Wix was thin, and kept slugs and IDs stable. Search, collections, and sitemaps came from the synced catalog so discovery was independent of live Wix responses. When a product needed to stay Wix-first for a while, routing and presentation were decided by flags.
Owner-controlled feature flags
We put a friendly toggle UI in the client's admin so releases did not require a deploy. Flags covered visibility, routing, payment choice, pre-order behavior, rate limits like max order quantity, i18n, percentage rollouts, and kill switches. That let the team stage features, schedule switches for drops, and roll back in seconds if needed.
{
"app.payment": "wix|stripe",
"app.auth": "wix|custom",
"routing.product.1234": "custom|wix",
"catalog.preorder": true,
"catalog.maxQty": 2,
"i18n.enabled": false
}
Top tip
Treat platform tags as signals you can reinterpret, keep slugs stable, start with a short sync interval then relax it, and put non-technical owners in control with a simple toggle UI.
Editorial workflow without whiplash
Editors could keep working in Wix while testing the new CMS that mirrors the Wix mental model. Roles were simple (Admin and Content Editor), with previews, required fields, and sane URL rules. Training was light because the UI felt familiar by design.
Pre-orders done properly
We implemented pre-orders with hard caps per SKU, intent capture, and status-driven email updates. The logic lived in the custom stack and was exposed through flags so adoption could be incremental and low risk.
SEO and URL strategy
We preserved key URLs, generated sitemaps from the synced catalog, and injected JSON-LD on PDPs and collections. Canonicals and redirects kept the index clean during dual-run. Next.js sitemap.ts
queried the latest catalog at request time, so new and edited products appeared quickly without manual steps.
Payments, orders, and checkout
Early on, checkout stayed on Wix for continuity. Stripe was fully integrated on the custom path and guarded by a flag. Orders and statuses remained traceable in one place regardless of the path taken, which kept support simple while fees dropped where Stripe was enabled.
Auth and accounts
Wix auth continued to run because it powered marketing automations the client liked. We implemented Better Auth on the custom side and parked it behind a flag. When the client is ready, the source of truth can switch without a rebuild.
Media and performance
We deployed a co-located, S3-compatible image service that handles uploads, transforms, and responsive variants close to the app servers. Performance budgets and caching kept PDPs and listings responsive during drop traffic. The result was a calmer release cadence and fewer support pings.
Rollout, testing, and backout
We validated data parity with reconciliation checks, tested routing and SEO ahead of cutover, and launched in stages behind flags. A documented backout plan returned traffic to the previous path in seconds if needed. Observability included logs, metrics, uptime checks, and Sentry, plus a lightweight analytics layer that respects GDPR.
Results and lessons
Pages became faster and search independent of Wix. Drops were smoother because flags put control in the hands of the owners. Editorial work felt familiar but safer, and fees decreased where Stripe was enabled.