All articles
E-commerceOctober 3, 2026 7 min read

Migrating from WooCommerce to Shopify Without Tanking Your SEO

A field-tested playbook for moving a WooCommerce store to Shopify while keeping organic traffic, rankings, and revenue intact. URL mapping, redirects, structured data, and the gotchas nobody warns you about.

Migrating from WooCommerce to Shopify Without Tanking Your SEO

Replatforming a store is the kind of project that looks tidy on a Gantt chart and ugly in Search Console. We've migrated a few dozen WooCommerce storefronts to Shopify over the last few years, and the pattern is consistent: the teams that treat SEO as a launch-week checkbox lose 30–60% of organic traffic for a quarter. The teams that treat it as a parallel workstream usually hold flat or gain within six weeks.

This is the playbook we actually use. It assumes you've already decided Shopify is the right destination — if you're still comparing, that's a different article.

Why WooCommerce → Shopify migrations bleed traffic

The damage rarely comes from one catastrophic mistake. It compounds from small ones:

  • URL structures don't map cleanly (/product-category/ vs /collections/, /product/ vs /products/)
  • Pagination and faceted URLs change shape, orphaning long-tail landing pages
  • Structured data silently disappears or ships with different field names
  • Internal linking from blog posts points at URLs that now 404 or chain through two redirects
  • Image URLs change, so image search traffic evaporates and CDN cache warms from zero
  • robots.txt and sitemap.xml on Shopify are partly managed by the platform, and defaults differ from what your WooCommerce SEO plugin was emitting

None of these are platform bugs. They're migration oversights. You can prevent all of them with a crawl, a spreadsheet, and discipline.

Step 1: Freeze a pre-migration baseline

Before you touch anything, capture the current state. You cannot debug what you can't compare against.

What we snapshot:

  • Full Screaming Frog or Sitebulb crawl of the live site (HTML, status codes, canonicals, hreflang, structured data, word counts)
  • Google Search Console export of top 1,000 URLs by clicks and impressions, last 16 months
  • GA4 landing page report, same window
  • sitemap.xml saved as a static file
  • Backlink export from Ahrefs/Semrush — you need to know which URLs have external equity, because those are the ones you absolutely cannot break
  • Core Web Vitals field data per template

Store all of it in a /migration-baseline/ folder in the repo. You'll reference it weekly for three months.

The URL inventory spreadsheet

This is the single most important artifact in the whole project. One row per live URL, with columns:

old_url | template_type | clicks_90d | backlinks | new_url | redirect_type | notes

template_type is critical — product, collection, blog post, CMS page, tag archive, author archive, paginated collection, filter URL. You'll map by template, not one URL at a time.

Step 2: Design the new URL structure deliberately

Shopify forces some conventions you can't change:

  • Products live at /products/{handle}
  • Collections live at /collections/{handle}
  • Blog posts live at /blogs/{blog-handle}/{post-handle}
  • Pages live at /pages/{handle}

You cannot flatten /products/{handle} to /{handle}. Accept it, map around it.

The trap most teams fall into: they let Shopify auto-generate handles from product titles, which often differ from the WooCommerce slug. If your WooCommerce URL was /product/merino-crew-navy-m/ and Shopify generates /products/merino-crew-neck-navy-medium, you now need a redirect for every single SKU. That's fine — but you want to decide the handle, not inherit it.

Our rule: match the trailing slug exactly where possible. If the old URL was /product/merino-crew-navy-m/, set the Shopify handle to merino-crew-navy-m. The path prefix changes, the identifying slug doesn't. This keeps your redirect map simple and preserves semantic continuity for anyone reading the URL.

Collections vs categories

WooCommerce categories often nest: /product-category/mens/tops/tees/. Shopify collections are flat: /collections/mens-tees. You have two reasonable options:

  1. Flatten and redirect: one Shopify collection per leaf category, 301 the parent category URLs to the most relevant child or to a navigation page
  2. Use metaobjects or a navigation page for the parent levels, which gives you a landing page at /pages/mens that can rank for the broader term

We lean toward option 2 for stores where parent categories have meaningful search volume. The CMS page can carry the H1, intro copy, and internal links down to the leaf collections.

Step 3: Build the redirect map before you build the theme

