Magento to Shopify Migration: How to Move Your Product Catalog

Magento to Shopify Migration: How to Move Your Product Catalog

Magento to Shopify migration: product catalog data, SKUs, variants, prices, and inventory being transferred between e-commerce platforms.
Magento to Shopify migration: product catalog data, SKUs, variants, prices, and inventory being transferred between e-commerce platforms.

Most Magento to Shopify migration guides try to cover everything at once: orders, customers, themes, apps, payment gateways, DNS. That is useful for scoping a project, but it hides the part that usually takes the longest and breaks most often — the product catalog.

Products are where the two platforms differ most. Magento stores product data in a flexible attribute system with configurable products, attribute sets and store views. Shopify uses a simpler model: a product, up to three options, and a list of variants. Every SKU you migrate has to be translated from one model to the other, and every shortcut taken here shows up later as missing variants, broken filters or lost rankings.

This guide focuses only on the product side of a migration: how Magento data maps to Shopify, how to get it out cleanly, how to build an import-ready file, and how to check the result. Orders, customers and redirects for non-product pages are normally handled by your developer or migration agency, and we will point out where the two workstreams meet.

If you would rather receive a ready-to-import file than build one, that is exactly what catalog import for e-commerce is for.

What "Moving the Product Catalog" Actually Includes

Before you choose a tool to migrate Magento to Shopify, agree on what "the catalog" means for your store. For a typical Magento to Shopify product migration, the scope looks like this:

Included in catalog migration

Usually handled separately

Product titles, descriptions, short descriptions

Customer accounts and passwords

SKUs, barcodes (GTIN/EAN/UPC), MPNs

Order history and invoices

Configurable products and their variants

Gift cards and store credit

Attributes and specifications

CMS pages and blog posts

Categories and their hierarchy

Theme, design and custom functionality

Prices, special prices, compare-at prices

Payment, shipping and tax configuration

Stock quantities and availability

Third-party extensions and integrations

Product images and alt texts


URL keys, meta titles and meta descriptions


Product and category URL redirects


Writing this list down early matters because teams often discover halfway through that nobody owned, for example, image alt texts or tier prices. When you migrate products from Magento to Shopify, everything in the left column should have an owner, a source field and a target field.

Magento vs Shopify: How Product Data Maps

This is the part most guides skip, and it is where most problems start. Magento and Shopify describe the same product in different ways.

The core mapping

Magento 2

Shopify

What to watch

Simple product (visible)

Product with one default variant

Straightforward

Configurable product + child simples

Product + variants

Child simples become variants, not separate products

Configurable attributes (e.g. color, size)

Options (Option1–Option3)

Shopify allows a maximum of three options per product

Child product count

Variants

Up to 2,048 variants per product by default

Attribute sets and custom attributes

Metafields, product category attributes, tags

Decide which attributes need to be filterable

Categories (tree)

Collections (manual or smart) + tags or product type

Shopify has no native category tree for products

URL key (url_key)

Handle

Handles must be unique and URL-safe

special_price + price

Price + compare-at price

Sale logic needs to be flipped, not copied

Tier prices / customer group prices

B2B catalogs and price lists

Availability depends on your Shopify plan

Store views (languages, currencies)

Shopify Markets + translations

One product per store, not per store view

Grouped / bundle products

Separate products or a bundle app

No one-to-one equivalent

Downloadable products

Digital download app

Files are migrated separately

Three mapping decisions that cause the most rework

1. Configurable products with more than three attributes. Magento lets you build a configurable product on four or more attributes (say color, size, length and material). Shopify does not. You either merge two attributes into one option ("Size / Length"), split the product into several Shopify products, or move a non-selectable attribute into a metafield. Decide this per product type before export, not during import.

2. Categories versus collections. A Magento category tree like Men > Clothing > Jackets does not exist as a tree in Shopify. Common patterns are: one smart collection per leaf category driven by a tag (cat:men-jackets), a product type for the main grouping, and menus that recreate the hierarchy for navigation. Exporting the full category path for every product makes this step much easier.

3. Attributes that power filters. In Magento, filterable attributes drive layered navigation. In Shopify, filters (through Search & Discovery) read from options, product type, vendor, tags, and metafields. Any attribute that customers filter by — material, fit, compatibility — should become a metafield with a defined type, not a line of text inside the description.

