The best way to map product URLs from WooCommerce to Shopify is to crawl every product URL, match each to its new Shopify URL, and apply the 301 redirects in bulk before launch. The two platforms structure URLs differently, so every single product URL changes the moment you switch, and each one needs a redirect or it loses its rankings. The reason to do it from a crawl rather than by hand is simple: a crawl is both faster and complete, and completeness is what protects the store. WPBuildAI crawls the store and builds the full product redirect map automatically.
If you are pulling the source list straight from the store, note that WooCommerce 11.0, due 28 July 2026, changes how the Store API handles product collection-data counts by limiting and de-duplicating those requests, which is worth knowing before you point a scraper at a large catalogue.
Why every product URL changes between the platforms
The two platforms cannot agree on where a product lives, and there is no setting to reconcile them. WooCommerce typically serves products under a /product/ base, so an item sits at something like /product/merino-base-layer/. Shopify uses /products/, and often prefixes the collection too, so the equivalent becomes /products/merino-base-layer or /collections/base-layers/products/merino-base-layer. Even when the slug survives intact, the path around it changes, so the full URL is new and the old one stops resolving. Because this is structural rather than configurable, you cannot avoid it by tweaking settings; you plan for it with a complete redirect map. That guarantee, every product URL changes, is what makes the crawl-and-map approach non-negotiable rather than optional.
Why every product URL needs its own redirect
Product pages rank and attract links individually, so they cannot ride on a category redirect. Google’s redirects guidance is clear that a 301 is what passes ranking signals to a new URL, and a product page without one simply 404s and forfeits its position and any backlinks pointing at it. Since products are usually the largest group of pages in a store, often the great majority, skipping them means breaking most of the site while believing the migration is done. Redirecting the categories does not cover the products beneath them, because each product is its own URL with its own equity. Categories are a separate job, covered in what happens to categories moving to Shopify; products get their own complete map.
How the matching actually works
The map’s new-URL column gets filled by matching old products to new ones on a shared key. The most reliable key is SKU, since it is meant to be unique and stable across the move, so a SKU-to-SKU match is the backbone of an automated map. Where SKUs are missing or inconsistent, the product slug is the next-best key, because Shopify often preserves the slug even as it changes the path, making the match mechanical. Product title is the fallback, useful but riskier, since titles can be duplicated or lightly edited. A good automated pass tries SKU first, then slug, then title, and flags anything it could not confidently match for human review. That tiered matching is what fills most of the map by machine while surfacing the rows that need a person.
Building the map fast and complete
The speed comes from automation, the completeness from the crawl:
- Crawl every product URL from links and the sitemap, so none are missed, including out-of-stock and unlinked products.
- Match each to its new Shopify URL by SKU, then slug, then title, which fills most of the map automatically.
- Review the edge cases, the merges, splits, bundles, and discontinued products the match flagged.
- Apply the 301s in bulk before launch, each as a single hop to the final URL.
- Verify a sample after launch, weighted toward your best-selling and best-ranking products.
The full method follows Google’s site move guidance, and the spreadsheet form of all this is the URL mapping template.
A worked example: 800 products matched by SKU
Picture a store with 800 products migrating to Shopify. A crawl returns every product URL, and because the catalogue has clean SKUs, a SKU-to-SKU match resolves roughly 760 of them automatically, slug and title matching pick up another 20, and 20 are flagged: a few bundles that became single products, some discontinued items, and a handful with duplicate titles. You hand-resolve those 40 flagged rows, apply all 800 redirects in bulk, and after launch verify the top 50 by revenue individually plus a random sample of the rest. What would have been days of manual spreadsheet work becomes an afternoon, and crucially nothing is missed, because the crawl found every URL and the match handled the bulk, leaving only genuine judgement calls for a person.
The products automated matching gets wrong
Automation handles the clean majority; the value of a human pass is the messy minority. Bundles and kits that existed as one WooCommerce product but split into several Shopify products, or vice versa, have no clean one-to-one match. Products whose SKUs were reused or left blank confuse a SKU match. Near-duplicate titles, “Blue T-Shirt” appearing for three different lines, can match to the wrong destination. And variants modelled as separate WooCommerce products but consolidated into one Shopify product with options need their old URLs all pointing at the single new product. These are exactly the rows a tiered match should flag rather than guess, and they are where a careless bulk map quietly sends customers and link equity to the wrong place.
Handling discontinued products
Redirect a discontinued product to its closest equivalent or its parent collection with a 301, so the link equity and the visitor both land somewhere useful, a newer model, a similar item, or at least the right collection. Only return a 404 or 410 when there is genuinely no relevant destination, and record that decision in the notes. The mistake to avoid is blanket-redirecting every discontinued product to the homepage, which search engines treat as a soft 404 and which strands the customer as well. A discontinued product still earned rankings and links while it sold, so a thoughtful redirect preserves that value where a homepage dump throws it away. The broader store move is in migrating a WooCommerce store without losing sales.
Do not skip variants and out-of-stock products
Two groups get forgotten because they are not front-of-mind, and both can carry traffic. Out-of-stock products often still rank and still receive links, so their URLs need redirects even though they are not currently selling; dropping them because they are unavailable today loses the position they will want back when restocked. Variants modelled as their own WooCommerce URLs, separate pages for each size or colour, each need to point at the consolidated Shopify product. A crawl surfaces both groups because it follows every URL regardless of stock status, which is precisely why building the list from a crawl beats building it from your current product feed, which may omit the unavailable and the variant URLs entirely.
Prioritising verification
You cannot hand-verify 800 redirects, so you verify by value. Ahrefs found in its search traffic study that a small share of pages drives most traffic, so prioritise verifying your best-selling and best-ranking products individually, then sample the rest. Pull the priority order from your analytics, revenue, sessions, or organic impressions, and confirm each top product returns a single clean 301 to the correct new URL. A wrong redirect on a flagship product is a measurable loss; a wrong redirect on a product no one visited barely registers. The point is to spend verification effort where a mistake would actually cost money, rather than checking every row with equal care or, worse, none.
Preserving internal links and structure
Redirects keep the old URLs reachable, but rankings also depend on the new store linking to its products well. Backlinko’s analysis of 11.8 million search results underlines how much internal linking and structure matter, so make sure your new Shopify products sit in the right collections and are linked from navigation, related-product modules, and any content that referenced them. A product that is redirected but then orphaned, reachable only via the redirect, with nothing on the new site linking to it, loses some of the strength the redirect was meant to preserve. Whether a product page keeps its rankings through a move is the subject of do product pages lose rankings when migrating, and internal linking is a large part of the answer.
Common mistakes mapping product URLs
The recurring errors are predictable. Redirecting categories and assuming the products are covered leaves most of the store’s URLs broken. Building the list from the current product feed instead of a crawl omits out-of-stock and variant URLs. Letting an automated match guess on bundles and duplicate titles sends customers to the wrong product. Blanket-redirecting discontinued products to the homepage manufactures soft 404s. And skipping post-launch verification means a broken redirect on a flagship product goes unnoticed until sales drop. Each comes from treating product mapping as a quick bulk action rather than a crawl-driven map with a reviewed minority, which is the approach that actually keeps the catalogue intact.
Key points to remember
Every product URL changes between WooCommerce and Shopify, so each needs its own 301; redirecting categories does not cover products, which are usually most of the store. Build the map from a crawl so out-of-stock and variant URLs are included, match by SKU then slug then title, and hand-resolve the flagged bundles, duplicates, and splits. Redirect discontinued products to the closest relevant page rather than the homepage, apply every redirect as a single hop, and verify after launch weighted toward your highest-value products. Preserve internal links so the redirected equity has somewhere to flow. WPBuildAI crawls the store and builds the full product redirect map automatically, so the move is fast and nothing is left broken; send your store URL for a fixed quote.
Not affiliated with WooCommerce, Shopify, WordPress, or Lovable.