Migrate from Shopify Plus to Saleor

Moving a Shopify Plus store to self-hosted Saleor means remapping products, variants, channels and apps onto a GraphQL model and building a storefront. This page covers what moves cleanly, the sequence, and the cost drivers.

On this page

Migrate from Shopify Plus to Saleor: what the move involves

A merchant weighing self-hosted Saleor after a Shopify Plus renewal or hosting decision needs to know one thing first: the catalog and customer records move through exports and imports, while apps, themes, checkout logic and the storefront are rebuilt. Saleor is BSD-3-Clause licensed and exposes everything through GraphQL, so the platform itself is open and programmable, but the storefront is not included. You will build or adapt a headless frontend that calls Saleor's API, and that work sits outside the platform license. The work is usually split between in-house platform engineers, who run Saleor's API, Dashboard, PostgreSQL, Valkey or Redis, and Celery workers, and an implementation partner, who handles the data mapping, storefront and cutover. Many teams use a mix: the partner builds the import scripts and frontend, and internal staff take over operations. Confirm who owns each of these pieces in writing before the project starts, including who answers for uptime, patching and backups after launch. Shopify Plus's hosted model carries an average uptime figure of 99.99% on its Shopify Plus page, and that responsibility moves to your team. Effort and risk concentrate in three places: rebuilding checkout and Shopify Functions logic, replacing installed apps with Saleor webhooks and apps, and reconciling multi-channel pricing and stock. Shopify's product CSV does not include images, so plan to keep the original store live until images are re-imported from their public URLs. Ask any partner for a written scope that lists each Shopify app and theme feature, its replacement, and the test that proves it works. Treat the effort estimate as something you verify against that list, not a number to accept from a sales conversation.

Which Shopify Plus capabilities map to Saleor, and which need rework

This table maps the Shopify Plus capabilities a merchant relies on to their nearest Saleor equivalents and marks each as clean, needs rework or gap. Read the status as a planning signal, since rework and gaps shape the build scope more than the data move. Confirm checkout and app coverage against your own requirements before committing to a scope.

Shopify Plus capabilitySaleor equivalentStatus
Products, variants and imagesProducts, product types, variants and channel listings through the GraphQL API. Images must be re-uploaded from public URLs because the Shopify CSV does not carry them.Needs rework
MetafieldsSaleor metadata and private metadata on products, variants and customers, plus custom attributes. Map each Shopify metafield definition to an attribute before import.Needs rework
Customers and tagsCustomer accounts and addresses import cleanly. Tags map to metadata or a segment rule in your own tooling, not a native tag field.Needs rework
Multi-market pricing and inventoryChannels with per-channel pricing, currencies, stock and products across multiple warehouses. Confirm how each Shopify market maps to a channel.Clean
Discounts and gift cardsSales, vouchers, cart rules and gift cards in the promotion engine. Automatic discounts from Shopify must be recreated and tested by hand.Needs rework
Payments and split paymentsSplit payments and multi-gateway support are included. Confirm each payment provider you use has a Saleor app or integration, and plan PCI scope on your side.Needs rework
Returns and fulfillmentReturns and multi-warehouse fulfillment are included. Shopify's return flows and fulfillment apps need to be reviewed against Saleor's order states.Needs rework
Apps and Shopify FunctionsNo direct equivalent. Saleor extends through webhooks, apps and metadata rather than in-process plugins, so each app and function becomes custom work or a replacement service.Gap
Themes and checkout customizationSaleor is headless and has no theme or hosted checkout. You build or adapt a storefront on the GraphQL API and own checkout behavior end to end.Gap

What exports carry over and what you rebuild

Shopify's export tools move records, but they leave images, full order history and app logic behind. The cards below separate what arrives in a CSV from what you must re-create in Saleor, so you can plan the cutover before the original store is switched off.

Product CSV and image re-import

The Shopify product CSV carries titles, descriptions, variants, prices and most product fields, but not the images themselves. Shopify advises keeping the original store live until the new store has imported images from their public URLs. In Saleor, map each CSV variant row to a product variant and confirm that image URLs remain reachable during the import window. Check for SKU collisions and handle variant option names before loading.

Customer CSV and its limits

The customer export includes contact details, tags and supported metafields, and Shopify limits the file to 15 MB. A large customer base may therefore produce several files that must be split and loaded in sequence. Confirm which metafields the export actually includes, since custom metafields outside the supported set may be missing. Decide how to handle password resets, because customer credentials do not move with the CSV.

Order history through the Admin API