For a deeper look at how structured product records and output formats are organized, see our guide to data structuring and output formats.

Pre-Migration Audit: A Magento to Shopify Migration Checklist

Migrating dirty data just moves the mess to a new platform. Run this checklist on the Magento catalog before you export anything:

  • Count what you have. Total products by type (simple, configurable, grouped, bundle, virtual, downloadable), enabled vs disabled, visible vs "Not Visible Individually".

  • Find duplicate and empty SKUs. Shopify does not enforce unique SKUs, but your inventory, feeds and ERP sync almost certainly need them.

  • Check configurable products against Shopify limits. Flag any product with more than three configurable attributes or more than 2,048 children.

  • Audit attributes. List every attribute in use, its fill rate and whether it is used for filtering. Drop attributes nobody uses.

  • Check images. Missing base images, broken file paths, placeholder images, images without alt text.

  • Review descriptions. Inline styles, Page Builder markup, widget shortcodes and absolute links to old Magento URLs.

  • Decide what not to migrate. Discontinued products with no traffic or backlinks are often better redirected than imported.

  • Export URLs and rankings. Pull all product and category URLs with their traffic and backlinks so you can prioritize redirects.

  • Freeze catalog changes for the final export window, or plan a delta import.

The audit often reveals thin product data: missing specifications, a single image, no barcode. Migration is a good moment to fix that rather than carry it over. Our article on product data enrichment for e-commerce catalogs explains where the missing data usually comes from.

Three Ways to Export Products from Magento

There are three practical ways to get product data out of Magento. Most stores end up combining two of them.

Option 1: Native Magento export

Magento 2 has a built-in export under System > Data Transfer > Export with the entity type set to Products. It produces a CSV with one row per product per store view, including columns such as sku, product_type, attribute_set_code, categories, name, description, url_key, price, special_price, base_image, additional_images, additional_attributes and configurable_variations.

It is free and complete for the default store view, but it is not Shopify-shaped:

  • custom attributes are packed into a single additional_attributes cell as comma-separated code=value pairs;

  • configurable products list their children in one cell (configurable_variations), separated by pipes;

  • image paths are relative to the Magento media folder (for example /m/b/mb01-blue-0.jpg), not full public URLs;

  • categories come as path strings that need to be converted into collections or tags;

  • tier and group prices come from a separate Advanced Pricing export.

All of this can be transformed with spreadsheets or scripts, but it takes time and testing. On Magento 1, which reached end of life in June 2020, export options are more limited, and older extensions often break on current hosting.

Option 2: Migration and import apps

Tools such as Cart2Cart and LitExtension connect to the Magento database and push data into Shopify, including orders and customers. Bulk import tools like Matrixify (often searched as matrixify shopify) work the other way: they import a well-structured file into Shopify very reliably, but they do not create that file from Magento data for you.

Migration apps are a good fit for a standard catalog with default attributes. They are weaker when the catalog has many custom attributes, heavy store-view overrides, or data that lives partly in extensions — the mapping options are generic, and fixing a failed run usually means re-running everything.

Option 3: Extracting from the live Magento storefront

The third option is to collect product data from the storefront itself — the pages customers actually see. This sounds unusual for your own store, but it solves real problems:

  • the admin is slow, broken or no longer accessible (common with outdated Magento 1 or heavily customized Magento 2 installs);

  • the storefront shows the final, rendered result: resolved variant combinations, full-size image URLs, the category path a customer sees;

  • you need to merge your catalog with products from supplier or brand sites during the same migration.

A Magento product scraper collects SKUs, identifiers, variants, attributes, images and prices into one normalized schema, which can then be output in Shopify's format. If you want to see how this works without writing code, read how to scrape product data without coding. The full list of supported fields is in the extraction capabilities section of the knowledge base.

Comparing the three methods


Native export

Migration / import apps

Storefront extraction

Needs admin or database access

Yes

Yes

No

Output is Shopify-ready

No, needs transformation

Yes, for standard data

Yes, when mapped to Shopify format

Handles custom attributes

Packed in one cell

Depends on the app

Yes, as configured fields

Image URLs

Relative paths

Usually handled

Full public URLs

Covers orders and customers

Separate exports

Often yes

No — products only

Works with supplier catalogs too

