appbespoke

Every step cited to the vendor’s own docs

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.

Start the checklist

14 steps · Plan on 60-150 hours, or a specialist

  • 14

    steps, in the order they have to happen

  • 55

    hours of hands-on work for a mid-sized store

  • 9

    things that do not come with you

  • 9

    URL shapes that need a 301

Phase 01 · 10 h

Before you touch anything

  1. 2 hAdobe Commerce docs

    Record edition, version and store structure

    Note the edition (Open Source or Adobe Commerce), the exact 2.4.x patch level, every installed extension, and the website/store/store-view count. Support status drives urgency, and Adobe-only modules have neither an Open Source nor a Shopify equivalent.

    Where

    Admin footer version · bin/magento module:status · Stores → All Stores

    The catch

    Adobe Commerce B2B is a separately licensed extension. If the store uses negotiable quotes or shared catalogs, budget a rebuild rather than a migration.

    Adobe Commerce docs ↗

  2. 8 hAdobe Commerce docs

    Map EAV attributes to options and metafields

    Decide, per attribute, whether it becomes one of Shopify’s three variant options, a metafield, a tag, or is dropped. This mapping is the migration: get it wrong and every later step compounds the error.

    Where

    Magento: Stores → Attributes → Product · Shopify: Settings → Custom data

    The catch

    Only global-scope dropdown or swatch attributes can drive a configurable: those are your option candidates. Everything else becomes a metafield.

    Adobe Commerce docs ↗ · Shopify docs ↗

Phase 02 · 6 h

Get your data out

  1. 1 hAdobe Commerce docs

    Run the native export for products and customers

    Use the built-in exporter for the entity types it actually supports: products, advanced pricing, customers, customer addresses and stock sources. Output lands in var/export as CSV.

    Where

    System → Data Transfer → Export → Entity Type

    The catch

    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.

    Adobe Commerce docs ↗

  2. 4 hAdobe developer docs

    Pull orders, categories and CMS via API or SQL

    Everything the native exporter omits comes out through the REST API with searchCriteria paging, or a direct database dump. Orders in particular have no admin export path.

    Where

    REST integration token, or MySQL on the Magento database

    The catch

    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.

    Adobe developer docs ↗

  3. 1 hAdobe Commerce docs

    Dump the url_rewrite table first

    Every live SEO URL and every historical redirect sits in one table. Rows with redirect type 0 are the live canonical URLs; 301 and 302 rows are legacy paths already redirecting. You need both, for every store id.

    Where

    SQL on url_rewrite · cross-check in Marketing → SEO & Search → URL Rewrites

    The catch

    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.

    Adobe Commerce docs ↗

Phase 03 · 32 h

Build in parallel

  1. 1 hShopify docs

    Choose the import route deliberately

    The real options are native CSV for simple products, Matrixify, a migration service, or a custom build on the GraphQL Admin API. For a complex catalogue the API route is usually the only one that survives contact with bundles and configurables.

    Where

    Shopify admin → Apps

    The catch

    Shopify’s first-party Store Migration app does not support Magento, and there is no Magento guide on the help centre, so do not scope a project around a first-party importer that does not exist.

    Shopify docs ↗

  2. 10 hShopify docs

    Flatten configurables into products and variants

    A configurable parent plus its simple children collapses into one Shopify product with variants; child SKUs become variant SKUs. Anything with more than three axes needs a decision made in advance.

    Where

    Shopify admin → Products

    The catch

    Bundle, grouped and partly virtual products have no Shopify type at all, so pull them out of the bulk import and handle them deliberately.

    Shopify docs ↗

  3. 4 hShopify docs

    Import products, then customers, then orders

    Shopify requires this order so orders bind to existing product and customer records. Reconcile counts at each stage against the baseline you took at export.

    Where

    Products → Import · Customers → Import · orders via app or API

    The catch

    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.

    Shopify docs ↗ · Shopify docs ↗

  4. 4 hShopify docs

    Rebuild tier prices and price rules

    Advanced Pricing maps to B2B catalogs with volume pricing; catalog price rules become automatic discounts or Functions; cart price rules become discount codes. A store with dozens of rules needs consolidating first.

    Where

    Products → Catalogs · Discounts

    The catch

    Shopify caps active automatic discounts at 25 including app-based ones, and only Plus stores may install custom apps containing Functions.

    Shopify docs ↗

  5. 5 hShopify docs

    Configure B2B if you sell wholesale

    Company profiles, payment terms and volume pricing are now available beyond Plus. Model companies and locations, then attach catalogs, and check the incompatibilities before promising parity.

    Where

    Customers → Companies · Products → Catalogs

    The catch

    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 docs ↗

  6. 8 hShopify developer docs

    Rehearse on a development store and reconcile

    Run the full import into a dev store and diff every count: products, variants, customers, orders, redirects, collection membership. Fix the mapping and re-run clean rather than patching in place.

    Where

    Shopify Partner dashboard → Stores → Add development store

    The catch

    Order creation is heavily throttled on development stores, so a dry run there will not tell you how long the real import takes.

    Shopify developer docs ↗

Phase 04 · 4 h

Keep your rankings

  1. 4 hShopify docs

    Convert url_rewrite rows into Shopify redirects

    Transform the dumped rewrites into a two-column CSV and bulk-import. Include the category-path duplicates and the legacy 301 sources, each pointing directly at its final destination.

    Where

    Content → Menus → URL redirects → Import

    The catch

    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.

    Shopify docs ↗

Phase 05 · 1 h

Cut over

  1. 1 hShopify docs

    Lower TTL, then point DNS at Shopify

    Drop the TTL on the apex and www records a day or two before cutover so the switch propagates in minutes, then point them at Shopify and let TLS provision automatically.

    Where

    DNS host · Shopify → Settings → Domains

    The catch

    Only one A record and one www CNAME may point at Shopify, so remove the Magento ones. Allow up to 48 hours for full propagation.

    Shopify docs ↗

Phase 06 · 2 h

After the switch

  1. 2 hAdobe Commerce docs

    Keep Magento read-only, then destroy it

    Hold it up for 30-90 days behind a non-public hostname for order lookup and accounting reconciliation. Take it off public DNS on cutover day, restrict by IP, and set a hard destroy date with an owner.

    Where

    Hosting control panel or Adobe Commerce Cloud project

    The catch

    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.

    Adobe Commerce docs ↗

What does not come with you

Be wary of any guide that says everything moves. These are the things that do not, and what to do about each one.

  • 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, which 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.

MagentoShopify
/linen-throw.html/products/linen-throw
/home/bedding/throws/linen-throw.html/products/linen-throw
/home/bedding.html/collections/bedding
/catalog/product/view/id/123/products/linen-throw
/about-us/pages/about-us
/home/bedding.html?color=blue/collections/bedding
/catalogsearch/result/?q=throw/search
/de/home/bedding.html/de/collections/bedding
/media/catalog/product/cache/…/throw.jpg(no equivalent)

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, so 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, so 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.

What catches people on a Magento move, why each one happens, and how to get ahead of it.

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