Every step cited to the vendor’s own docs
How to migrate from WooCommerce to Shopify, step by step.
WooCommerce gives you your data more freely than any other platform. The hard part is what Shopify will accept, and the order that keeps orders, images and rankings intact while you move. This is the whole sequence, cited to the documentation it came from.
13 steps · Plan on 25-50 hours of your own time
13
steps, in the order they have to happen
26
hours of hands-on work for a mid-sized store
8
things that do not come with you
10
URL shapes that need a 301
Phase 01 · 1.5 h
Before you touch anything
- 1.5 hShopify docs
Audit the store before touching anything
Count products by type, attributes per variable product, customers, orders, coupons, and list every active plugin and gateway. This determines whether plain CSV works or you need Matrixify, and it is the reconciliation baseline for every import.
WhereWP admin → Products → All Products · WooCommerce → Status · Plugins
The catch
Shopify allows 3 options and 2,048 variants per product. Any product with four or more attributes is a known rebuild: find them now, not mid-import.
Phase 02 · 2 h
Get your data out
- 30 minWooCommerce docs
Export products with the native exporter
WooCommerce ships a product CSV exporter, no plugin needed. Tick “export all custom meta” to carry plugin and ACF data. Images come out as public URLs pointing at your server; the files stay where they are.
WhereWP admin → Products → All Products → Export → Generate CSV
The catch
The exporter mangles variation names on products with 3+ attributes (or 2+ where a name has multiple words). There is no published row limit: the ceiling is PHP memory, so batch big catalogues.
- 1 hWooCommerce docs
Export customers, orders and coupons
WooCommerce core has no customer, order or coupon exporter: Shopify’s own guide says to install one. The official paid extension or WebToffee’s free plugins produce the CSVs, including line items and refunds.
WhereWooCommerce → Exports (extension), or the plugin’s own export screen
The catch
The free WebToffee product exporter excludes variable products, so use the native exporter for products and a plugin only for customers, orders and coupons.
- 15 minWordPress docs
Export blog posts and pages as WXR
The native WordPress exporter produces an XML file with posts, pages, comments and taxonomy. It references media rather than containing it, so the images still come from your server later.
WhereWP admin → Tools → Export → Download Export File
The catch
Shopify cannot read the WXR file directly, and has no native blog or page importer: this export feeds a conversion through Matrixify or the API.
Phase 03 · 16.5 h
Build in parallel
- 1.5 hShopify docs
Import products into Shopify first
Products land before customers and orders so later imports can bind to real records. Map WooCommerce categories into a Collection column, reshape option columns, and reconcile the imported counts against your audit numbers.
WhereShopify admin → Products → Import
The catch
Collection is the only column you may add to the CSV, and imports cap at 15 MB. Untick “publish to all sales channels” so nothing goes live half-built.
- 45 minShopify docs
Import customers second
A separate CSV with its own path; only the Email column is required. Passwords never move, but with Shopify’s new customer accounts, sign-in is a one-time email code, so customers never notice.
WhereShopify admin → Customers → Import
The catch
Only the default address imports. Every additional saved address is discarded. Marketing consent must be a yes you can actually evidence.
- 2 hShopify docs
Import order history via an app
Shopify’s admin cannot import orders at all: Matrixify or the Admin API are the routes. Set Processed At to preserve the date customers see; the internal creation date always stamps the import time.
WhereSettings → Notifications (off first) → Matrixify → New Import
The catch
Turn off new-order notifications first, and keep Send Receipt false. Get this wrong and the entire order history emails itself to your customer list.
- 10 hShopify docs
Rebuild the theme and builder pages
Elementor and Divi layouts render as nothing on Shopify. Rebuild in native theme sections, porting your WordPress pages one at a time, usually the largest single line item in the project.
WhereOnline Store → Themes · Online Store → Pages
The catch
Product and blog body HTML transfers; the layout around it does not. Page-builder apps reintroduce exactly the lock-in you are leaving.
- 2 hShopify docs
Plan payments and subscriptions deliberately
Decide the gateway story before cutover: Shopify Payments for new sales, and, if you run subscriptions, a token migration that connects your existing Stripe/Braintree/PayPal account to bill existing contracts.
WhereSettings → Payments
The catch
Full card migration is Plus-only via Shopify’s Professional Services. The token route works on any plan but keeps legacy contracts on a secondary gateway, so plan subscriber communication around the first renewal.
Phase 04 · 3 h
Keep your rankings
- 3 hShopify docs
Build and import the 301 map
Every indexed URL needs a row: products, categories (one per tree level, since Shopify does not nest), tags, pages and posts. Bulk-import the two-column CSV before the domain moves, and verify the report line by line.
WhereContent → Menus → URL redirects → Import
The catch
Build the map from a crawl of live URLs, never from the permalink pattern: WooCommerce 10.5 changed which category appears in product paths, so synthesised URLs lie.
Phase 05 · 2.5 h
Cut over
- 1 hShopify docs
Drop TTL a week out, then cut DNS
Reduce TTL to 300 about a week before launch so the real switch propagates in minutes. Then point the A record and www CNAME at Shopify at a quiet hour.
WhereRegistrar DNS panel · Shopify → Settings → Domains
The catch
Both stores are reachable during propagation, so orders can land in WooCommerce after you think you have moved. Disable its checkout for the window.
- 1.5 hShopify docs
Remove the password, verify, submit the sitemap
Turn off payment test mode, set the primary domain, remove the storefront password, and submit the auto-generated sitemap in Search Console. Then click through your highest-traffic old URLs and confirm each 301s.
WhereOnline Store → Preferences · Google Search Console
The catch
301s are cached by browsers and search engines: a wrong redirect published at launch persists in caches after you fix it. Walk the top URLs by hand.
Phase 06 · 1 h
After the switch
- 1 hShopify docs
Invite customers, retire hosting later
On legacy accounts, send account invites (valid 30 days); on new accounts, nothing is needed. Keep the old server publicly readable until image counts reconcile, then decommission, and keep a final database backup.
WhereCustomers → Send account invite
The catch
Kill WordPress hosting before Shopify has fetched every image and you get permanent gaps. Keep it alive, read-only, for a grace period.
What does not come with you
Be wary of any guide that says everything moves. These are the things that do not, and what to do about each one.
Customer passwords
Passwords are encrypted outside Shopify and no export carries them.
Instead: Use Shopify’s new customer accounts: sign-in is a one-time email code, so there is no password to lose. On legacy accounts, send invites.
Saved cards and subscriptions
Card data is PCI-scoped. Full card migration needs Shopify Plus plus Shopify’s own Professional Services; wallets and PayPal billing agreements are excluded outright.
Instead: Token migration on any plan: your Stripe/Braintree/PayPal account connects as a secondary gateway billing existing contracts. Shopify’s own wording: full migration “can take months or even years”.
Gift card balances
Shopify’s gift card CSV cannot create cards, and exports reveal only the last four characters of codes.
Instead: A scripted import via the gift card API. The required scopes are granted by Shopify support on request.
Product reviews
Shopify states there is no supported path for WooCommerce reviews.
Instead: Export what you can from WordPress and re-import through Judge.me’s CSV format: reviews need a body, not just stars.
Discount codes, natively
Shopify can export discounts to CSV but cannot import them.
Instead: Matrixify’s Discounts sheet imports code and automatic discounts.
Page-builder layouts
Elementor and Divi layouts are WordPress post-meta blobs with no Shopify representation.
Instead: Rebuild in Online Store 2.0 sections. Budget it as design work, not migration.
Custom post types and ACF fields
Shopify has no arbitrary post types, and metaobjects get no automatic front-end routing.
Instead: Model them as metaobjects and metafields under Settings → Custom data, and build the templates that render them.
Extra customer addresses
Shopify’s customer CSV carries only the default address.
Instead: Push additional addresses via the Admin API, or let customers re-add them.
Your URLs, mapped.
WooCommerce and Shopify disagree about URL shapes, so every old address needs a 301 to its new home. This is the mapping.
| WooCommerce | Shopify | Note |
|---|---|---|
| /product/linen-throw/ | /products/linen-throw | The default permalink shape. Handles usually survive; Shopify drops the trailing slash. |
| /shop/bedding/linen-throw/ | /products/linen-throw | Shop-base permalinks: export the live URLs from a crawl, because WooCommerce 10.5 changed which category appears in the path. |
| /product-category/bedding/ | /collections/bedding | |
| /product-category/clothing/hoodies/ | /collections/hoodies | Shopify collections do not nest, so every level of a category tree needs its own row. |
| /product-tag/casual/ | /collections/casual | Needs a matching collection; Shopify has no tag archive route. |
| /shop/page/2/ | (not reliably redirectable) | Path-segment pagination cannot be redirected to query-string pagination, so let these 404. |
| /about-us/ | /pages/about-us | |
| /2024/03/how-we-weave/ | /blogs/news/how-we-weave | Date-based permalinks produce no reusable pattern, so every post gets an explicit row. |
| /my-account/ | /account | |
| /sitemap_index.xml | /sitemap.xml | Shopify generates its own sitemap; resubmit it in Search Console. |
Your plugins, matched.
- Yoast SEO / Rank MathShopify SEO (built in)
Titles, metas and the sitemap are built in, but there is no keyword analysis and the sitemap is not editable.
- Elementor / DiviTheme sections or PageFly
Zero layout transfers: rebuild in theme sections, or accept that PageFly/Shogun reintroduce builder lock-in.
- WooCommerce SubscriptionsShopify Subscriptions / Recharge
Products move; contracts and payment tokens do not. Plan the payment-method migration separately.
- WooCommerce BookingsSesami and similar apps
No native Shopify booking feature; existing bookings do not migrate.
- WooCommerce MembershipsAppstle Memberships
Shopify has no native content gating; LMS-style content moves off-platform.
- Native product reviewsJudge.me / Loox
Reviews with a rating only cannot be imported into Judge.me, since a body is required.
- Klaviyo / Mailchimp for WooSame tool, Shopify app
Lists port cleanly; every automation flow is rebuilt by hand.
- Stripe / PayPal gatewaysShopify Payments
Anything not processed through Shopify Payments (or PayPal Express / Shop Pay) carries an extra per-transaction fee.
- Advanced Custom FieldsMetafields + metaobjects
No automated bridge: field definitions are re-modelled by hand, and metaobjects get no page routing for free.
- Wordfence / WP Rocket / backupsNothing
Not needed at all: hosting, CDN, caching and PCI compliance are Shopify’s problem now.
What goes wrong.
What catches people on a WooCommerce move, why each one happens, and how to get ahead of it.
Your entire order history emails itself to your customers
Why: Historical order imports fire order-confirmation emails unless notifications are off and the import tool’s receipt flags are false.
Avoid it: Deactivate new-order notifications in Settings → Notifications before the order import, keep Send Receipt false, and test five orders on a development store first.
Product images silently disappear weeks after launch
Why: Shopify fetches product images from your WordPress server asynchronously; cancelling hosting or enabling hotlink protection breaks fetches still in flight.
Avoid it: Keep WordPress hosting live and publicly readable until every image is confirmed in Shopify, plus a grace period.
Every collection is empty after import
Why: Shopify’s product export has no Collection column, and its import only honours one you add by hand.
Avoid it: Map WooCommerce categories into an added Collection column, or import collections with Matrixify.
A re-import wipes fields you had already fixed
Why: With “overwrite products with matching handles”, blank columns overwrite live data with blanks.
Avoid it: Delete columns you don’t mean to change rather than leaving them empty, and export a rollback first.
Variants get new IDs and every integration breaks
Why: Changing option values in a CSV deletes existing variant IDs and creates new ones.
Avoid it: Freeze option values once fulfilment or ERP integrations are connected; make option edits only pre-launch.
Half your redirects silently do nothing
Why: Shopify redirects only fire on URLs that would 404, ignore several reserved paths, and handle query strings unreliably.
Avoid it: After the import, crawl your top-traffic old URLs and assert a 301 on each, and don’t trust the import summary.
Paginated category pages vanish with no redirect possible
Why: WooCommerce paginates with a path segment (/page/2/); Shopify uses a query string, which redirects cannot reliably target.
Avoid it: Accept paginated URLs as unrecoverable and make sure the base category URL redirects cleanly.
Orders land in the old store during cutover
Why: DNS propagation leaves both stores reachable for up to 48 hours, so orders can still land in WooCommerce.
Avoid it: Drop TTL to 300 a week before launch and disable WooCommerce checkout for the propagation window.
Or hand the whole list to someone who has done it.
Send your store URL and you get back a fixed price and a plan for your store specifically: SKU count, which plugins have Shopify equivalents, the redirect plan, and the risks we can see.
Get my free migration plan