No

No

Yes

Best for

Technical teams with time

Standard catalogs

Complex, messy or inaccessible catalogs

Building a Shopify-Ready Product File (CSV or JSON)

Whatever the source, the target is the same: a file Shopify can import without errors. There are two common formats.

Shopify product CSV

Shopify's product CSV uses one row per variant and one row per additional image, linked by the product handle (labelled URL handle in the current template). Key columns include:

  • URL handle — the unique identifier that ties rows together and becomes the product URL;

  • Title, Description, Vendor, Type, Tags, Status;

  • Option1 name / Option1 value (and Option2, Option3);

  • SKU, Barcode, Price, Compare-at price, Inventory quantity;

  • Product image URL, Image position, Image alt text, Variant image URL;

  • SEO title, SEO description;

  • Metafields columns for structured attributes.

A configurable Magento T-shirt with two colors and two sizes becomes four variant rows:

csv

URL handle,Title,Vendor,Type,Tags,Option1 name,Option1 value,Option2 name,Option2 value,SKU,Price,Compare-at price,Inventory quantity,Product image URL,Image position
classic-cotton-tee,Classic Cotton Tee,Northline,T-Shirts,"cat:men-tshirts, cotton",Color,Navy,Size,M,NL-TEE-NAV-M,24.00,29.00,18,https://cdn.example.com/tee-navy-front.jpg,1
classic-cotton-tee,,,,,,Navy,,L,NL-TEE-NAV-L,24.00,29.00,11,https://cdn.example.com/tee-navy-back.jpg,2
classic-cotton-tee,,,,,,White,,M,NL-TEE-WHT-M,24.00,29.00,7,https://cdn.example.com/tee-white-front.jpg,3
classic-cotton-tee,,,,,,White,,L,NL-TEE-WHT-L,24.00,29.00,0,,
URL handle,Title,Vendor,Type,Tags,Option1 name,Option1 value,Option2 name,Option2 value,SKU,Price,Compare-at price,Inventory quantity,Product image URL,Image position
classic-cotton-tee,Classic Cotton Tee,Northline,T-Shirts,"cat:men-tshirts, cotton",Color,Navy,Size,M,NL-TEE-NAV-M,24.00,29.00,18,https://cdn.example.com/tee-navy-front.jpg,1
classic-cotton-tee,,,,,,Navy,,L,NL-TEE-NAV-L,24.00,29.00,11,https://cdn.example.com/tee-navy-back.jpg,2
classic-cotton-tee,,,,,,White,,M,NL-TEE-WHT-M,24.00,29.00,7,https://cdn.example.com/tee-white-front.jpg,3
classic-cotton-tee,,,,,,White,,L,NL-TEE-WHT-L,24.00,29.00,0,,
URL handle,Title,Vendor,Type,Tags,Option1 name,Option1 value,Option2 name,Option2 value,SKU,Price,Compare-at price,Inventory quantity,Product image URL,Image position
classic-cotton-tee,Classic Cotton Tee,Northline,T-Shirts,"cat:men-tshirts, cotton",Color,Navy,Size,M,NL-TEE-NAV-M,24.00,29.00,18,https://cdn.example.com/tee-navy-front.jpg,1
classic-cotton-tee,,,,,,Navy,,L,NL-TEE-NAV-L,24.00,29.00,11,https://cdn.example.com/tee-navy-back.jpg,2
classic-cotton-tee,,,,,,White,,M,NL-TEE-WHT-M,24.00,29.00,7,https://cdn.example.com/tee-white-front.jpg,3
classic-cotton-tee,,,,,,White,,L,NL-TEE-WHT-L,24.00,29.00,0,,
URL handle,Title,Vendor,Type,Tags,Option1 name,Option1 value,Option2 name,Option2 value,SKU,Price,Compare-at price,Inventory quantity,Product image URL,Image position
classic-cotton-tee,Classic Cotton Tee,Northline,T-Shirts,"cat:men-tshirts, cotton",Color,Navy,Size,M,NL-TEE-NAV-M,24.00,29.00,18,https://cdn.example.com/tee-navy-front.jpg,1
classic-cotton-tee,,,,,,Navy,,L,NL-TEE-NAV-L,24.00,29.00,11,https://cdn.example.com/tee-navy-back.jpg,2
classic-cotton-tee,,,,,,White,,M,NL-TEE-WHT-M,24.00,29.00,7,https://cdn.example.com/tee-white-front.jpg,3
classic-cotton-tee,,,,,,White,,L,NL-TEE-WHT-L,24.00,29.00,0,,

