Migration

Shopify to Shopware 6: export, variants and customer accounts

Shopify gives you your data through its GraphQL API and keeps one thing back: customer passwords. This guide covers the export, the product mapping, the account switch and the redirects.

By Huzaifa Mustafa 5 min read October 31, 2026

The Quick Answer

Export with Shopify's GraphQL bulk operations, which return everything as one JSONL file per query. Map each product's options to Shopware property groups and its variants to Shopware variants. Import customers without passwords and send them Shopware's password recovery mail, because Shopify never hands out hashes. Then point every old Shopify URL at its new address with 301 rules.

Checked against: Shopware 6.7.15.1 source and Shopify's developer documentation and changelog, October 2026.

There is no official migration tool for this move. Shopware's Migration Assistant covers Shopware 5 and 6, and the Shopware Store's migration category lists nothing for Shopify.

The data itself is easy to reach. Shopify's Admin API exposes products, collections, customers and orders, and the bulk operations API exports them without paging through rate limits. The work is in the mapping and in one decision you cannot avoid: every customer sets a new password.

Step 1: Export with Bulk Operations

A bulk operation runs one GraphQL query over the whole store in the background. You start it with bulkOperationRunQuery, then poll bulkOperation(id:) or subscribe to the bulk_operations/finish webhook.

mutation {
  bulkOperationRunQuery(query: """
    { products { edges { node {
        id handle title vendor productType
        options { name values }
        variants { edges { node { id sku price selectedOptions { name value } } } }
    } } } }
  """) {
    bulkOperation { id status }
    userErrors { field message }
  }
}

What to know before you write the queries:

  • JSONL output: one object per line. Variants come as their own lines with a __parentId pointing at their product, so the import rebuilds the tree.
  • Query limits: at most 5 connections per query, nested at most 2 levels deep. Products, customers and orders each get their own operation.
  • Time limits: an operation must finish within 10 days, and the download URL expires after one week. Since API version 2026-01, an app can run 5 bulk queries per shop at the same time.

Step 2: Map Products, Variants and Collections

  • Options become property groups: a Shopify product has up to three options, such as Size and Colour. Each becomes a Shopware property group, and each value an option in it.
  • Variants become variants: the product becomes a Shopware parent, and each variant a child with its own SKU and price. Since 15 October 2025 Shopify allows up to 2,048 variants per product, up from 100. Export tools built for the old limit can break above 100, so test your largest product first.
  • Collections become categories: manual collections map directly. Automated collections are rules in Shopify, so decide whether each becomes a category with assigned products or a dynamic product group in Shopware.
  • Metafields become custom fields: list which namespaces matter, since apps add their own.

Write the mapped data with Shopware's Admin API sync endpoint, /api/_action/sync, in batches: property groups first, then parents, then variants, so every reference exists when it is used.

Step 3: Move Customers Without Passwords

Shopify's Admin GraphQL Customer object has no password or hash field, and the customer CSV export has none either. A WooCommerce or Shopware 5 migration can keep passwords through a legacy encoder. A Shopify migration cannot, so plan the switch as a communication task.

  1. Import customers and addresses as regular accounts with no password. The customer definition does not require one.
  2. After launch, send each customer Shopware's password recovery mail. The Store API route is POST /store-api/account/recovery-password with the customer's email and a storefrontUrl that must be one of the sales channel's domains.
  3. Announce the move in the mail template itself: new shop, same account, set a password once.

Important: the recovery route is rate-limited per email address and client IP, and thousands of mails at once can trip your mail provider's sending limits. Send them in batches, and only after DNS points at Shopware.

Step 4: Build the Redirect Map

Shopify products live under /products/handle and collections under /collections/handle, and Shopify lets you change neither prefix. Crawl the live shop to catch every URL that search engines know, including pages and blog posts.

The handle is in the export, so the product part of the map is a join: handle to SKU from the bulk export, SKU to new SEO URL from Shopware. Ship the map as 301 rules in the web server or CDN, because Shopware core has no manager for arbitrary redirects. The check loop in the Shopware 5 to 6 guide tests it against staging.

Step 5: Replace the Apps

A Shopify store runs on apps: reviews, subscriptions, upsells, B2B pricing. Each one needs a Shopware extension, a feature in core or the Commercial plans, or custom code, and its data needs its own export from the app vendor. List every installed app before you quote a launch date. It is the Shopify equivalent of the Shopware 5 plugin audit.

Key Takeaways

  • Export with GraphQL bulk operations and rebuild the tree from __parentId.
  • Options map to property groups. Test your largest product, since Shopify now allows 2,048 variants.
  • Passwords cannot leave Shopify. Import accounts without them and send recovery mails after DNS moves.
  • Join handle, SKU and new SEO URL to build the 301 map, and list every app before you set a date.

Written by

Share:

Planning the Move from Shopify?

Send us your store URL and a rough count of products, customers and orders. We'll tell you how the export, the variants and the account switch fit your store.