WooCommerce to Shopify migration: the complete guide
Step-by-step guide to migrating from WooCommerce to Shopify with Graftport: credentials, products, customers, orders, permalinks, and the go-live sequence.
Step-by-step guide to migrating from WooCommerce to Shopify with Graftport: credentials, products, customers, orders, permalinks, and the go-live sequence.
A WooCommerce to Shopify migration involves more moving parts than it looks. WordPress's user model, WooCommerce's product variation schema, the permalink structure that Google has been indexing for years, and the plugin layer that powers checkout, subscriptions, or memberships — each of these requires a deliberate decision before you move data. This guide walks through every step of a WooCommerce to Shopify migration using Graftport, from creating the API key to the go-live cutover.
Graftport reads from the WooCommerce REST API. No FTP access, no direct database connection, and no write access to your WordPress install is required at any point.
Two things to have ready before opening the migration wizard:
A WooCommerce REST API key with read access. In your WordPress admin, go to WooCommerce → Settings → Advanced → REST API → Add key. Set the permissions to Read. Copy the Consumer Key and Consumer Secret — you will paste both into the wizard.
A Shopify destination store with an Admin API token. In the destination Shopify store, install a custom app (Settings → Apps and Sales Channels → Develop Apps) and issue an access token with read/write scopes for products, collections, customers, orders, and URL redirects. The scope list is on the Destination → Shopify engineering docs page.
If you are migrating to Shopify Plus, read Migrating to Shopify Plus with Graftport before configuring credentials — particularly if you have WooCommerce's multi-currency or multi-language setup.
In app.graftport.com, click New migration and step through the wizard:
shpat_… access token.The wizard validates both sets of credentials before proceeding. A common failure here is pasting the WordPress login password instead of the WooCommerce API Consumer Secret — they are different things.
WooCommerce models products with variable product / variation pairs. A variable product carries the title, description, category membership, and attribute definitions. Each variation carries a specific combination of attribute values, plus its own price, SKU, stock quantity, and image.
Graftport maps this to Shopify's product/variant model:
For a detailed walkthrough of the mapping editor for custom attributes, see Migrating WooCommerce customers and orders to Shopify, which covers the mapping editor in the context of the products resource.
What carries across by default:
WooCommerce product categories become Shopify collections. The category hierarchy — top-level categories and any subcategories — is preserved as nested collections. Category descriptions and images carry across.
WooCommerce tags are mapped to Shopify product tags. If you use tags for automated collections in Shopify, verify the tag names before launch.
WooCommerce treats every customer as a WordPress user with the
customer role. Graftport reads every user with that role and
migrates:
marketing_opt_in field where
available, or from a compatible consent plugin)WordPress editorial and admin accounts are not migrated. Only the customer role moves across, which is the correct behaviour — your site editors and administrators belong in WordPress, not in Shopify.
Customer passwords do not transfer. WordPress hashes passwords in a format Shopify cannot validate. Every customer on the new store will need to set a new password. Shopify sends an account activation email automatically to each migrated customer when they first attempt to log in. Budget for a short customer-service spike in the weeks after launch, and consider a proactive email sequence announcing the new store before DNS flips.
For more detail on the customer data migration and how to spot-check the output on staging, see Migrating WooCommerce customers and orders to Shopify.
Order history migrates with all line items, discounts, coupons applied, shipping lines, tax lines, fulfillment status, and payment method. Refunds are included. Orders load as historical records — they do not trigger Shopify new-order notifications if you disable staff notifications before the load (Settings → Notifications in the destination Shopify admin).
WooCommerce coupons that map cleanly to Shopify's discount model (percent-off, fixed-amount-off, with simple usage or date limits) migrate as Shopify discount codes. More complex coupons — those tied to specific customer roles, first-order-only flags, or buy-X-get-Y rules with plugin-specific logic — need to be recreated manually in Shopify or via a discount app.
WooCommerce blog posts (WordPress posts with the post type) and
static pages migrate with their title, HTML content, author, and
published date. They land in Shopify's Online Store → Blog Posts and
Pages respectively.
This is the resource most teams underestimate on a WooCommerce
migration. WordPress permalink structures — typically
/product/<slug>/ or /?p=123 — do not exist on Shopify, which uses
/products/<handle>. Without a redirect table, every URL your store
has ranked for becomes a 404.
Graftport builds the redirect table from the WooCommerce product slugs, category slugs, and the WordPress permalink structure. The redirects resource is dry-runnable: inspect the count and a sample of destination URLs before running against production.
See Preserving SEO during a Shopify replatform for the full staging verification workflow, including how to sample your top-ranking URLs from Search Console and validate them against the redirect table.
A WooCommerce plugin that adds a new product type, a custom checkout field, or an alternative order flow stores its data in WordPress's database in a schema only that plugin understands. The WooCommerce REST API does not expose this data, so Graftport cannot read it.
Before starting, list every plugin that affects catalogue, checkout, or customer accounts. For each one, identify:
Popular cases:
After the staging run, use the staging Shopify store to verify not just the data but the store's operational readiness: payment provider configured, apps installed and connected, customer account flow tested with a real email address. Plugin gaps surface as process gaps during this review — better to find them here than after DNS flips.
Follow the same four-stage sequence recommended for all migrations:
1. Dry run first. Start a full run with the dry-run flag on. This pulls all data from WooCommerce and produces a count and shape report without writing anything to Shopify. Check product variant counts, verify the category tree structure, and confirm the redirect table row count looks right relative to your top-ranking URL count.
2. Staging run. Run against a staging Shopify store (development or partner store). Walk the product catalogue, spot-check ten customers and their order counts, verify URL redirects against your Search Console top-50 list.
3. Delta re-run on go-live. WooCommerce keeps taking orders while you are running staging. On go-live day, re-extract from the live WooCommerce store to pick up the delta. Records already on staging are identified by source identity and skipped — only new and changed data is processed. See Re-running a migration on go-live night for the timing sequence.
4. DNS cutover. Once the final load reports succeeded, flip DNS to the destination Shopify store.
For a breakdown of migration tooling costs and how Graftport's usage-based pricing compares to the DIY and agency routes, see WooCommerce to Shopify migration cost.
Connect a WooCommerce source, run a dry-run, and inspect the product and redirect output. The same platform your team will use on go-live night.
Get started at app.graftport.com
Related reading:
Connect a source store, dry-run a migration, see the exact Shopify result before a single record lands. The same platform your team will use on go-live night.