Points to keep in mind when you run a Shopify CSV import:

  • Only the first row of each product carries product-level fields (title, description, vendor, tags).

  • Image URLs must be publicly accessible over HTTPS; Shopify downloads and re-hosts them.

  • Save the file as UTF-8. Special characters in descriptions are the most common cause of broken imports.

  • If you re-import with Overwrite products with matching handles, blank cells overwrite existing values, and changing option values creates new variant IDs. Test overwrite behaviour on a copy first.

For a full, step-by-step example of preparing variant rows from a supplier site, see our dropshipping product import guide.

Sample product JSON to import in Shopify

For large catalogs or repeatable syncs, developers usually import through the Admin GraphQL API instead of CSV. The productSet mutation creates or updates a product with its options, variants and media in one call. A simplified input looks like this:

json

{
  "synchronous": true,
  "productSet": {
    "title": "Classic Cotton Tee",
    "handle": "classic-cotton-tee",
    "vendor": "Northline",
    "productType": "T-Shirts",
    "tags": ["cat:men-tshirts", "cotton"],
    "productOptions": [
      { "name": "Color", "position": 1, "values": [{ "name": "Navy" }, { "name": "White" }] },
      { "name": "Size", "position": 2, "values": [{ "name": "M" }, { "name": "L" }] }
    ],
    "files": [
      {
        "originalSource": "https://cdn.example.com/tee-navy-front.jpg",
        "alt": "Classic Cotton Tee in navy, front view",
        "contentType": "IMAGE"
      }
    ],
    "variants": [
      {
        "optionValues": [
          { "optionName": "Color", "name": "Navy" },
          { "optionName": "Size", "name": "M" }
        ],
        "price": 24.00,
        "compareAtPrice": 29.00,
        "inventoryItem": { "sku": "NL-TEE-NAV-M" }
      }
    ]
  }
}
{
  "synchronous": true,
  "productSet": {
    "title": "Classic Cotton Tee",
    "handle": "classic-cotton-tee",
    "vendor": "Northline",
    "productType": "T-Shirts",
    "tags": ["cat:men-tshirts", "cotton"],
    "productOptions": [
      { "name": "Color", "position": 1, "values": [{ "name": "Navy" }, { "name": "White" }] },
      { "name": "Size", "position": 2, "values": [{ "name": "M" }, { "name": "L" }] }
    ],
    "files": [
      {
        "originalSource": "https://cdn.example.com/tee-navy-front.jpg",
        "alt": "Classic Cotton Tee in navy, front view",
        "contentType": "IMAGE"
      }
    ],
    "variants": [
      {
        "optionValues": [
          { "optionName": "Color", "name": "Navy" },
          { "optionName": "Size", "name": "M" }
        ],
        "price": 24.00,
        "compareAtPrice": 29.00,
        "inventoryItem": { "sku": "NL-TEE-NAV-M" }
      }
    ]
  }
}
{
  "synchronous": true,
  "productSet": {
    "title": "Classic Cotton Tee",
    "handle": "classic-cotton-tee",
    "vendor": "Northline",
    "productType": "T-Shirts",
    "tags": ["cat:men-tshirts", "cotton"],
    "productOptions": [
      { "name": "Color", "position": 1, "values": [{ "name": "Navy" }, { "name": "White" }] },
      { "name": "Size", "position": 2, "values": [{ "name": "M" }, { "name": "L" }] }
    ],
    "files": [
      {
        "originalSource": "https://cdn.example.com/tee-navy-front.jpg",
        "alt": "Classic Cotton Tee in navy, front view",
        "contentType": "IMAGE"
      }
    ],
    "variants": [
      {
        "optionValues": [
          { "optionName": "Color", "name": "Navy" },
          { "optionName": "Size", "name": "M" }
        ],
        "price": 24.00,
        "compareAtPrice": 29.00,
        "inventoryItem": { "sku": "NL-TEE-NAV-M" }
      }
    ]
  }
}
{
  "synchronous": true,
  "productSet": {
    "title": "Classic Cotton Tee",
    "handle": "classic-cotton-tee",
    "vendor": "Northline",
    "productType": "T-Shirts",
    "tags": ["cat:men-tshirts", "cotton"],
    "productOptions": [
      { "name": "Color", "position": 1, "values": [{ "name": "Navy" }, { "name": "White" }] },
      { "name": "Size", "position": 2, "values": [{ "name": "M" }, { "name": "L" }] }
    ],
    "files": [
      {
        "originalSource": "https://cdn.example.com/tee-navy-front.jpg",
        "alt": "Classic Cotton Tee in navy, front view",
        "contentType": "IMAGE"
      }
    ],
    "variants": [
      {
        "optionValues": [
          { "optionName": "Color", "name": "Navy" },
          { "optionName": "Size", "name": "M" }
        ],
        "price": 24.00,
        "compareAtPrice": 29.00,
        "inventoryItem": { "sku": "NL-TEE-NAV-M" }
      }
    ]
  }
}