Order CSVs rarely hold the full history you need for returns, refunds, fulfillment events and custom order metafields. Plan to extract orders through the Shopify Admin API and map them to Saleor orders, including channel, currency and warehouse. Imported historical orders are usually kept for reference rather than replayed, so agree with finance and support which fields must be queryable in Saleor's GraphQL API.

Shopify apps to Saleor webhooks and apps

Shopify apps often hold logic for tax, shipping, reviews or loyalty that lives in third-party services. Saleor extends through webhooks, apps and metadata rather than in-process plugins, so each app must be replaced by an external service subscribed to Saleor events, or by stored metadata. Inventory every installed app, record the data it writes, and decide whether it is rebuilt, replaced or dropped.

Shopify Functions and checkout logic

Discounts, shipping rules and payment logic that run as Shopify Functions or checkout extensions do not transfer as code. Saleor provides a promotion engine with sales, vouchers, cart rules and gift cards, but rules must be rebuilt and tested against your real pricing. Document every automatic discount, then confirm which ones Saleor can express natively and which need a custom app.

Storefront and payment gateways

Saleor is a headless platform, so Shopify's theme and hosted checkout are not carried over. You must build or adapt a storefront against the GraphQL API and connect each payment gateway that Saleor supports, including split payments where needed. Confirm tokenization, 3-D Secure flows and the PCI responsibilities that move to your team, and test refunds and partial captures before launch.

The migration sequence from inventory to decommission

This sequence moves a Shopify Plus store to a self-hosted Saleor instance in controlled stages, so each step produces a documented artifact that the next step depends on. The Shopify store stays live until the new platform is verified, which keeps the rollback path open until cutover is signed off.

  1. Inventory catalog, customers, apps and integrations

    The merchant and the migration lead list every product type, variant option, metafield namespace, market, sales channel, warehouse location, customer segment, active app and third-party integration connected to the store. Each app is marked as replaced by a Saleor feature, replaced by a webhook or custom app, or retired. The output is a signed-off inventory workbook that names the owner of each open decision. It is done when every active app and integration has a disposition and the catalog counts from the Shopify admin are recorded as the baseline.

  2. Build the field mapping sheet

    The team maps Shopify product, variant, metafield, customer and order fields to Saleor's GraphQL model, including product types, attributes, channel listings, variant pricing per channel and warehouse stock. Shopify exports are compared with the fields they omit, such as product images, which must be re-imported from public URLs. The output is a field mapping sheet with an entry for every exported column and a note on any field with no direct Saleor equivalent. It is done when the engineering lead and the merchandising lead have both reviewed and approved it.

  3. Run a pilot import into a Docker Compose environment

    Engineers start a non-production Saleor instance using the Docker Compose setup, which runs the API, Dashboard, PostgreSQL, Valkey or Redis and Celery workers, and confirm the host has enough memory for the stack. They load a representative sample of products, variants, channels and customers through the GraphQL API using scripts that read the mapping sheet. The output is a pilot import log and a list of rejected records with the reason for each. It is done when the sample loads without errors that the mapping sheet does not already explain.

  4. Reconcile counts and fix mapping gaps

    The team compares product, variant, stock and customer counts in Saleor against the Shopify baseline recorded in the inventory, and checks sample records field by field, including prices in each channel and stock per warehouse. Gaps are traced back to the mapping sheet, the script or the source export, then fixed and re-imported. The output is a reconciliation report with each difference explained and resolved. It is done when the counts match or every remaining difference has an approved explanation.

  5. Run the full import and the parallel operation

    The full catalog, customer and historical order data are loaded into a staging Saleor environment, and the storefront built for it is tested against that data. The Shopify store stays live and continues to take orders, so the team runs a documented delta process that carries new orders, customers and stock changes across until cutover. The output is a parallel run log and a test report covering checkout, payments, returns, refunds and promotions. It is done when the storefront, payment gateways and fulfillment workflows pass the agreed test cases.

  6. Prepare cutover, redirects and payment changes

    The team confirms the DNS plan, the payment gateway configuration and merchant credentials on the Saleor side, and the URL redirect map from old Shopify paths to new storefront paths, including product, collection and content pages. Rollback steps for DNS and redirects are written down and rehearsed in staging. The output is a signed-off cutover checklist with named owners, a rollback procedure and a freeze window for order changes. It is done when the business owner, security reviewer and engineering lead have each signed the checklist.

  7. Cut over and monitor the new store

    On the agreed window, the team freezes Shopify order changes, runs the final delta import, switches DNS and payment traffic to the Saleor-backed storefront, and monitors errors, order flow, payment authorizations and redirect hits. The output is a cutover record with timestamps, the final reconciled order count and any incidents. It is done when orders are flowing through Saleor, payment settlements match the expected totals and the redirect hit log shows no unexpected 404 patterns on priority pages.

  8. Decommission Shopify after verified operation

    Once the new store has run through the agreed monitoring period and the business has confirmed that no data is still needed in Shopify, the team exports the final order, customer and product records to secure storage, documents what was retired, and cancels the subscription and app billing according to the contract terms. Access keys and webhooks pointing to Shopify are revoked. The output is a decommission record listing the archived exports, revoked credentials and closed integrations. It is done when the record is signed off and no Shopify dependency remains in the stack.

