WooCommerce let you invent your own URL structure, stack categories 3 levels deep, and bolt on a plugin for every need. Shopify hands you its structure and you work inside it. That gap is where a migration is won or lost, and it's the part most projects leave for last.
I've already written a general guide on how to migrate to Shopify without losing your rankings. This one digs into the WooCommerce case, which has traps of its own.
what changes under the hood
On WooCommerce, a product is a WordPress post type and a category is a taxonomy. Both inherit WordPress logic: hierarchy, editable permalinks, everything is up for grabs.
Shopify runs a closed model. A product lives under /products/, a collection under /collections/, a page under /pages/, an article under /blogs/blog-name/post-title. You control the handle. The prefix is fixed.
So every URL on your site changes, including the ones whose slug stays identical. A /product/linen-jacket/ becomes /products/linen-jacket. Same words, different address, 404 if you do nothing.
the 301 redirect map, pattern by pattern
Here are the mappings I set up on a standard WooCommerce project.
| Old WooCommerce URL | New Shopify URL |
|---|---|
/product/linen-jacket/ | /products/linen-jacket |
/shop/ | /collections/all |
/product-category/jackets/ | /collections/jackets |
/product-category/jackets/linen/ | /collections/jackets-linen |
/product-tag/sale/ | /collections/sale |
/terms-and-conditions/ | /pages/terms-and-conditions |
/2025/03/my-post/ | /blogs/news/my-post |
/cart/ | /cart |
/my-account/ | /account |
Three details that save hours.
Check your real prefixes before you generate the file. WooCommerce offers several bases under Settings, Permalinks: the classic /product/, the shop base /shop/product, or a custom base someone typed in 2 years ago. Localized installs translate those defaults, so a French or German store serves its own words where you expected product and product-category. A Screaming Frog crawl of the old site answers the question in 10 minutes.
The trailing slash counts. WooCommerce serves its URLs with a trailing slash, Shopify without. Test the behaviour on 5 rows before importing the other 2,000, it saves rebuilding the whole file.
The Shopify redirect table works on exact paths. You'll find it under Online Store, Navigation, URL Redirects, with a CSV import for volume. There's no pattern matching, so every old URL needs its own row. On a 3,000 SKU catalogue, generate that CSV with a script that joins the WooCommerce export and the Shopify product export instead of typing it out.
your nested categories don't survive
This is the harshest surprise for anyone coming from WooCommerce.
WooCommerce handles parent and child categories, with URLs that mirror the tree. Shopify collections are flat, with no parent-child relation in the data model. A collection can't contain another collection.
That leaves 3 routes. You flatten, creating one collection per leaf category with a handle that keeps a trace of the parent (jackets-linen). You rebuild the visual hierarchy in the navigation menu, which does accept several levels of nesting. Or you go through tags and automated collections when the sorting logic is simple.
On the stores I take over, flattening plus menu covers almost every case. The watch point is SEO. If your parent category /product-category/jackets/ was pulling traffic, give it its own collection with real copy on it. Redirecting it to whichever subcollection comes first throws that traffic away.
what the migration tools leave behind
Cart2Cart, LitExtension and Matrixify do the heavy lifting on products, customers, orders and categories. They don't do everything.
Customer passwords. Impossible to transfer, the two platforms don't hash the same way. LitExtension says it in plain language in its docs: no way to migrate passwords. In practice, you import the accounts and send an activation email on launch day. Write that email in advance, because without it your loyal customers land on a login form that rejects their password.
Product reviews. Shopify has no review object in its core. Your WooCommerce reviews, which are WordPress comments, have to end up in a third-party app like Judge.me or Loox, each with its own import format. No general-purpose migration tool builds that bridge on its own.
Tax settings. These live in the store configuration rather than in the data, so nothing carries them over. Your rates, your tax classes, your per-country rules all get rebuilt by hand in Shopify. Budget half a day if you handle EU VAT across several countries, and the same again if you have sales tax nexus in more than one US state.
Complicated discount codes. Simple codes come across fine. WooCommerce rules like "buy 2 get the 3rd free on this category only, sale items excluded" have no direct equivalent. On Shopify that becomes a native discount when it can, and a Shopify Function when it can't.
One last budget detail. LitExtension states that automated customer and order migration needs a Shopify Grow plan or above. If you were planning to start on the entry plan, check that point before you pay for the tool.
your plugins don't all have an equivalent
A mature WooCommerce store often runs several dozen plugins. Take that inventory early, because it's what decides whether the project is feasible at all.
The blocks that swap over painlessly: contact forms, reviews, loyalty points, SEO, popups, multi-currency. The Shopify App Store covers a lot of ground.
The blocks that jam: custom product configurators, customer-group pricing (a B2B feature on Shopify, so Plus plan or a dedicated app), homemade ERP syncs, and anything coded straight into the functions.php of your WordPress theme. That last one is the sneakiest, because nobody thinks to write it down.
For each critical plugin, note what it actually does for the customer. Half the time the answer is "nothing Shopify doesn't already do natively".
the cost, on both sides
WooCommerce is free and it costs money. You pay for hosting, for plugin licences renewed every year, for maintenance on updates, and for a developer when a WordPress update breaks the checkout.
Shopify is a monthly subscription plus transaction fees, and the server and the security patches stop being your problem. An honest comparison puts app subscriptions on the other side of the ledger, and those climb fast once you stack them. I broke down the real numbers in my article on how much a Shopify store costs.
the order of operations
The one order that avoids a traffic gap.
- Full crawl of the old site plus a Search Console export, before touching anything.
- Build the Shopify store on the
.myshopify.comURL, catalogue imported, collections created, handles locked. - Generate the redirect file from the two URL lists, with a manual pass over the pages that carry traffic or backlinks.
- Import the redirects into Shopify while the old site is still running.
- Switch the DNS, then send the account activation emails.
- Submit the sitemap in Search Console and watch the indexing report every day for 2 weeks.
Step 4 is the one people skip. Loading the redirects before the switch means that the second the domain points at Shopify, every old URL finds its target. No 404 window.
If you've already migrated and you're watching 404s climb in Search Console, it's fixable, and it gets easier the sooner you get to it. That's exactly the kind of job I look at in an audit: the redirects in place, the ones missing, and the ones pointing at the wrong page.




