Migration
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.
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.
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:
__parentId pointing at their product, so the import rebuilds the tree.
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.
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.
POST /store-api/account/recovery-password with the customer's email and a storefrontUrl that must be one of the sales channel's domains.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.
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.
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.
__parentId.
Written by Huzaifa Mustafa
More on moving to Shopware 6:
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.