Direct answer: success must be proved, not inferred from a working homepage
A Magento-to-Shopify migration is not complete when a product CSV has loaded and the domain points to a new homepage. Completion requires evidence that business objects are intact, important relationships survive, every valuable legacy URL has a relevant destination, payment and inventory reconcile, search signals are protected, operators can work, and the business can recover from a failed cutover.
The safest model divides delivery into discovery, mapping, prototype, full rehearsal, delta synchronization, cutover, and stabilization. Every stage has inputs, outputs, an accountable owner, pass criteria, and a rollback branch. Shopify's current migration guide distinguishes copy/paste, CSV, apps, partners, and API routes and notes that product, customer, and historical-order import sequence affects relationships. Choose a method by object complexity rather than allowing one migration tool to define the scope.
| Success dimension | Pre-launch evidence | Post-launch evidence | Failure response |
|---|---|---|---|
| Data | Object counts, fields, relationships, samples | Delta reaches zero, support can retrieve history | Stop writes or rerun delta |
| Transactions | Payment, tax, stock, refund replay | First live orders reconcile end to end | Revert or disable checkout |
| SEO | URL register, 301s, metadata, schema | Crawl, index, ranking, organic conversion | Repair routing and resubmit |
| Operations | Merchandising, content, promotion, fulfillment exercise | Shifts, access, alerts, runbooks work | Extend parallel operation and training |
| Recovery | Scripts, write boundaries, rehearsal | Trigger can be executed | Restore authoritative systems by plan |
First decide whether migration beats improving Magento
Identify the source of current pain: infrastructure expense, version and extension debt, editorial friction, slow market launches, checkout constraints, scarce talent, or the business model itself. A platform change does not repair disordered master data, an unreliable ERP, or slow internal approval. Quantify incidents, release lead time, labor, and commercial impact before deciding whether Shopify's managed boundary changes the outcome.
A standard Shopify plan and Shopify Plus are not the same target. If platform selection is open, use the Shopify vs Magento decision guide. If the scope includes organization governance, complex B2B, expansion stores, or enterprise checkout, use the Shopify Plus vs Magento guide. Migration work can stabilize only after platform and plan boundaries are agreed.
Define five knockout conditions
At minimum, list required country payments, product model, customer or company relationships, historical-order visibility, and statutory retention. Pause the decision if any condition cannot be proved in the target prototype. This prevents discovering late that a critical capability needs a different plan or architecture.
Build an object register of what Magento really contains
Magento data is not limited to standard products and customers. EAV attributes, store views, extension tables, media, CMS blocks, URL rewrites, indexes, queues, and external systems can all carry business truth. Adobe Commerce's data export documentation describes asynchronous Admin exports and their entity scope, but a standard export does not prove coverage of every extension object. Combine Admin exports, APIs, a read-only database snapshot, and supplier documentation.
| Object | Key and relationships | Candidate transfer | Evidence to retain |
|---|---|---|---|
| Products and categories | entity/SKU, parent-child, attribute, site scope | CSV, API, migration tool | Counts, variants, media, collections |
| Customers | customer ID, email, address, group, consent | CSV, API, app | Deduplication, access, consent origin |
| Orders | increment ID, customer, item, transaction, fulfillment | API, app, read-only archive | Amount, currency, tax, status |
| Content | pages, blocks, blogs, media, languages | API, scripts, reconstruction | URL, body, images, publication state |
| Rules and extensions | promotions, subscriptions, points, gift cards, custom tables | Dedicated transforms | Balance, expiry, audit, exit |
Assign an owner to every field
The mapping sheet should contain the Magento source, Shopify target object, conversion rule, null/default behavior, enum mapping, privacy class, owner, and acceptance query. If the PIM owns product titles and the WMS owns stock, the Magento snapshot must not become the permanent source of truth. Migration is also an opportunity to repair ownership boundaries.
Choose a transfer architecture: CSV, app, or API
A small conventional catalog can use CSV. Complex objects, repeated deltas, or relationship-heavy data usually need a migration app or a controlled pipeline. Shopify's product CSV specification documents current field dependencies, URL handles, market columns, and metafield support. “No-code” does not mean no risk: missing related option columns, overwriting a matching handle, or changing options can have unintended effects. Test a small set in a development store.
Large or repeatable loads can use bulk imports in the GraphQL Admin API, while the team still owns API versions, JSONL creation, result files, user errors, idempotency, and replay. Select the tool from object complexity, volume, downtime, number of deltas, and audit needs.
Maintain a durable ID map
Never relate objects by a mutable title or handle alone. Store the Magento entity ID, SKU, and increment ID against Shopify GIDs and handles, with batch and result state. A rerun checks this map before creating, updating, or skipping, preventing duplicate customers, products, and orders.
Migrate products, attributes, variants, and categories
Magento configurable products, simple children, attribute sets, category hierarchy, websites, and store-view scopes do not map one-to-one to Shopify products, options, variants, collections, metafields, and metaobjects. Prototype the hardest 50–200 products: high variants, bundles, downloads, pre-orders, multiple languages, market prices, rich descriptions, and dense media.
| Magento structure | Shopify target candidate | Risk | Acceptance |
|---|---|---|---|
| Configurable + simple | Product and variants | Option combinations, SKU, old IDs | Parent-child and SKU reconciliation |
| Attribute set | Category, metafield, metaobject | Type, enum, unit loss | Field-level conversion report |
| Category tree | Automated/manual collections, navigation | Hierarchy and URLs change | Tree and storefront path review |
| Website/store-view price | Markets, catalogs, or app rules | Currency, rounding, effective date | Representative cart replay |
| Media gallery | Product media, files, external storage | Order, alt, broken source | Hash and visual sampling |
Make every product load replayable
Record the input hash, start and end time, success, failure, and skip count for each batch. Errors must identify SKU and field rather than live only in a screenshot saying “complete.” Loading structure before media, relationships, price, and inventory reduces the failure boundary.
Migrate customers, addresses, passwords, and consent
Customer migration is more than an email list. Resolve duplicate emails, guest/registered overlap, multiple addresses, customer groups, B2B companies, tax flags, marketing consent, privacy requests, and account activation. Do not assume password hashes are portable. Design a safe invitation or reset process and control timing so rehearsals do not send production mail.
Marketing consent needs origin, timestamp, scope, and legal basis. Data without provable consent should not be silently subscribed. Sampling must cover Admin data, sign-in, default address, order visibility, unsubscribe, and deletion.
Deduplicate before importing
Generate a conflict report from normalized email, external IDs, and business rules. Do not automatically overwrite two entities sharing an email or merge a company buyer with a consumer. Every merge decision must be auditable and preserve legacy IDs.
Preserve historical orders and service continuity
Historical orders contain item snapshots, discounts, tax, shipping, payment transactions, invoices, shipments, refunds, notes, and extension data. The goal is not to make an old order behave like a new Shopify order. It is to provide trustworthy records for service, finance, returns, and regulation. Decide what enters Shopify, what stays in an encrypted read-only archive, and what belongs in the warehouse.
Shopify's migration guide describes app or API routes for historical orders and warns that import activity can trigger notifications. Disable unwanted messages during rehearsals and use test customers. Gift cards, store credit, loyalty balances, and subscriptions need separate reconciliation because they are future obligations, not merely rows.
Replay orders to validate relationships
Sample multiple currencies, discounts, tax, partial refunds, split fulfillment, cancellation, guests, registered customers, and subscriptions. Reconcile the amount equation, customer link, SKU, status, timestamps, transaction reference, fulfillment, and service view. A tool that “fixes” amounts must emit a difference report.
Build a URL and SEO register with one final destination per source
Collect legacy URLs from Magento URL rewrites, database, XML sitemaps, analytics, Search Console, backlinks, and web logs. Adobe's URL rewrite documentation shows that product, category, and custom rewrites can create many paths. Crawling current navigation alone misses historical routes and store-view variations.
| Legacy URL class | Treatment | Acceptance |
|---|---|---|
| Same content and intent | One-to-one 301 to equivalent | One hop, 200 target, same language |
| Duplicate pages | Merge to most relevant canonical | No homepage redirect, no chain |
| No substitute or value | 410 or explicit retirement | No soft 404 |
| Parameters and filters | Preserve necessary index pages, normalize others | Canonical and robots agree |
| Language/store view | Map to corresponding language and market | Hreflang, fallback, sitemap agree |
Shopify supports URL redirects in Admin and API. The official UrlRedirect object stores the legacy path and target. Validate duplicates, loops, chains, encoding, case, trailing slashes, and parameters before loading. Do not send every unmatched page to the homepage.
Run template-level SEO diffs before launch
For home, collection, product, page, blog, brand, and pagination templates, compare title, meta description, H1, body, canonical, hreflang, schema, robots, status, and sitemap. Revenue and organic landing pages also need internal-link, anchor, image-alt, and rendered-content comparison.
Rebuild pages, blogs, CMS blocks, and media
Magento CMS pages, static blocks, Page Builder content, and extension fields can combine HTML, shortcodes, styles, and media URLs. Blind copying leaves broken components and uneditable inline code. Decide what becomes a Shopify section, page, blog, metaobject, or app object before conversion.
For every media asset, record source URL, hash, target URL, alt, order, object link, and failure status. Scan for missing images, mixed content, expiring third-party links, excessive size, and duplicates. Manually review the highest-revenue and highest-organic pages.
Migrate the content model before the prose
Extract specifications, FAQ, author, references, downloads, and structured fields from free HTML. Copying prose first can reproduce the old, non-reusable content structure and waste the governance opportunity created by the platform change.
Replace extensions, apps, and integrations by business purpose
Register every Magento module's business purpose, tables, events, cron, external calls, permissions, cost, owner, and retirement method. Do not search for a Shopify app with the same module name. One module may become native Shopify configuration, an app, Flow, Functions, APIs, and an external service—or it may be retired.
Re-establish the system of record, business key, event order, retry, idempotency, dead letter, replay, and reconciliation for ERP, PIM, WMS, OMS, CRM, tax, and analytics. During migration, Magento and Shopify cannot both be uncontrolled writers for the same object.
Create an exit card for every replacement
Document export, outage behavior, degradation, alternative, permission cleanup, billing termination, and historical access. A migration that continues paying for old extensions or servers has not completed its exit work.
Replay payment, tax, shipping, inventory, and fulfillment
Configuration is not an end-to-end result. Test target countries, entities, currencies, tax jurisdictions, locations, and carriers through successful and failed authorization, 3DS, duplicate callback, partial refund, chargeback, stacked discounts, exemption, rounding, multi-location stock, oversell, split fulfillment, and return.
Inventory cutover needs one authoritative system and a freeze window. If WMS or ERP is the source, Magento and Shopify subscribe or publish under a controlled plan; operators must not edit both. Persist business key, source time, target time, and result for every synchronization.
Put the first live orders on a human control board
For the first hours, compare each Shopify order with the payment gateway, ERP/WMS, tax system, and carrier. Staff commerce, engineering, finance, warehouse, and service roles in advance and route every discrepancy to one incident queue.
Use full loads, deltas, and parallel operation to control change
Run at least two full rehearsals and one delta rehearsal. The first reveals scope and mapping problems. The second proves fixes and duration. The delta proves that new and modified objects since the baseline can be captured. Preserve source snapshots, inputs, mapping versions, outputs, and reconciliation for every run.
| Stage | Magento writes | Shopify writes | Main purpose |
|---|---|---|---|
| Prototype | Normal production | Test data | Prove structure and complex samples |
| Full rehearsal | Normal production | Rebuilt or isolated | Measure throughput, errors, cleanup |
| Delta rehearsal | Normal production | Controlled update | Prove timestamps, deletion, idempotency |
| Cutover freeze | Business writes restricted | Open after final delta | Minimize the gap |
| Stabilization | Read-only or limited fallback | Production authority | Reconcile, monitor, retire old platform |
Deletion and cancellation are deltas too
Filtering only by created or updated timestamps misses deletion, cancellation, merge, and expiry. Define events or difference queries for unpublishing, customer merges, refunds, gift-card use, address changes, and URL retirement.
Reconcile more than record counts
Use four levels: object count, critical fields, object relationships, and business totals. Matching product counts can conceal broken parent-child relationships. Matching order counts can conceal tax or currency variance. Matching customer counts can conceal duplicates and polluted consent. Each level needs a machine report and risk-based samples.
Sample by risk, not only randomly
Cover top-revenue products, hardest variants, largest orders, multiple currencies, refunds, subscriptions, multiple addresses, special characters, languages, oldest records, and newest deltas. All P0/P1 differences reach zero before cutover; lower-risk exceptions need sign-off and remediation.
Write a minute-by-minute cutover runbook
The runbook covers change freeze, final backup, DNS/CDN, final delta, domain, certificates, payment, webhooks, queues, robots, password page, monitoring, cache, first order, SEO, and communications. Every step names an owner, expected time, evidence, successor, and failure branch. Operators should not invent the process overnight.
Quantify stop conditions: object differences, payment failure, missing orders, stock variance, critical template errors, performance, error rate, or important URL routing. Business owners approve these thresholds before the window.
Rollback is more than returning DNS to Magento
If Shopify has accepted orders or customer writes, rollback must reconcile new records, payment callbacks, inventory reservations, fulfillment, emails, analytics, and service. Define the compensation order before Magento becomes writable again and rehearse it once. A document that cannot be executed is not recovery capability.
Operate a 72-hour and 30-day stabilization period
For the first 72 hours, closely monitor status codes, 404s, payment, checkout, inventory, webhooks, queues, page performance, search, service tickets, and conversion. Reconcile order count and amount, refunds, stock, customers, and critical integrations daily. For 30 days, track crawl, indexing, ranking, organic sessions, landing-page conversion, and redirect hits.
Do not immediately destroy Magento. Retain an encrypted read-only archive according to service, finance, and statutory needs; remove public and write access, rotate secrets, stop cron and integration writes, and record final retirement. WESWOO's migration implementation services and Shopify store setup guides can help structure work, but acceptance must come from the merchant's own data and replay.
A 30/60/90-day migration route
In the first 30 days, quantify current state and target plan, then complete object, URL, and extension registers, field mapping, knockout conditions, and difficult samples. In days 31–60, build content, product, customer, and order prototypes; replace integrations; run the first full load and SEO diff. In days 61–90, run the second full load and delta, performance, security, transaction, rollback, and cutover exercises, then lock stabilization and retirement.
This is an evidence sequence rather than a promise of fixed duration. Data volume, extensions, markets, B2B, and regulation change timing. The invariant is that each stage is replayable and no unknown is mislabeled as a post-launch optimization.
Frequently asked questions
How much downtime does a Magento-to-Shopify migration require?
It depends on final delta, DNS, payment, and inventory cutover rather than the size of the earlier full load. Preloading and rehearsed deltas can shrink the window, but a “zero downtime” claim must be proved against write conflicts, orders, and stock.
Can Magento customer passwords move directly to Shopify?
Do not assume password hashes are compatible across platforms. Design account invitation or secure reset, validate identity and support flow, control sending, and protect customers from phishing instead of exporting or handling plaintext passwords.
Should every historical order be imported into Shopify?
Not always. Let service, finance, regulation, subscriptions, and returns determine what belongs in Shopify, a warehouse, or a read-only archive. Wherever it lives, history must be searchable, reconcilable, and connected to customers and products.
How can a migration protect SEO?
Create a complete legacy URL register, give every valuable path one relevant one-hop 301, preserve content and metadata, validate canonical, hreflang, schema, robots, and sitemaps, then monitor crawl, index, ranking, and organic conversion after launch.
When should a cutover be postponed?
Postpone when critical objects or amounts do not reconcile, payment or stock replay fails, P0/P1 differences remain, important URLs lack mappings, the team cannot execute rollback, or business owners have not approved stop thresholds.