Shopify accepts bulk redirects via CSV in Admin → Online Store → Navigation → URL Redirects, or via the Admin API if you have more than a few thousand.

A few rules we enforce:

  • One hop only. No redirect chains. If you've migrated before, flatten old chains in the same CSV.
  • No wildcard redirects to the homepage. This is the single biggest traffic killer. If you can't find a direct equivalent, send it to the closest collection, not /.
  • Keep query parameters for anything with UTM or affiliate tags. Shopify's redirect engine strips them by default on some redirect types — test it.
  • Preserve trailing-slash behavior consistently. WooCommerce usually has trailing slashes; Shopify does not. Redirect /foo/ → /foo at the edge or accept the single hop.

For stores above ~10k URLs, we push redirects via the API in batches:

curl -X POST \
  "https://your-store.myshopify.com/admin/api/2025-01/redirects.json" \
  -H "X-Shopify-Access-Token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "redirect": {
      "path": "/product/merino-crew-navy-m/",
      "target": "/products/merino-crew-navy-m"
    }
  }'

Rate-limit yourself to 2 requests/second on standard plans, 20/sec on Plus. Log every failure — Shopify will reject redirects where the path already exists as a live resource.

Step 4: Rebuild structured data and metadata, don't trust defaults

Shopify themes ship with varying quality of JSON-LD. Dawn is reasonable; many third-party themes emit incomplete Product schema or none at all for collections.

Audit before launch:

  • Product schema on PDPs with offers, aggregateRating (only if you have real reviews), brand, sku, gtin where available
  • BreadcrumbList on PDPs and collections
  • Organization and WebSite on the homepage with SearchAction
  • Article schema on blog posts

If you were using Yoast or RankMath on WooCommerce, export every custom meta title and description before you shut it down. Shopify stores these as seo.title and seo.description on resources, settable via the Admin API or in bulk through tools like Matrixify.

Canonicals and pagination

Shopify auto-generates canonical tags, and they're usually correct — but check paginated collection pages. The default canonical on /collections/mens-tees?page=2 points to itself, which is fine post-Google's deprecation of rel=next/prev, but confirm your theme isn't canonicalizing all paginated pages back to page 1 (we've seen this ship by default and quietly deindex half the catalogue).

Step 5: Launch window and post-launch monitoring

We launch on a Tuesday or Wednesday morning in the store's primary timezone. Never Friday. Never before a sale.

Day-of checklist:

  • Submit new sitemap.xml in Search Console (Shopify generates it at /sitemap.xml automatically)
  • Keep the old property verified in GSC — you need to watch it decay as the new one grows
  • Spot-check 50 redirects manually, including the top 20 by backlinks
  • Run a full crawl of the new site and diff against the baseline: any URL that returned 200 before and 404 now is a bug, not a feature
  • Confirm robots.txt isn't blocking /collections/ or /products/ (laughing, but we've seen it)

The first 30 days

Expect a 10–20% dip in organic sessions in week two as Google reprocesses. If you're down more than 30% by week three, something is structurally wrong — usually a redirect chain, a canonical pointing at the old domain, or hreflang that wasn't ported. Pull your baseline crawl and diff aggressively.

Re-crawl weekly for the first month, then biweekly. Watch for:

  • Soft 404s in GSC (Shopify sometimes returns 200 on invalid product handles with an empty template)
  • Coverage report flagging "Duplicate, Google chose different canonical"
  • Index bloat from ?variant= URLs — add these to canonical rules in your theme

Where we'd start

If you're staring at this project on Monday morning, do these three things before anything else:

  1. Export the GSC top-URLs report and the full backlink profile. Everything else depends on knowing what you can't afford to break.
  2. Draft the URL mapping spreadsheet by template type, not by individual URL. Patterns scale; one-off decisions don't.
  3. Build and test the redirect CSV on a staging store with real traffic replay (we use GoReplay against a dev store) before you touch production DNS.

The teams that treat replatforming as a search project that happens to involve engineering, rather than an engineering project that happens to involve search, are the ones that come out ahead. If you want a second set of eyes on a migration plan, our e-commerce team has run this playbook end-to-end more times than we'd like to admit — and we've learned most of it the expensive way.

#Shopify#WooCommerce#SEO#Migration#E-commerce

Want a team like ours?

72Technologies builds production software for the kind of teams who actually read this blog.

Start a project