← All guides8 min read

Migrating WooCommerce customers and orders to Shopify with Graftport

How Graftport extracts WooCommerce customer accounts, order history, and addresses from the REST API, what the email marketing consent limitation means, and how to verify the result on staging.

Of every data type a WooCommerce store holds, customers and orders are the ones merchants worry about most. Products can be re-imported from a spreadsheet if something goes wrong; customer purchase history and order records cannot be reconstructed. This guide covers exactly how Graftport reads WooCommerce customer and order data, what the WooCommerce REST API exposes and what it withholds, and how to verify the results on a staging store before go-live.

What Graftport reads from WooCommerce

Graftport connects to WooCommerce via the WooCommerce REST API — no plugin installs, no FTP access, no WordPress admin login. Everything goes through a read-only consumer key you generate in WooCommerce → Settings → Advanced → REST API.

For customers and orders specifically, the REST API exposes:

Data typeWhat Graftport reads
Customer accountsProfile (name, email), billing address, shipping address, customer notes, account creation date
Order historyAll orders — line items, quantities, prices, tax lines, shipping lines, payment method, fulfillment status
Coupons appliedCoupon codes associated with each order
RefundsFull or partial refund records on an order

What the WooCommerce REST API does not expose: newsletter subscription status. If your WooCommerce store uses a dedicated email marketing plugin (Mailchimp for WooCommerce, Klaviyo, Mailjet), that consent data lives in the plugin's own storage — outside the WooCommerce REST API. Graftport creates migrated customer accounts in Shopify with email marketing consent set to off by default. If you have a customer list with consent status from your email platform, the right place to re-apply that is inside the email marketing platform, not via a Graftport mapping override.

Which customers migrate

WooCommerce stores every customer as a WordPress user with the customer role. Graftport migrates accounts with that role only. WordPress users with other roles — editors, authors, administrators, contributors — are not migrated. This is the expected behaviour: those are WordPress site roles, not e-commerce customers, and they have no equivalent in Shopify.

If a customer also has an admin or editor role on the WordPress site (a common setup for store owners who gave a customer an elevated role by mistake), they will be skipped by Graftport's filter. Flag any such accounts before migration and either demote them to the customer role on WooCommerce, or create them manually on the destination Shopify store.

Setting up the credentials

Create a dedicated REST API key for Graftport in WooCommerce → Settings → Advanced → REST API:

  1. Click Add key.
  2. Set Description to something like Graftport migration — read access.
  3. Set User to any admin-role user on the WordPress site.
  4. Set Permissions to Read.
  5. Click Generate API key.
  6. Copy the Consumer key and Consumer secret immediately — they are shown only once.

Paste both values into Graftport's credential form alongside your WordPress site URL (https://example.com, no trailing slash).

The order migration in practice

Orders are the most faithful record of what actually happened in a store. Graftport reads every order — open, completed, refunded, cancelled — and writes it to Shopify with the same structure:

  • Line items with SKU, quantity, and per-item price.
  • Tax lines preserving the tax description and amount.
  • Shipping lines with the shipping method name and charge.
  • Order totals matching the WooCommerce record.
  • Fulfillment status mapped to Shopify's equivalent (fulfilled, unfulfilled, partially fulfilled).
  • Payment method stored as a note — Shopify does not replicate external payment provider transactions, but the record of which method was used lands on the order.

Refunds are migrated as refund records on the Shopify order. Coupon codes that were applied to an order are stored on the line item or order notes, depending on the coupon type — Graftport stores them rather than trying to recreate the discount logic on the destination, because the destination's discount engine is separate from historical order data.

Gift card balances

If your WooCommerce store uses a WooCommerce gift card plugin (the most common being WooCommerce Gift Cards by WooThemes or a compatible alternative), Graftport reads outstanding gift card balances via the REST API and migrates them as Shopify gift cards. The Shopify gift card is created with the same code and remaining balance.

Which plugins are supported depends on whether the plugin exposes its gift card data through the WooCommerce REST API extension points. Contact us before migration if your store uses a bespoke gift card setup; we can check compatibility before you invest time in the migration setup.

Verifying customer and order data on staging

Run the WooCommerce migration against a staging Shopify store — a development store under your Shopify Partner account works well — and run these checks before touching production:

Customer count. Compare the total customer count on the WooCommerce store (in WooCommerce → Customers) with the count on the staging Shopify store (Shopify Admin → Customers). A mismatch by a small number usually means a handful of WooCommerce accounts had corrupted data (missing email address, duplicate email). Open the run item in Graftport and read the per-row errors to find them.

Order count. Compare the order count in WooCommerce with the count on the staging Shopify store. Cancelled orders are included. The counts may differ by a small number if WooCommerce has test or spam orders that don't have a real customer attached — Graftport skips orders with no customer record.

Spot-check individual orders. Pick five orders at random — ideally including one refunded order and one with a coupon applied — and open them on both WooCommerce and the staging Shopify store. Confirm line items, totals, and shipping lines match.

Check customer address books. Open three or four customer profiles on the staging Shopify store and confirm billing and shipping addresses landed correctly, including country codes. WooCommerce stores countries as two-letter codes; Shopify expects the same format, so this usually passes cleanly, but verify.

Check email marketing consent. Confirm that migrated customers show email marketing consent as not subscribed. This is expected — re-subscription is handled via your email marketing platform's re-engagement flow after launch.

Password resets after migration

WooCommerce customer passwords cannot be migrated to Shopify — Shopify's authentication system stores hashed passwords in its own format, and there is no portable exchange. Every customer who migrates needs to complete a password reset on the Shopify store.

The practical approach most merchants use: send a launch email to the migrated customer list announcing the new store and prompting a password reset. Shopify's New account email template, triggered when a customer account is created, can be customised to read as a "welcome to our new store" message. Send it to the migrated segment on launch day.

Syncing orders placed between rehearsal and launch

Graftport's idempotency model means you can re-run the migration on go-live night to pick up orders placed since the staging rehearsal. Any customer account already loaded on the destination is skipped (no duplicate); any new order since the last extract is first-loaded.

The standard sequence: run an extract the morning of go-live, run a full load in the hours before DNS flip, flip DNS, and run one final extract + load after DNS flip to capture any orders placed during the DNS propagation window. Each re-run charges only for the records that are genuinely new — the rest are skipped at zero cost.

Coupons and discount codes

WooCommerce coupons migrate as Shopify discount codes where the coupon logic is compatible. WooCommerce's coupon model is close to Shopify's discount code model for percentage and fixed-amount discounts. More complex WooCommerce coupon rules — cart conditions, user restrictions, product exclusions — may not have a direct Shopify equivalent. Where a coupon cannot be faithfully recreated, Graftport flags it in the run output and stores the coupon details on the order as a note so nothing is lost.

Related reading

Ready to migrate? Sign up at app.graftport.com and connect your WooCommerce store — the wizard guides you through credential setup and you can run a dry-run extract to see your customer and order counts before writing a single record to Shopify.

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