How to migrate from Magento to Shopify, step by step
Magento is the one migration where the data model, not the export, is the hard part: EAV attributes, configurable and bundle products, multi-store views and tier pricing all have to be re-modelled for a flatter platform. Shopify publishes no Magento importer and no Magento guide — this is the sequence that works, cited throughout.
Written for someone doing this themselves. Every step links to the documentation it came from, so you can check it rather than trust us. If you would rather not do it, we will quote it.
The checklist
Every step, in the order it has to happen.
Before you touch anything2
Admin footer version · bin/magento module:status · Stores → All Stores
Watch out: Adobe Commerce B2B is a separately licensed extension. If the store uses negotiable quotes or shared catalogs, budget a rebuild rather than a migration.
Magento: Stores → Attributes → Product · Shopify: Settings → Custom data
Watch out: Only global-scope dropdown or swatch attributes can drive a configurable — those are your option candidates. Everything else becomes a metafield.
Get your data out3
System → Data Transfer → Export → Entity Type
Watch out: There is no order, category or CMS entity type in this dropdown. The export is asynchronous, so cron and queue consumers must be running or the file never appears.
REST integration token, or MySQL on the Magento database
Watch out: Magento 2.4 forces two-factor auth on the admin API, so the token call needs an OTP — create an integration token instead of scripting admin credentials.
SQL on url_rewrite · cross-check in Marketing → SEO & Search → URL Rewrites
Watch out: If “Use Categories Path for Product URLs” was ever on, one product has many live paths. Export all of them or you lose most of your inbound links.
Build in parallel6
Shopify admin → Apps
Watch out: Shopify’s first-party Store Migration app does not support Magento, and there is no Magento guide on the help centre — do not scope a project around a first-party importer that does not exist.
Shopify admin → Products
Watch out: Bundle, grouped and partly virtual products have no Shopify type at all — pull them out of the bulk import and handle them deliberately.
Products → Import · Customers → Import · orders via app or API
Watch out: Orders cannot be imported by CSV at all, and product/customer files cap at 15 MB. Turn off order notifications before any historical order import.
Products → Catalogs · Discounts
Watch out: Shopify caps active automatic discounts at 25 including app-based ones, and only Plus stores may install custom apps containing Functions.
Customers → Companies · Products → Catalogs
Watch out: B2B is incompatible with Shop Pay and other accelerated checkouts, subscriptions, local delivery, tipping and legacy customer accounts. Below Plus you get three catalogs.
Shopify Partner dashboard → Stores → Add development store
Watch out: Order creation is heavily throttled on development stores, so a dry run there will not tell you how long the real import takes.
Keep your rankings1
Content → Menus → URL redirects → Import
Watch out: Shopify only redirects URLs that genuinely 404, and reserved paths cannot be sources. Resolve legacy redirect chains to a single hop rather than importing the chain.
Cut over1
DNS host · Shopify → Settings → Domains
Watch out: Only one A record and one www CNAME may point at Shopify — remove the Magento ones. Allow up to 48 hours for full propagation.
After the switch1
Hosting control panel or Adobe Commerce Cloud project
Watch out: An unpatched public Magento still serving a payment page is the worst possible post-migration outcome — treat it as a live security finding until it is gone.
What does not come with you
Every migration guide that promises everything moves is selling something. These are the things that genuinely do not, and what to do instead.
Bundle products
Shopify has no bundle type with per-option quantity, customer-chosen selections and dynamic pricing.
Instead: Rebuild as fixed bundles with the Shopify Bundles app, as a cart-transform Function (custom Functions apps need Plus), or explode into discrete products.
Grouped products
No Shopify type presents several independently purchasable products with their own quantity boxes on one page.
Instead: Combined Listings is the nearest native answer but is Plus/enterprise only — otherwise use a collection page or a theme section.
More than three variant axes
Shopify permits 2,048 variants but still only three options per product, while Magento configurables have no axis limit.
Instead: Split into several products, or move the least inventory-relevant axis to a line-item property and accept the loss of SKU-level tracking.
Customer passwords
Hashes are not portable into Shopify.
Instead: Import customers with a migration tag and stage a password-reset campaign timed to the DNS change.
Orders by CSV
Shopify’s CSV tooling is export-only for orders.
Instead: Matrixify or the order API. Note that imported financial status is cosmetic — no transactions or refunds are created.
Negotiable quotes and requisition lists
These are licensed Adobe Commerce B2B features with no Shopify counterpart.
Instead: Draft orders with PO numbers plus a quoting app cover part of it; multi-round negotiation on the order object does not exist.
One-step and customised checkout
Shopify’s checkout is not merchant-editable, and checkout UI extensions are Plus-only.
Instead: Move logic into Shopify Functions, and accept Shopify’s checkout — it is already near-single-page for Shop Pay users.
Multi-website with separate admins
Shopify Markets varies currency, language, pricing and domain within one store — it does not give you separate admins.
Instead: Model as Markets, or run separate Shopify stores and accept duplicated catalogue management.
Variant-level metafields via CSV
Shopify’s product CSV does not support variant metafields.
Instead: Use the GraphQL Admin API or Matrixify for those fields.
Your URLs, mapped.
Magento and Shopify disagree about URL shapes, so every old address needs a 301 to its new home. This is the mapping.
| Magento | Shopify | Note |
|---|---|---|
| /linen-throw.html | /products/linen-throw | The base case: strip the suffix, prefix /products/. |
| /home/bedding/throws/linen-throw.html | /products/linen-throw | Category-path product URLs. One product can have dozens — every one needs its own row. |
| /home/bedding.html | /collections/bedding | Shopify collections do not nest, so deep Magento trees flatten and handles can collide. |
| /catalog/product/view/id/123 | /products/linen-throw | Non-rewritten internal paths are still indexed on many stores — resolve the id back to a handle. |
| /about-us | /pages/about-us | |
| /home/bedding.html?color=blue | /collections/bedding | Shopify redirects match on path only; layered-navigation query strings are not matched. |
| /catalogsearch/result/?q=throw | /search | The path redirects but the search term is lost. |
| /de/home/bedding.html | /de/collections/bedding | Store-view prefixes must map onto a Markets subfolder or a separate domain — generate rows per store id. |
| /media/catalog/product/cache/…/throw.jpg | (no equivalent) | Image URLs move to Shopify’s CDN with unpredictable paths; there is no redirect route. |
Your extensions, matched.
- Amasty Layered NavigationShopify Search & Discovery
Native filters cap at 25 per store and switch off entirely on collections over 5,000 products — large catalogues need Globo, Boost or Searchanise.
- Mirasvit Advanced SearchAlgolia / Klevu
Algolia is the closest Elasticsearch replacement but is usage-billed; native search has no comparable synonym depth.
- Mageplaza / Magefan BlogShopify blogs (native)
Shopify blogs have tags but no categories, so a Magefan category tree must be flattened.
- Amasty / Mirasvit SEO SuiteNative SEO + an SEO app
No single app matches a full Amasty or Mirasvit SEO suite — expect to combine native features with one app.
- Xtento / Wyomind feedsDataFeedWatch / Simprosys
Shopify’s native export is fixed-schema and manual — no custom mapping, scheduling or FTP delivery.
- One Step CheckoutNo equivalent
Checkout is not merchant-editable; checkout UI extensions are Plus-only. There is no true equivalent.
- Adobe Commerce B2BShopify B2B (native)
Now on all plans, but capped at 3 active catalogs below Plus, and incompatible with Shop Pay, subscriptions and tipping.
- Negotiable quotesQuote apps / draft orders
Apps produce a quote request, not the multi-round negotiation Adobe puts on the order object.
- Amasty / Aheadworks Reward PointsSmile.io / LoyaltyLion
Genuinely stronger on Shopify — but all are priced on order volume, so model the real cost.
- MageWorx Advanced Product OptionsProduct options apps
Options become line-item properties, not variants — no per-option SKU, inventory or reporting. A structural downgrade.
- Magento attribute sets / PIMMetafields + metaobjects
The honest native answer for most catalogues, but there is no Shopify-native PIM with workflow or approvals.
What goes wrong.
Half the catalogue’s SEO URLs vanish
Why: Only live product rows were exported, missing category-path duplicates and legacy 301 rows in the url_rewrite table.
Avoid it: Dump the whole table for every store id, resolve redirect chains to a single hop, and reconcile against Search Console’s indexed-page count.
Bundle and grouped products arrive broken
Why: Shopify has no equivalent type, so importers fall back to a bare parent SKU with no children.
Avoid it: Extract bundle and grouped SKUs by SQL up front, decide the target model per product, and exclude them from the bulk import.
Configurable products silently lose an axis
Why: Magento allows unlimited configurable axes; Shopify allows exactly three options.
Avoid it: Count the configurable attributes per parent before you start, and decide splits during mapping rather than mid-import.
The import stalls partway through a big catalogue
Why: Stores holding very large variant counts are rate-limited to roughly 10,000 new variants a day below Plus.
Avoid it: Count total target variants early — if you are near the threshold, price in Plus or schedule the import across weeks.
Every customer is locked out on launch day
Why: Passwords cannot be migrated from any platform.
Avoid it: Import customers with a migration tag, stage a reset email before DNS moves, and watch account-recovery volume for 72 hours.
Historical orders look paid but no money exists
Why: Imported order financial status is display-only — no transactions or refunds are created behind it.
Avoid it: Decide explicitly that orders are for display, brief finance that Shopify will not reconcile to Magento, and keep Magento readable for the audit trail.
Promotions cannot all be recreated
Why: Shopify caps active automatic discounts at 25 including app-based ones, and custom Functions apps require Plus.
Avoid it: Audit active catalog and cart price rules before quoting; consolidate under 25 or scope Plus.
An abandoned Magento becomes a live security liability
Why: “Keep it up just in case” leaves an unpatched storefront on a public domain, still serving a payment page.
Avoid it: Move Magento to a non-public hostname behind IP restriction on cutover day and set a calendared destroy date.
Or hand the whole list to someone who has done it.
Send your store URL and you get back a fixed price and a plan for your store specifically: SKU count, which extensions have Shopify equivalents, the redirect plan, and the risks we can see.
Get my free migration plan