Two details matter here: productSet treats the variant list as complete, so variants you leave out are deleted on update; and for large or complex products Shopify recommends running it asynchronously. Check the current API reference before building a production pipeline, as field names change between API versions.

If you do not want to build either format yourself, a Shopify-ready CSV with handles, variants, images and SEO fields already mapped is the shortest route from Magento data to a working import.

Images, SEO Fields and URLs

Products can be imported perfectly and still lose traffic if URLs and SEO fields are not carried over.

Product URLs. Magento product URLs often look like /classic-cotton-tee.html or /men/t-shirts/classic-cotton-tee.html. On Shopify they become /products/classic-cotton-tee. Reuse the Magento url_key as the Shopify handle wherever possible, so the redirect map stays simple and predictable.

Redirects. Every old product and category URL that has traffic or backlinks needs a 301 redirect. Shopify supports bulk URL redirect imports from a CSV with Redirect from and Redirect to columns. Build this file from the same data you used for the product import: old URL, new handle, done. Category URLs should point to the matching collection.

Meta titles and descriptions. Map Magento's meta_title and meta_description to Shopify's SEO title and SEO description columns. Where they are empty, Magento falls back to the product name — decide whether to keep that behaviour or write proper meta data now.

Images and alt texts. Shopify needs full public image URLs. Convert relative Magento paths to absolute URLs on your current domain, and keep the old site online until the import finishes. Carry over alt texts, and fill in missing ones with the product name and variant (for example, "Classic Cotton Tee in navy, front view").

Structured data. Shopify themes generate product schema from product fields. Clean GTINs and brands help your products qualify for rich results and Google Shopping, so this is a good moment to fill in barcodes.

Import, Validate, Re-Import

Never import the full catalog first. A safe sequence looks like this:

  1. Test import of 20–50 products covering every product type and every tricky case: max options, many images, special characters, products on sale.

  2. Check in the admin and on the storefront. Variant combinations, option order, images per variant, prices and compare-at prices, inventory, tags and collections.

  3. Fix the mapping, not the products. If something is wrong, correct the transformation rule and regenerate the file, rather than editing products by hand.

  4. Import the full catalog, ideally in batches by category.

  5. Validate at scale. Use Shopify's product export (shopify export products) to pull the imported catalog back out and compare it with the source file: product count, variant count, SKUs, prices, image count per product.

  6. Run a delta import just before launch to catch products, prices and stock that changed in Magento during the migration.

You can also verify the live storefront the same way you would check a competitor's store: Shopify exposes a public products.json endpoint for every store. Our guide on how to scrape a Shopify store shows how to use it and what it does not include.

Moving to Shopify Plus: What Changes for Large Catalogs

Many Magento merchants, especially those on Adobe Commerce, move to Shopify Plus rather than a standard plan. For a Magento to Shopify Plus migration, the catalog work is largely the same, but a few things change:

  • B2B pricing. Magento tier prices and customer group prices map to Shopify's B2B catalogs and price lists, which have historically been a Plus feature. Export them separately and import them after the base catalog.

  • Multiple stores and markets. Magento websites and store views often become a mix of Shopify Markets (for languages, currencies and regional pricing) and, for truly separate businesses, expansion stores. Decide this before you export, because it determines whether store-view data becomes translations or separate catalogs.

  • Scale and automation. With tens of thousands of SKUs, API-based imports and bulk operations become more practical than repeated CSV uploads. Shopify Plus also gives you higher API limits for faster syncs.

