The migration in one paragraph
Shopify to WooCommerce migrations are SEO-risky because the URL structures don't match (Shopify uses /products/{handle}, WooCommerce uses /product/{slug}), schema implementations differ, and Shopify's app-injected JSON-LD has to be recreated by hand. The fix is structural: lock URL slugs before content migration, map every old URL to a new one in writing, build server-level 301 redirects (not plugin-based), recreate Product/Offer schema explicitly, and monitor GSC daily for the first 30 days. A clean migration loses 0–5% of traffic in the first 60 days; a sloppy one loses 30–50%.
Why this migration is structurally SEO-risky
Shopify and WooCommerce solve the same business problem with very different technical foundations. The migration touches every SEO surface simultaneously: URLs change, schema implementations change, internal-link patterns change, page-render mechanics change, and ownership of edge-CDN behaviour changes. Each individually is recoverable; together, they create the largest SEO-risk surface most operators ever take on.
The default outcome — a migration done by a developer without an SEO continuity plan — loses 30–50% of organic traffic in the first 90 days. We've measured this on Canadian e-commerce sites multiple times. It's preventable, but only with deliberate work in advance.
URL mapping: the foundation step
Before any code work begins, you need a written 1:1 map of every old URL to its new URL. Export your existing Shopify URLs from a full crawl (Screaming Frog, Sitebulb, or a sitemap export). Categorize them:
- Product pagesShopify: /products/{handle}. WooCommerce default: /product/{slug}. Decide whether to keep WooCommerce default or change to /products/{slug} via permalink settings — keeping the path segment identical reduces redirect surface significantly.
- Collection pagesShopify: /collections/{handle}. WooCommerce: /product-category/{slug}. Almost always different. Map each collection to its new category URL explicitly.
- Blog postsShopify: /blogs/{blog-handle}/{article-handle}. WooCommerce / WordPress: typically /blog/{post-slug} or /{post-slug}. Decide upfront.
- Static pagesShopify: /pages/{handle}. WooCommerce: /{page-slug}. Mostly clean migrations; just map them.
- Orphaned legacy URLsOld promo pages, retired products, archived collections. Decide: redirect to nearest equivalent, redirect to category parent, or 410 Gone (only if truly retired and you don't want them to ever return).
If you can't produce the URL map as a spreadsheet before launch, you don't have a migration plan — you have a launch and a hope.
Redirect strategy: server-level, not plugin-based
Plugin-based redirects (e.g. Redirection for WordPress) are convenient but slow at scale. Every redirect requires a database query before the response. For a 2,000-product catalogue, this adds noticeable latency to crawl behaviour and can cost you crawl budget.
The correct architecture: implement redirects at the server level (Nginx, Apache, or your CDN layer) using a flat redirect map. The plugin layer becomes a fallback for edge cases. WP Engine, Kinsta, and most managed WooCommerce hosts support this natively.
- Bulk-import the URL mapIf using server-level: generate the redirect block from your URL map spreadsheet. If using plugin-based: bulk-import via CSV (Redirection plugin supports this).
- Use 301s, not 302s302 is temporary and doesn't pass equity. 301 is permanent and does. Almost every product/collection redirect should be 301.
- Redirect www and non-www, http and httpsPick one canonical (usually https://www. or https://). Force-redirect everything else to it. Don't rely on the new platform's defaults — verify.
- Test in stagingBefore go-live, run a crawler against the staging environment with the redirect rules active. Verify every URL in the map resolves to its target with a single 301 hop, not a chain.
Schema continuity for product pages
Shopify themes inject Product + Offer + AggregateRating schema automatically. WooCommerce does not, by default — you'll need a plugin (RankMath, Yoast SEO Premium, or Schema Pro) or custom implementation.
On launch day, every product page should have at minimum: Product, Offer (with price + currency = CAD), Brand, and Description. AggregateRating if you have reviews; SKU if applicable. Test 3–5 representative product pages with Google's Rich Results Test before announcing go-live.
Internal-link continuity
Shopify's automatic 'Related products', 'You may also like', and breadcrumb modules disappear in a WooCommerce migration. The links they generated were doing real work for crawl distribution and PageRank flow. Recreate them deliberately:
- BreadcrumbsEnable breadcrumbs site-wide via your SEO plugin or theme. Add BreadcrumbList schema. Verify they appear on product, collection, and blog pages.
- Related products moduleConfigure WooCommerce 'Up-Sells' and 'Cross-Sells' for high-traffic products. For categories, use a related-products plugin or a custom block.
- Footer + nav linksAudit pre-migration nav and footer for any links that were doing equity work. Recreate them; don't let the new theme defaults reset your information architecture.
Go-live day checklist
- Submit new sitemap to GSC immediatelyGSC will start re-crawling within hours. Old sitemap stays live for ~7 days post-migration so Google can re-discover URLs.
- Verify robots.txtNew site should allow crawling. The most common day-1 mistake is forgetting to remove the staging-environment Disallow: / rule.
- Force-recrawl high-value pagesTop 50 commercial-intent URLs: submit each via GSC URL Inspection → Request Indexing.
- Check the canonical situationEvery product page should canonical to itself. Common bug: WooCommerce + duplicate-content plugin combinations canonicaling to a parent category.
- Test 3 redirect chainsPick 3 random old URLs. Verify each resolves to its new URL with exactly one 301, not two.
- Submit all hreflang variantsIf you have French + English Canadian variants, verify hreflang annotations on launch day.
30-day post-launch monitoring plan
Migration impact shows up gradually. Track these metrics daily for the first 14 days, weekly for the next 16. Anything outside expected variance gets investigated within 24 hours.
| Metric | Where to check | Expected behaviour | Action threshold |
|---|---|---|---|
| Total impressions (GSC) | Performance → Last 28 days vs previous | Stable to +5% | Investigate at -10% |
| Total clicks (GSC) | Performance → Last 28 days vs previous | Stable to +5% | Investigate at -10% |
| 404 count | GSC → Pages → Not found | Climbs day 1–7, drops by day 14 | Investigate if growing past day 14 |
| Indexed pages | GSC → Pages → Indexed | Climbs steadily for 28 days | Investigate if flat |
| Core Web Vitals (CRUX) | GSC → Core Web Vitals | Stable to improving | Investigate at any regression |
| Top-50 keyword rankings | Rank tracker | Volatility week 1, recovery weeks 2–4 | Investigate any sustained drop > 3 positions |
Frequently Asked Questions
Operator questions about Canadian SEO-safe migrations.
