appbespoke

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.

Start the checklist

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

    Where

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

    Shopify docs ↗ · Shopify docs ↗

Phase 02 · 2 h

Get your data out

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

    Where

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

    WooCommerce docs ↗

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

    Where

    WooCommerce → 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.

    WooCommerce docs ↗

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

    Where

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

    WordPress docs ↗

Phase 03 · 16.5 h

Build in parallel

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

    Where

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

    Shopify docs ↗ · Shopify docs ↗

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

    Where

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

    Shopify docs ↗

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

    Where

    Settings → 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.

    Shopify docs ↗ · Matrixify docs ↗

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

    Where

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

    Shopify docs ↗

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

    Where

    Settings → 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.

    Shopify docs ↗

Phase 04 · 3 h

Keep your rankings

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

    Where

    Content → 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.

    Shopify docs ↗ · WooCommerce dev blog ↗

Phase 05 · 2.5 h

Cut over

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

    Where

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

    Shopify docs ↗ · Shopify docs ↗

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

    Where

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

    Shopify docs ↗

Phase 06 · 1 h

After the switch

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

    Where

    Customers → 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.

    Shopify docs ↗

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.

WooCommerceShopify
/product/linen-throw//products/linen-throw
/shop/bedding/linen-throw//products/linen-throw
/product-category/bedding//collections/bedding
/product-category/clothing/hoodies//collections/hoodies
/product-tag/casual//collections/casual
/shop/page/2/(not reliably redirectable)
/about-us//pages/about-us
/2024/03/how-we-weave//blogs/news/how-we-weave
/my-account//account
/sitemap_index.xml/sitemap.xml

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