Whether you are on Plus or a standard plan, the product mapping decisions above stay the same — Shopify Plus migration does not remove the three-option limit or the need to map attributes to metafields.

DIY, App or Service: Who Should Move Your Catalog?

There is no single right answer. It depends on catalog size, data quality and in-house skills.

Approach

Good fit when

Watch out for

DIY (native export + spreadsheets or scripts)

Under a few hundred products, simple variants, someone comfortable with data

Time spent on mapping and re-runs; easy to miss edge cases

Migration app

Standard catalog, you also need orders and customers moved

Generic mapping; custom attributes and store views often need manual fixes

Migration agency

Full replatforming with theme, apps and integrations

Products are often treated as one item on a long list

Catalog import service

Large or messy catalogs, inaccessible admin, supplier products to merge

Covers products only; orders and customers go elsewhere

These are not exclusive. A common setup is an agency or app for orders, customers and the theme, plus a dedicated product upload service for the catalog, because that is where data quality matters most.

ShopScraping covers the product side: we collect product data from your Magento storefront (and, if needed, supplier and manufacturer sites), normalize it, map attributes and variants, and deliver an import-ready file for Shopify. See how catalog import works, check pricing plans, or run a demo extraction on one of your own product pages.

After Launch: Keeping the Catalog Fresh

Migration day is not the end of catalog work. Once you are live on Shopify:

  • Keep supplier data in sync. If part of your catalog comes from suppliers, schedule regular refreshes of prices and stock rather than one-off imports.

  • Watch availability. Out-of-stock products that still rank should stay visible with clear messaging, not disappear. Our guide on tracking product stock and availability covers how to monitor this across stores.

  • Re-check your pricing. A new storefront is a good moment to compare your prices with the market again. Competitor price monitoring delivers structured competitor prices on a schedule without building scrapers.

  • Monitor 404s. Check Shopify's and Google Search Console's error reports during the first weeks and add any missing redirects.

Get a Shopify-Ready File of Your Magento Catalog

Moving your product catalog is the part of a Magento to Shopify migration where details matter most: variants, attributes, images and URLs. If you would rather skip the export-transform-fix loop, ShopScraping can deliver your catalog as a Shopify-ready CSV with variants structured, attributes mapped and images attached — ready for a test import.

Frequently Asked Questions

How long does a Magento to Shopify migration take?

For the product catalog alone, a small store with clean data can be moved in a few days. Catalogs with thousands of SKUs, custom attributes and multiple store views usually take several weeks, most of which is spent on mapping decisions, test imports and validation rather than the import itself. A full migration including theme, apps and integrations takes longer.

Can I migrate products from Magento to Shopify for free?

Yes. Magento's native export and Shopify's CSV import are both free. The cost is time: transforming the Magento export into Shopify's format, fixing errors and re-running imports. Apps and services save that time, but they are not required.

Will I lose SEO rankings when I migrate from Magento to Shopify?

You can keep most of your rankings if you preserve content, carry over meta titles and descriptions, and set up 301 redirects from every old product and category URL to its new Shopify equivalent. Rankings commonly fluctuate for a few weeks after launch while search engines process the redirects.

Does Shopify support Magento configurable products?

Yes, as products with variants. A Magento configurable product becomes one Shopify product, and its child simple products become variants. The main limits are three options per product and up to 2,048 variants per product by default.

Is a Magento 2 to Shopify migration different from Magento 1?

The Shopify side is the same. The difference is on the export side: Magento 2 has a structured native product export, while Magento 1 stores are often on outdated hosting and extensions, which makes admin exports less reliable. In those cases, extracting data from the storefront is often the more practical route.

Can I import products into Shopify using JSON instead of CSV?

Yes, through the Shopify Admin API. The GraphQL productSet mutation accepts a JSON input with product fields, options, variants and media. It is the better choice for very large catalogs and recurring syncs, but it requires a developer and an app with API access.

Turn any website into a product data table

Turn any website into a product data table

Every product page is a data source

Turn any website into a product data table

Every product page is a data source

Turn any website into a product data table

Every product page is a data source