How Saleor's architecture changes the work

A self-hosted Saleor is not a single application you install and forget. The core services you run are the GraphQL API, the Dashboard for merchants and staff, PostgreSQL as the system of record, Valkey or Redis for caching and task coordination, and Celery workers that process background jobs such as webhook deliveries and asynchronous tasks. Your Shopify Plus store hides all of this behind a hosted service, so the migration plan needs an owner for each component, along with its backups, upgrades and monitoring. The Docker Compose setup in the Saleor documentation asks for at least 5 GB of memory for Docker, which is a floor for evaluation and not a sizing for production traffic. Ask your platform team to size the database, cache and worker tiers against your peak order volume, and confirm the current requirements in the Saleor Docker Compose documentation before you commit to hardware.

Saleor is configured through environment variables, which follow the 12-factor app model. Database connections, secret keys, allowed hosts and storage settings live in the environment rather than in files edited by hand, so your deployment pipeline should inject them per environment and store secrets in your secrets manager. Extension works differently too. Saleor does not run in-process plugins; it extends through webhooks, installed apps, and metadata on objects. This changes how you replace Shopify apps. Each app you rebuild becomes a separate service that receives events, calls the GraphQL API with its own credentials, and writes its results back, which means you will test it, deploy it and secure it on its own. Map every Shopify app in use to one of these patterns before you plan the storefront work. Before you finalize the design, confirm the current release details, including the version you will deploy, against the Saleor releases page.

How the move differs by starting point

A store with thousands of products and many variants spends most of its effort on data shape. Shopify's product CSV carries options and variant rows, but it does not carry product images, so images must be re-imported from their public URLs while the original store stays live. In Saleor, products, product types, variant attributes and metadata map onto a GraphQL model that is stricter than a flat spreadsheet, so the mapping work is the critical path rather than the import itself.

  • Product types: Group products by shared attribute sets before importing, otherwise variant options drift between products.
  • Metadata: Decide which Shopify metafields become Saleor attributes and which stay as metadata for the storefront.
  • Images: Plan a separate image pass and verify URLs remain reachable after the old store is closed.
  • Stock: Map inventory locations to Saleor warehouses before loading quantities.
  • Validation: Sample variant counts and prices per product type after each import batch.

Confirm with your team how many distinct product types your catalog truly needs, and whether your current Shopify export reliably includes every metafield you rely on.

What drives cost and duration in this migration

This table lists the main cost and effort drivers when moving a Shopify Plus store to self-hosted Saleor, with who is paid and whether each cost is one-time or recurring. Use it to scope a written quote, since the largest variables are catalog depth, channel count, and how many Shopify apps you must replace.

Driver or cost componentWhat it involves for this migrationOne-time or recurring
Catalog size and variant depthProducts, variants, and metafields must map to Saleor product types and attributes. Deep variant matrices increase mapping and validation work.One-time
Channels and currenciesEach sales channel needs its own pricing, currency, stock allocation, and warehouse assignments. Every added market multiplies configuration and testing.One-time, with ongoing upkeep
Shopify apps to replaceEach app is either matched to a Saleor app or webhook integration, or rebuilt. Count and complexity of apps set much of the build effort.One-time
Storefront scopeSaleor is headless, so the storefront, theme, checkout flow, and account pages must be built or adapted. Page count and custom checkout logic drive this line.One-time, then ongoing changes
Payment gateway setupEach gateway needs configuration, webhook handling, and testing for authorization, capture, refunds, and split payments. Ask who owns PCI scope for each gateway.One-time setup, recurring gateway fees
Customer and order history depthShopify CSV exports omit some data, so full order history may need the Admin API. Longer history and more records increase extraction and reconciliation time.One-time
Data validation and cutoverReconciling products, stock, customers, and open orders, plus URL redirects, before go-live. Confirm who signs off on acceptance criteria.One-time
Hosting and operationsYou run the Saleor API, Dashboard, PostgreSQL, Valkey or Redis, and Celery workers. Confirm memory and sizing requirements against the Saleor Docker Compose documentation.Recurring
Patching, upgrades, and supportSaleor releases must be tracked and applied, and dependencies patched. Ask whether the quote includes upgrades and a support window.Recurring

