← All guides11 min read

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.

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.

Before you start

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.

Setting up the migration

In app.graftport.com, click New migration and step through the wizard:

  1. Basics — Name the migration and pick WooCommerce as the source platform.
  2. Connect source — Enter the store domain, Consumer Key, and Consumer Secret for the REST API key you created.
  3. Connect destination — Paste the Shopify shpat_… access token.
  4. Choose resources — Enable the resource types you are migrating.

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.

Resources: what Graftport migrates

Products and variations

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:

  • The variable product becomes a Shopify product.
  • Each variation becomes a Shopify variant with its option values, SKU, price, compare-at price, and inventory quantity.
  • Custom product attributes — those added outside WooCommerce's core schema via plugins or ACF — land in the mapping editor as their own field types. You decide per attribute whether it becomes a Shopify product option, a variant metafield, or a product-level metafield. Get these decisions made before the first live load; fixing them post-migration in Shopify Admin is significantly more work.

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:

  • Product title, HTML description, and slug
  • All variants with prices, SKUs, and option labels
  • Inventory quantity (mapped to a single Shopify location by default)
  • Product images (fetched from the WordPress media library URL)
  • SEO title and meta description (from Yoast or RankMath fields where present in the WooCommerce REST response)
  • Product type and tags

Categories → collections

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.

Customers

WooCommerce treats every customer as a WordPress user with the customer role. Graftport reads every user with that role and migrates:

  • Name, email, and phone
  • Billing and shipping addresses
  • Account creation date
  • Marketing consent (from WooCommerce's 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.

Orders

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).

Coupons

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.

Blog posts and pages

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.

URL redirects

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.

WooCommerce-specific considerations

Plugins that produce data you cannot move

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:

  1. What data it produces that matters for the destination store.
  2. Whether there is an equivalent Shopify app.
  3. Whether the Shopify app has a data import path from the WooCommerce plugin's data.

Popular cases:

  • WooCommerce Subscriptions — Subscription records in Woo are not readable via the standard REST API. The subscription order history (the billing events) may be accessible via orders; the active subscription contract itself needs to be recreated via the Shopify subscription app of your choice.
  • WooCommerce Memberships — Member records and access rules do not port; the membership app on Shopify needs to be reconfigured and members re-enrolled.
  • WooCommerce Bookings — Booking records are stored in a custom schema; the historical records may export to CSV but need a manual import path.

Staging and plugin re-verification

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.

Running the migration

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.

Cost and re-run pricing

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.

Ready to start?

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:

Ready to migrate?

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.

Get started See the calculator
Related guides
Using the Graftport CLI with Claude Code: install to first publish
Set up the Graftport CLI and migration-engineer skill in Claude Code, then drive a real Shopify migration through the validate and publish l
Human approval gates for AI Shopify migrations: the Graftport contract
Why an AI coding agent should never push to Shopify on its own, and how Graftport's two-tier CLI contract enforces a human gate on every cos
Automating JSONata Shopify mapping with an AI coding agent
How the Graftport CLI lets an AI agent investigate source rows, fix JSONata mapping errors against structured validation codes, and publish