Skip to main content

Magento to Shopify Migration: Mapping Your Catalog Field by Field

Move a Magento 2 catalog to Shopify: exports, metafield types, configurable products as variant rows, store views, tier prices, redirects and cleanup.

Magento to Shopify Migration: Mapping Your Catalog Field by Field

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

  1. 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.
  2. Export. Pull the Products and Advanced Pricing entities, all store views, and the full list of URLs that receive traffic.
  3. 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.
  4. 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.
  5. Import as drafts and check. Load products with Status set to draft, compare counts and spot-check variants, prices, images and translations against Magento.
  6. 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 FieldmaterialMetafield: single line textDirect
Text Area or Page Buildercare_instructionsMetafield: multi-line text, or the Description fieldClean HTML first
DropdownfitMetafield: single line text with a choices list of up to 128 valuesDirect
Multiple SelectactivityMetafield: list of metaobject references, or tagsRemodel
Yes/Nois_veganMetafield: true or falseDirect
Datelaunch_dateMetafield: dateDirect
PricemsrpMetafield: money, or Compare-at priceDecide meaning
Visual or Text Swatch (configurable)color, sizeProduct option, optionally linked to a category metafieldRemodel
Weight (system attribute)weightWeight value (grams) per variantConvert units
Media Imagelabel_imageProduct media or a file metafield set outside the CSVRebuild
Fixed Product TaxweeeNo product field; Shopify tax settingsRebuild
Showing 11 of 11 rows
Most input types map to a metafield type the CSV import supports; the rows marked Rebuild need settings or apps rather than a column.

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-teeMerino T-shirtColorNavySizeMMS-TEE-NAV-M49.00gtin:9506000134352
merino-teeColorNavySizeLMS-TEE-NAV-L49.00gtin:(EAN of child)
merino-teeColorSandSizeMMS-TEE-SND-M49.00gtin:(EAN of child)
merino-teeColorSandSizeLMS-TEE-SND-L49.00gtin:(EAN of child)
Illustrative values. Product-level columns are filled on the first row only; every row carries the variant's own SKU, price and barcode from its Magento 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.
Choosing which attributes distinguish variants before export; these become the option names and values on the Shopify product.

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

0 of 9 done0%

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.

One Shopify connection handles both import and export, with a primary locale setting that decides which language goes to the store default.

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.

Diego Nijboer

CTO and Co-Founder at WISEPIM, building AI-powered solutions that transform product data management for e-commerce businesses. Over 10 years of experience solving complex technical challenges in e-commerce and PIM systems.

Frequently asked questions

Still have questions?

Can't find the answer you're looking for? Please get in touch with our team.

Contact Support

It depends on catalog complexity more than product count. A store with a few hundred simple and configurable products, one language and no B2B pricing can move its catalog in a few weeks. Several store views, many attribute sets, bundles, customer-group pricing and thousands of URLs to redirect stretch that to months. Budget the most time for cleanup and testing, not for the import itself.

No. The two formats differ: Magento exports one row per product per store view with custom attributes packed into one column, while Shopify expects one row per variant with option columns and metafield columns. You need to split, reshape and rename the data first, either in a spreadsheet, with a migration app, or by passing it through a PIM that connects to both platforms.

Shopify's customer import documentation says passwords encrypted outside Shopify cannot be migrated with a CSV file. You can import customer records such as names, emails and addresses, but each customer then needs an invitation to create a new password before they can sign in. Plan that invitation email for launch day and tell customers in advance. It sits outside the catalog work but affects the launch plan.

A migration app is fastest when the catalog maps cleanly: it connects to both stores, moves products and often customers and orders, and usually offers a test run first. CSV files give you full control over how attributes become metafields and how configurable products become variants, at the cost of spreadsheet work. Large or multilingual catalogs often combine the two, or pass the products through a PIM.

Shopify has no native grouped product type, and bundles need Shopify's bundles feature or an app. A grouped product is usually rebuilt as its separate products plus a collection or a product reference metafield. Decide per product before the import, because these items do not fit the one-row-per-variant CSV model and are easy to lose.

Keep exploring

Hand-picked next steps to go deeper.

Better product data, better results.Get more sales.

4.7