What usually goes wrong and how to prevent it

Most failed Shopify Plus to Saleor migrations break at the seams: images, data fields, customer accounts, URLs, app functions, prices and cutover timing. Each card below names one failure point and the check that prevents it, so the team can test those seams before a single customer is moved.

Missing product images

Shopify's product CSV does not carry image files, only references, so images must be fetched from their public URLs and attached to Saleor products and variants through the API. Confirm that every image maps to the right product and variant, that alt text survives, and that sort order is preserved. Keep the original Shopify store live until the image import has been checked against a sample of SKUs. Ask your storefront developer how media will be served and cached.

Lost metafield data

Metafields often hold size guides, compliance text, B2B terms and merchandising flags that the basic CSV exports leave out. Saleor stores custom data as metadata and attributes, so each Shopify metafield needs an explicit target: a Saleor attribute, a metadata key or a retired field. Build a mapping sheet from the Admin API output, assign an owner to each field, and reconcile counts on both sides after import.

Customer identity and password handling

Shopify does not export customer password hashes in the standard CSV, so customers cannot simply log in on Saleor with their old passwords. Decide whether accounts are recreated with a password reset flow, invited by email, or migrated through a separate identity provider. Confirm consent and marketing opt-in flags travel with each record, and check that the customer CSV's 15 MB limit is handled by splitting files into batches.

Broken URLs and SEO redirects

Shopify URL structures for products, collections and blog posts rarely match the routes a headless Saleor storefront will expose. Without a redirect map, search rankings and inbound links break at cutover. Export every indexed URL from search console and analytics, map each one to its new route, and load 301 rules at the edge or in the storefront. Test the top landing pages in each market after launch.

Under-scoped app replacements

Shopify apps handle reviews, subscriptions, loyalty, tax, shipping rules and fulfillment connectors, and each one may be a paid service you must now replace or build. Saleor extends through webhooks, apps and metadata rather than in-process plugins, so each replacement is a service with its own hosting, secrets and failure modes. List every installed app, record the data it reads and writes, and confirm each has a Saleor-side equivalent before signing off the scope.

Channel pricing errors

Saleor prices products per channel with its own currencies, stock and warehouses, so a single Shopify price list can become several wrong prices if channels are mapped carelessly. Check tax-inclusive or exclusive settings, compare-at prices, rounding for each currency, and stock allocation per warehouse. Run a reconciliation report that compares Shopify and Saleor prices for every channel and currency before the first live order.

Cutover without a parallel run

A single-day switch leaves no room to find mapping errors in real orders, inventory counts or payment callbacks. Run both platforms for a fixed period, compare order and stock totals daily, and keep Shopify live until images, redirects and reconciliation reports all pass. Define a rollback decision point in advance, and confirm who owns the DNS change, payment gateway switch and final delta sync.

Questions buyers ask before moving to Saleor

What does a migration from Shopify Plus to Saleor cost?

The cost is a mix of one-time build work and recurring running costs, and no single figure applies to every store. The one-time part covers data mapping, the storefront build, checkout and payment setup, integrations, testing and cutover. The recurring part covers hosting for the API, Dashboard, PostgreSQL, Valkey or Redis and Celery workers, plus monitoring, backups, security patching and upgrades. What moves the number most is how many channels and markets you run, how many custom Shopify apps you must replace, and how much storefront work you need. Ask any vendor or partner for a quote built from a written scope that lists each of these components separately, and ask Saleor Cloud managed hosting and self-hosted Docker costs side by side so the recurring difference is visible.

How long does a Shopify Plus to Saleor migration take?

The timeline depends on catalog size, the number of channels and markets, the number of apps and integrations to replace, and how much of the storefront is new. Teams that already run GraphQL-based frontends and have clean product data usually move faster than teams rebuilding themes and checkout logic from scratch. Cutover planning also sets the pace, since a store cannot close until images, redirects and payment settings are verified. Ask for a timeline tied to named milestones in the written scope, and confirm with the Saleor project which release and configuration you will target, since the current release is listed on the project's GitHub releases page.

Can our in-house team migrate to Saleor without outside help?

