Migrating from WooCommerce to Shopify Without Tanking SEO: A Field Guide
A practical migration playbook from WooCommerce to Shopify that protects rankings, revenue, and sanity — with the redirect maps, URL quirks, and gotchas we've hit on real projects.

Replatforming is where good stores go to die. We've seen a merchant lose 40% of organic traffic overnight because someone assumed Shopify would "handle the redirects." It won't — not the way you need it to.
This is the migration playbook we actually use when moving a WooCommerce store to Shopify without torching organic revenue. It's opinionated, and it assumes you care about the six months of SEO work you already paid for.
Why WooCommerce → Shopify Breaks SEO by Default
The two platforms disagree on almost every URL convention. WooCommerce lets you shape URLs however WordPress permalinks allow: /product/blue-sneaker/, /shop/mens/blue-sneaker/, or even /blue-sneaker/ if you stripped the prefix. Shopify does not negotiate. Products live under /products/handle. Collections live under /collections/handle. Blog posts live under /blogs/{blog-handle}/{article-handle}. You cannot flatten these paths, and you cannot nest a product inside a collection URL (well, you can, but it creates duplicate canonicals — more on that later).
So every single indexed URL on the old site needs a decision: redirect, consolidate, or drop. Skipping this step is what causes the traffic cliff.
The three URL patterns that catch teams out
- Category → collection: WooCommerce categories can be nested three levels deep. Shopify collections are flat. Decide which level of the taxonomy is worth preserving as a collection, and 301 the rest into their nearest parent.
- Product variants as separate URLs: Some Woo stores expose each variant as its own permalink. Shopify variants share the parent product URL with a
?variant=query. Consolidate at the product level and let canonical tags do the rest. - Attribute pages:
/product-tag/waterproof/or/pa_color/blue/type pages. These often rank surprisingly well. Rebuild them as filtered collections or tag pages on Shopify, or 301 them into the closest collection.
The Pre-Migration Audit (Do This or Regret It)
Before anyone touches Shopify admin, pull three exports:
- Every indexed URL from Google Search Console (last 16 months of Performance data, exported by page).
- Every URL with backlinks from Ahrefs, Semrush, or the free Google Search Console links report.
- A full crawl from Screaming Frog or Sitebulb of the live WooCommerce site.
Merge these into a single spreadsheet keyed by URL. You now have a list of pages that either drive traffic, hold link equity, or exist in Google's index. Every one of them needs a target on the new store.
# Quick way to dedupe and sort a merged URL list
cat gsc_pages.csv ahrefs_pages.csv screamingfrog.csv \
| awk -F',' '{print $1}' \
| sort -u \
> all_urls_master.txt
wc -l all_urls_master.txt
In our experience, a mid-sized Woo store (5k SKUs, active blog) will produce somewhere between 8,000 and 40,000 unique URLs once you count paginated archives, attribute pages, and old blog tags. Don't panic — most of them collapse into a handful of redirect patterns.
Bucket the URLs
Sort every URL into one of five buckets:
- Direct 1:1 — product, blog post, or static page with an obvious new home.
- Consolidate — attribute pages, variant URLs, or thin categories that fold into a broader collection.
- Rebuild — pages that need net-new equivalents (custom landing pages, guides, lookbooks).
- Drop with 410 — spam-indexed URLs, old checkout params, expired campaign pages.
- Preserve as-is — anything Shopify can't host (rare, but a few WordPress-only landing pages sometimes qualify — keep them on a subdomain).
URL Structure Decisions You Can't Undo Cheaply
Blog path: /blogs/news/ is not your friend
Shopify's default blog handle is news. Every article ends up at /blogs/news/how-to-clean-suede. If your Woo blog lived at /blog/how-to-clean-suede/, you now have an extra path segment forever. You can rename the blog handle at creation (e.g. /blogs/journal/) but you cannot flatten to /blog/. Pick the handle before you import a single article.
Collections vs products in the URL
Shopify lets a product be reached via both /products/handle and /collections/{collection}/products/handle. The second form exists for merchandising, and it will get crawled if you link to it. Set the canonical to the short form (Shopify does this by default in the theme's <link rel="canonical">, but double-check your theme hasn't been modified) and only link to /products/handle from navigation and internal pages.
Trailing slashes
WooCommerce almost always uses trailing slashes. Shopify does not. That's one 301 per URL — Shopify handles it automatically at the platform level, but if you're building the redirect map yourself, normalize both sides to the same convention before diffing.
Building the Redirect Map
Shopify accepts bulk URL redirects via CSV upload in admin (Online Store → Navigation → View URL redirects) or via the Admin API. The CSV is dead simple:
Redirect from,Redirect to
/product/blue-sneaker/,/products/blue-sneaker
/product-category/mens/shoes/,/collections/mens-shoes
/product-tag/waterproof/,/collections/waterproof
/blog/how-to-clean-suede/,/blogs/journal/how-to-clean-suede
A few rules we've learned the hard way:
- Redirect to final destinations, never through chains. If Woo already redirects
/old-url/to/new-url/, redirect/old-url/straight to the Shopify equivalent. Every hop costs crawl budget and a small amount of link equity. - Test in batches of 500. Shopify's admin gets sluggish with tens of thousands of redirects in a single upload. The API is faster and more reliable at scale.
- Never 301 everything to the homepage. Google treats mass redirects to the homepage as soft 404s. If you don't have a good target, use a 410 (Shopify doesn't natively support 410s in the UI, but you can serve them via a Shopify Function or an edge worker in front of the storefront).
Handling query strings
WooCommerce loves query strings: ?orderby=price, ?filter_color=blue, ?add-to-cart=123. Shopify's redirect engine matches the path only — it ignores the query string on the source side. If a query-string URL is indexed and driving traffic, you'll need to catch it at the edge (Cloudflare Workers, Vercel, or Shopify Oxygen if you're on Hydrogen) before it hits the storefront.
Structured Data and Metadata Parity
Woo stores usually have Yoast or Rank Math generating meta titles, descriptions, and Product schema. Shopify's default theme output is thinner. Before launch:
- Export all meta titles and descriptions from Yoast (there's a CSV export in the Tools menu) and re-import them via a Shopify metafield or a dedicated app that overrides
<title>and<meta description>. - Verify Product schema on the new theme. Most modern Shopify themes include valid
ProductandOfferschema, but checkAggregateRating— if you had reviews on Woo, you need to migrate the review data and hook up an app (Judge.me, Yotpo, Loox) that outputs the schema. - Rebuild breadcrumb schema. Shopify's default breadcrumbs are inconsistent between themes. Test with Google's Rich Results Tool on a product, a collection, and a blog post before launch.
Launch Week: What Actually Matters
We run migrations on Tuesday or Wednesday mornings. Never Friday, never before a holiday.
The day-of checklist:
- Freeze content changes on the old site 24 hours before cutover.
- Final crawl of Woo to confirm no URLs slipped through the audit.
- DNS cutover with TTL dropped to 300 seconds the day before.
- Verify the Shopify store in Google Search Console before DNS switch — you can verify via DNS TXT record ahead of time.
- Submit the new XML sitemap the moment DNS propagates.
- Spot-check 50 random redirects with
curl -I— you're looking forHTTP/2 301and a cleanlocation:header. - Monitor GSC's Coverage report daily for the first two weeks. Spikes in "Not found (404)" mean redirects are missing.
# Quick redirect sanity check
while read url; do
curl -o /dev/null -s -w "%{http_code} %{redirect_url}\n" "$url"
done < sample_old_urls.txt
Expect a 10–25% dip in organic sessions in weeks 2–4 as Google reprocesses the redirect map. If you've done the work, it recovers and usually exceeds the old baseline within 8–12 weeks. If it doesn't recover, the audit missed URLs — go back to the spreadsheet.
Where We'd Start
If you're staring at a replatform kickoff next month: skip the theme conversation for now. Spend the first two weeks on the URL audit and the redirect map. Everything else — theme, apps, checkout customizations — is reversible. The redirect map is the one artifact that determines whether you keep your rankings, and it's the one thing agencies most often underestimate.
If you want a second set of eyes on a migration plan, our e-commerce team has run this exercise more times than we'd like to admit. And if you're still weighing platforms, the rest of our e-commerce writing covers the Shopify-vs-custom question in more detail.
Want a team like ours?
72Technologies builds production software for the kind of teams who actually read this blog.
Start a projectKeep reading

Inventory Sync Between Shopify and Your ERP: Why It Breaks and How to Design It Right
Every mid-market Shopify store eventually oversells or ghost-stocks its way into a support crisis. Here's how to design an inventory sync that survives Black Friday, backorders, and a flaky ERP.
Product Page LCP on Shopify: Getting Under 2.0s Without Ripping Out Your Theme
A tactical breakdown of how to cut Largest Contentful Paint on Shopify product pages to under 2.0s — without going headless, rebuilding your theme, or fighting every app you have installed.
WhatsApp Checkout in LATAM and MENA: What Actually Converts
Conversational commerce isn't a novelty in Brazil, Mexico, Egypt or the UAE — it's the default. Here's what we've learned wiring WhatsApp into real Shopify and headless stacks, and where the funnel quietly breaks.
