A Magento to Shopify migration moves your catalog from a template-based model (attribute sets, configurable parents with simple children, store views) into Shopify's flatter one (products with up to three options, metafields, languages and markets). For the catalog, the work comes down to six jobs: export products, prices and every store view from Magento; turn attribute sets into metafield definitions; rewrite each configurable product as one Shopify product with variant rows; load translations per language; rebuild customer-group tier prices as B2B catalogs; and map every old URL to its new one with a redirect.
This guide covers that catalog work field by field, for Magento 2 Open Source and Adobe Commerce. It assumes the platform decision is made. If it is not, our Shopify vs Magento comparison weighs costs, B2B and the variant model first. Customers, orders, themes and apps are separate workstreams and only come up where they touch product data.
Six phases of a Magento 2 to Shopify catalog move
- Freeze and inventory. Stop creating new attributes in Magento, then list every attribute set, every attribute with its input type and scope, every configurable attribute, and the store views that hold translations.
- Export. Pull the Products and Advanced Pricing entities, all store views, and the full list of URLs that receive traffic.
- Clean and reshape. Remove dead products and unused attributes, split the packed attribute column into fields, and turn configurable parents and children into variant rows.
- Build the Shopify side first. Create metafield definitions, publish languages, set up markets and B2B catalogs before the first product import, so the import has somewhere to land.
- Import as drafts and check. Load products with Status set to draft, compare counts and spot-check variants, prices, images and translations against Magento.
- Redirect and launch. Import the redirect file, switch the domain, then crawl the old URL list and fix every 404.
Phases 2 to 5 run through one of three routes. A migration app from the Shopify App Store connects to both stores and usually lets you run a test migration first; most also offer customers and orders. A manual route exports CSV files and reshapes them in a spreadsheet. A PIM in between imports from Magento and exports to Shopify. The mapping decisions in the rest of this guide are the same on every route; the CSV and PIM routes give you the most control over them.
Exporting Products, Advanced Pricing and every store view from Magento
Magento's built-in export lives under System > Data Transfer > Export. Adobe's export documentation lists the entity types, and two matter for the catalog: Products and Advanced Pricing. Tier prices are not in the product file; they come out of the Advanced Pricing entity. The export runs through the message queue, so cron has to be running, and the file lands in `var/export` (or the remote storage folder if that module is on).
The product file has one row per product for the default scope plus extra rows per store view where values differ, marked by `store_view_code`. Keep those rows. They hold your translated names, descriptions, meta fields and URL keys. Other columns to watch:
- `product_type` separates simple, configurable, bundle, grouped, virtual and downloadable products. Each type needs its own treatment on Shopify.
- `configurable_variations` on the parent row lists each child SKU with its option values, for example `sku=MS-TEE-NAV-M,color=Navy,size=M|sku=MS-TEE-NAV-L,color=Navy,size=L`.
- `additional_attributes` packs every custom attribute into one cell as `code=value` pairs. Split it into columns before you do anything else.
- `url_key` is the last part of the product URL. With a URL suffix such as `.html` and the Use Categories Path for Product URLs setting on, Adobe shows that one product can answer on several URLs.
- `base_image`, `small_image`, `thumbnail_image` and `additional_images` reference files under `pub/media`. Shopify needs publicly reachable image URLs, so check the export resolves them from a live domain.
For the URL list, combine three sources: the URL Rewrites grid under Marketing > SEO & Search > URL Rewrites, your Search Console pages report, and a crawl of the live store. Rewrites tell you what Magento can serve; Search Console and analytics tell you which URLs actually earn traffic and links.
Attribute sets become metafield definitions: building Shopify's schema before import
Shopify has no attribute sets. Every custom field becomes a metafield definition on the product (or variant) with a namespace, key and type, and every product shows the same definitions. Create them before the first import: Shopify's product CSV reads metafield columns in the format `product.metafields.custom.material`, but only for definitions that already exist, and it does not support variant metafields at all. Our Shopify metafields guide covers namespaces and types in depth.
The type you choose decides whether values survive the import. Map each Magento input type deliberately:
Magento attribute input types and their Shopify targets
| Text Field | material | Metafield: single line text | Direct |
|---|---|---|---|
| Text Area or Page Builder | care_instructions | Metafield: multi-line text, or the Description field | Clean HTML first |
| Dropdown | fit | Metafield: single line text with a choices list of up to 128 values | Direct |
| Multiple Select | activity | Metafield: list of metaobject references, or tags | Remodel |
| Yes/No | is_vegan | Metafield: true or false | Direct |
| Date | launch_date | Metafield: date | Direct |
| Price | msrp | Metafield: money, or Compare-at price | Decide meaning |
| Visual or Text Swatch (configurable) | color, size | Product option, optionally linked to a category metafield | Remodel |
| Weight (system attribute) | weight | Weight value (grams) per variant | Convert units |
| Media Image | label_image | Product media or a file metafield set outside the CSV | Rebuild |
| Fixed Product Tax | weee | No product field; Shopify tax settings | Rebuild |
Two habits keep the schema clean. Prefix definitions by family when an attribute only makes sense for one product family (`custom.bike_frame_size` rather than `custom.size`), because Shopify will show it on every product. And drop attributes nobody fills: if `additional_attributes` shows a field on fewer than a handful of products, ask whether it should exist on Shopify at all.
Rewriting a configurable T-shirt as Shopify variant rows
Take a configurable T-shirt `MS-TEE` with two configurable attributes, color and size, and four child simples. In Magento that is five products: one parent with the description and images, and four children with their own SKU, price, stock, weight and EAN. On Shopify it becomes one product with two options and four variants. Shopify allows three options and 2,048 variants per product, so this shirt fits easily.
One Magento configurable product as Shopify CSV rows
| merino-tee | Merino T-shirt | Color | Navy | Size | M | MS-TEE-NAV-M | 49.00 | gtin:9506000134352 |
| merino-tee | Color | Navy | Size | L | MS-TEE-NAV-L | 49.00 | gtin:(EAN of child) | |
| merino-tee | Color | Sand | Size | M | MS-TEE-SND-M | 49.00 | gtin:(EAN of child) | |
| merino-tee | Color | Sand | Size | L | MS-TEE-SND-L | 49.00 | gtin:(EAN of child) |
Details that decide whether this works:
- The handle comes from the parent's `url_key`, not from the title, so the old and new URLs stay recognizably the same.
- Child data moves to variant columns. EAN goes into Barcodes with a type prefix (`gtin:` or `upc:`; the column takes up to 20 values), weight into Weight value (grams), and the child's image into Variant image URL.
- Child attributes that are not options (a per-size inseam, a per-color pattern code) have no CSV column, because variant metafields are not supported in CSV. Load them through the variant bulk editor, the Admin API or an app.
- Four or more configurable attributes need merging two into one option, splitting the product, or an app. The Shopify variant limit post walks through each route.
- Simple products without a parent get one row with Option1 name `Title` and Option1 value `Default Title`, Shopify's convention for products without options.
Store views to Shopify languages and markets
A Magento store view with Dutch or French content becomes a published language on Shopify. Shopify's languages documentation says each published language gets its own URLs and that translations can come from Translate & Adapt, from CSV files or from a translation app. Handles translate too: Shopify's multi-language requirements show `/en-ca/products/shoes` becoming `/es-mx/products/zapatos`, with only the word `products` fixed, so each store view's `url_key` can carry over as the translated handle. On the CSV route, the translations CSV is exported from Settings > Languages once the products exist, and it identifies each product by its Shopify resource ID, not by SKU. Match the Magento `store_view_code` rows to those IDs by handle or SKU, then fill the Translated content column with names, descriptions and SEO fields.
Prices split differently. Magento can scope prices per website; Shopify handles country pricing through markets, with percentage adjustments or fixed prices per market (the product CSV has a Price / International column for a market named International). A Magento setup with a Dutch website in EUR and a UK website in GBP becomes one Shopify store with two markets. Our Shopify Markets post covers that setup.
Customer-group tier prices rebuilt as B2B catalogs
In Magento, tier prices are rows on each product's Advanced Pricing: a website, a customer group (or a shared catalog on Adobe Commerce B2B), a quantity, and either a fixed price or a percentage discount. A wholesaler might have "Retailer" at 10% off from 12 units and "Distributor" at a fixed EUR 31.50 from 48 units.
Shopify's equivalent is the B2B catalog. Per Shopify's B2B catalog documentation, a catalog sets which products and prices a company sees; Basic, Grow and Advanced allow up to three active catalogs across all B2B markets, while Plus allows unlimited catalogs and direct assignment to companies and locations. Inside a catalog, volume pricing adds up to 10 price breaks per product, and quantity rules set minimums, maximums and order increments per variant.
- One customer group, one catalog is the clean mapping. Count your groups first: more than three means Plus or consolidation.
- Percentage tiers translate to a catalog percentage adjustment plus volume price breaks; fixed tiers become fixed catalog prices.
- Tier prices for retail shoppers (the NOT LOGGED IN or General group) have no B2B catalog home. Rebuild them as discounts or with an app.
- Shared catalogs and negotiated quotes from Adobe Commerce B2B need the most care; inventory them per company before deciding.
A redirect map from .html URL keys to /products/ handles
Every Magento URL that ranks or has backlinks needs a 301 to its Shopify successor. Shopify does this with URL redirects under Content > Menus, and you can import them as a CSV with Redirect from and Redirect to columns. The URL redirect documentation sets the rules that shape the map:
- Limits: up to 100,000 redirects, or 20,000,000 on Plus.
- Only broken URLs redirect. A redirect fires only when the old path returns a 404 on Shopify, which is the normal case for Magento paths after the domain moves.
- Reserved paths such as `/apps`, `/cart` and `/collections/all` cannot be redirected.
- Language subfolders: one redirect applies to every market subfolder by default, but localized Magento URLs need their own row per language if the old path differed.
- `.html` quirk: Shopify treats a URL with and without `.html` as the same, so you cannot redirect `/size-guide.html` to `/size-guide`. Point it at `/pages/size-guide` instead.
Build the map from the URL list exported earlier: product URLs (`/merino-tee.html`, `/men/tops/merino-tee.html`) to `/products/merino-tee`, category URLs to `/collections/<handle>`, CMS pages to `/pages/<handle>`. Products you merged or retired go to the closest collection, not to the home page. WISEPIM does not create or manage redirects, so this file is built by your team, agency or migration app. The Magento SEO guide covers the URL settings on the Magento side that produce these paths.
Catalog cleanup to finish before the final export
Every problem you leave in Magento gets imported, translated and redirected. These checks pay off most when done before the last export, not after launch.
Magento catalog cleanup before moving to Shopify
The same discipline applies to other replatforming routes. A store leaving WooCommerce faces the same variant and metafield questions with a simpler source model, covered in WooCommerce vs Shopify.
Running the catalog through a PIM between Magento and Shopify
A migration is a good moment to take the product data out of the storefront altogether. WISEPIM connects to both platforms: the Magento 2 connection imports products, categories and configurable links, and the Shopify connection exports products by SKU with variants as options, metafields, and translated titles and descriptions per locale. In between, you can clean attributes, group products into families, translate missing store views with AI and check required fields with Quality Guard before anything reaches Shopify.
Two limits to plan around: WISEPIM does not move customers, orders or redirects, and it does not convert Magento attribute sets into product families automatically. If you are also replacing an older PIM during the move, the PIM migration page describes how teams bring that data over.