A capable internal team can do it, but the skills needed are broader than a typical Shopify admin team has. You need people comfortable with GraphQL, Python and Django for backend extensions, a frontend developer for the storefront, someone who can operate PostgreSQL, Redis or Valkey, Celery workers and Docker, and an owner for payments and PCI scope. Saleor extends through webhooks, apps and metadata rather than in-process plugins, so integration design matters from day one. Be honest about your bench: list the skills you have, the skills you would hire, and the skills you would buy as a fixed-scope engagement before deciding.

What does our team need to provide during the migration?

You will need to supply several things before work starts. These include a named business owner who approves product structure, pricing and channel rules, access to the Shopify admin and any Admin API credentials, a list of installed apps with the function each one performs, payment gateway accounts and their configuration, tax and shipping rules, and the URL structure that search engines and customers currently use. Your team also needs time for acceptance testing on order flows, returns and promotions. Make these inputs part of the written scope so delays from missing access or decisions are visible early.

Can customer passwords and order history move to Saleor?

Customer records and order history can usually be moved, but passwords are the hard part. Shopify's customer export is a CSV limited to 15 MB, according to the Shopify Help Center, and it includes customer details, tags and supported metafields, but it does not give you the ability to export password hashes in a form that Saleor can use directly. Order history often needs the Admin API rather than a CSV, especially for full line items and metafields. Plan for customers to reset passwords or sign in through a one-time reset flow, and confirm with your Saleor implementation partner how account import and authentication will be handled in your target setup.

How do we run Shopify Plus and Saleor in parallel during cutover?

Keep the Shopify store live until the new store has verified data, because Shopify advises keeping the original store running until images have been imported from their public URLs, according to the Shopify Help Center. A common approach is to build and test Saleor against a staging copy, run synchronized product and customer imports on a schedule, and then freeze orders on Shopify for a short window before the final sync and DNS or routing switch. Plan redirects from old URLs to new ones, test payments in both environments, and define a rollback path. Confirm with your partner exactly which data stays authoritative during the overlap period, because two live stores taking orders at once create reconciliation risk.

Does Saleor cover multi-market pricing, stock and promotions after the move?

Saleor supports per-channel pricing, currencies, stock and products across multiple warehouses, which maps well to merchants selling across several markets. It also includes split payments, returns, multi-gateway payment support and a promotion engine with sales, vouchers, cart rules and gift cards, according to the Saleor GitHub repository. Map each Shopify Markets setting, automatic discount and app-based promotion to a Saleor equivalent before build starts, because some rules may need custom development. Ask your partner to produce a feature gap list that marks each capability as native, configured, extended or not available.

Who is responsible for security and uptime after go-live?

After go-live, you carry responsibility for uptime, patching, backups and PCI-relevant controls that Shopify previously handled as a hosted platform. Shopify states 99.99% uptime on average on its Plus page, and self-hosting means your own architecture and operations determine availability. Define who responds to incidents, how database backups are tested, how dependency and container updates are applied, and how payment scope is reduced. DeployOpen can plan, implement, harden, back up and support a self-hosted Saleor environment inside your own infrastructure, and can prepare controls and evidence for compliance assessments, although independent auditors issue any audit report or certification.

How DeployOpen works on this

DeployOpen plans, implements, customizes, integrates, hardens, backs up, upgrades, documents and supports self-hosted open-source platforms inside your own infrastructure. For a Shopify Plus to Saleor move, that means agreeing in writing which catalog, customer, order and storefront work is in scope before any build begins.

How we scope

  • Inventory the Shopify Plus products, variants, metafields, customers and order history that must carry over.
  • Map each Shopify app and theme dependency to a Saleor API, webhook, app or storefront component.
  • Agree channels, currencies, warehouses and payment gateways in a written, fixed-scope statement of work.

How we build

  • Build the import pipeline from Shopify CSV and Admin API exports into Saleor's GraphQL model, with test runs on copies.
  • Configure per-channel pricing, stock and promotions, then test them against your reference catalog and order samples.
  • Build or adapt the headless storefront and Saleor apps, and run security testing on the APIs and checkout flow.

How we hand over

  • Deliver documented environment variable configuration, Docker Compose or hosting setup, and runbooks for the API, Dashboard, workers and PostgreSQL.
  • Document data mapping decisions, redirect tables and cutover steps so your team can repeat or audit the migration.
  • Provide compliance readiness evidence and controls documentation, noting that independent auditors issue any audit reports.

How we support

  • Ongoing support, upgrades and continuous security testing are available as a retainer after handover.
  • Plan Saleor version upgrades, backups and restore tests against your own change process and maintenance windows.
  • Confirm retainer scope, response expectations and upgrade cadence in writing before go-live.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.