Shopify · URL mapping, redirect imports and crawl comparison
Moving from WooCommerce or BigCommerce to Shopify changes more than your ecommerce platform. Shopify uses fixed URL prefixes, so existing URLs need new paths and a 301 redirect to reach them.
The risk does not end when products appear in the new store. A redirect CSV can import without errors and still send old URLs to the wrong destination. Internal links can keep pointing to retired paths, and product pages can lose their title tags, meta descriptions or indexability without anyone noticing until organic traffic drops.
Quick answer: A reliable Shopify SEO migration needs two checks. Before launch, map every old URL to Shopify's /products/, /collections/, /pages/ and /blogs/ structure and import the redirects. After launch, crawl the old URL list and compare it against a baseline crawl to prove each URL resolves in one 301 hop to an indexable page.
Why Shopify migrations create SEO problems
Shopify migrations break SEO mainly because Shopify does not let you choose your URL structure. WooCommerce permalinks and BigCommerce routes can be customized almost freely. Shopify assigns every resource type a fixed path prefix, so very few old URLs survive unchanged.
That single constraint causes a chain of technical SEO problems:
- Changed content paths: every product, category, blog post and static page moves to a new URL, which breaks the link between ranking pages and their backlinks unless a 301 redirect bridges the gap.
- Lost metadata: title tags, meta descriptions, image alt text and structured data often fail to transfer through import apps, or land in the wrong fields.
- Broken internal links: product descriptions, blog posts and menus imported from the old platform still contain hardcoded links to old paths.
- Duplicate URLs: Shopify exposes products under both /products/handle and collection-nested paths, creating duplicate signals that did not exist on the old store.
- Inaccessible pages: pages without a Shopify equivalent, such as filtered category views or custom landing templates, can disappear and return 404 errors.
None of these problems show up as errors in the Shopify admin. They only surface when you crawl the old and new sites and compare the results.
Map WooCommerce and BigCommerce URLs to Shopify
URL mapping is a one-to-one translation from every indexable source URL to its closest Shopify equivalent. Start with a full crawl of the old store, then add URLs from the XML sitemap, Google Search Console and analytics landing pages, so you also capture orphaned pages that still earn traffic or backlinks.
Common source-to-destination patterns
These patterns are illustrative. Real source paths depend on permalink settings, routing plugins and historical URL changes on the old platform.
| Content type | WooCommerce source | BigCommerce source | Shopify destination |
|---|---|---|---|
| Product | /product/blue-shirt/ | /blue-shirt/ | /products/blue-shirt |
| Category | /product-category/shirts/ | /categories/shirts/ or /shirts/ | /collections/shirts |
| Subcategory | /product-category/shirts/linen/ | /shirts/linen/ | /collections/linen-shirts |
| Product tag | /product-tag/summer/ | Not applicable | /collections/summer |
| Blog post | /2024/05/care-guide/ or /care-guide/ | /blog/care-guide/ | /blogs/news/care-guide |
| Static page | /about-us/ | /about-us/ | /pages/about-us |
| Brand page | Plugin dependent | /brands/acme/ | /collections/acme |
| Paginated category | /product-category/shirts/page/2/ | /shirts/?page=2 | /collections/shirts?page=2 |
Three mapping rules that prevent most errors
- Keep handles identical where possible. If the WooCommerce slug is blue-shirt, set the Shopify handle to blue-shirt before you build redirects, so mapping stays predictable.
- Flatten nested categories deliberately. Shopify collections have no parent and child paths, so a category tree becomes a flat list of collections with unique, descriptive handles.
- Map by intent, not convenience. A retired subcategory should redirect to the closest relevant collection, never the homepage.
WooCommerce variations are usually query parameters on the parent product, while BigCommerce can expose SKU-level URLs. Shopify selects variants with ?variant= IDs on the product URL, so most variant URLs should map to the parent /products/ handle.
Prepare a Shopify redirect CSV
Shopify bulk imports redirects from a CSV with two columns, Redirect from and Redirect to, under Online Store > Navigation > URL Redirects > Import. An accepted file does not mean every row works, so validate it before upload.
Redirect from,Redirect to /product/blue-shirt/,/products/blue-shirt /product-category/shirts/,/collections/shirts /categories/shirts/,/collections/shirts /2024/05/care-guide/,/blogs/news/care-guide /about-us/,/pages/about-us
Validate the file before import
- Relative source paths: the Redirect from value should start with /, not include the old domain.
- Absolute versus relative destinations: use relative paths for destinations on the same store and keep absolute URLs for genuinely external targets.
- Duplicate source entries: one source path can only have one destination, and duplicates fail or overwrite each other silently.
- Missing or malformed destinations: empty cells, stray spaces, encoded characters and leftover spreadsheet formulas produce broken rows.
- Trailing slash and case variants: confirm which version the old site served and earned links on, and include it.
- Chains and loops: a row whose destination is another row's source creates a chain, so point every row at its final destination.
- Source paths that already exist: Shopify only applies a redirect when the path does not resolve to live content. A source path that matches a live product, collection or page never fires, so rename or remove the conflicting resource instead.
For import troubleshooting, handle changes and deleted-product behavior, see Shopify URL redirects.
Audit Shopify's forced URL structure
Shopify's URL prefixes are fixed for core resources. Plan the migration around them rather than trying to reproduce the old structure.
| Resource | Required path | What you control |
|---|---|---|
| Product | /products/{handle} | The handle only |
| Collection | /collections/{handle} | The handle only |
| Page | /pages/{handle} | The handle only |
| Blog article | /blogs/{blog-handle}/{article-handle} | Both handles |
Canonical product URL versus collection-nested URL
Many themes link to products as /collections/shirts/products/blue-shirt from collection pages. That URL renders the same product as /products/blue-shirt, and Shopify adds a canonical tag pointing to the /products/ version.
Canonicalization and redirects solve different problems. The canonical tag tells search engines which duplicate to index. A redirect moves users and link equity away from a URL that should no longer exist. Collection-nested URLs are live, functional paths, so they need correct canonicals and cleaner internal linking, not redirects.
On a sample of products, confirm that:
- The /products/ URL has a self-referencing canonical tag.
- Collection-nested URLs canonicalize to the /products/ URL, not to themselves.
- The collection grid links directly to /products/ URLs where the theme allows it.
Variant URLs and duplicate handling are covered in Shopify duplicate product URLs.
Detect redirect failures after import
A URL that returns a redirect is not necessarily a correctly migrated URL. Redirect existence only proves Shopify accepted the row. Redirect correctness proves the old URL lands on the intended page, and that page can rank.
Test every source URL in your mapping file, not a sample. For each one, check:
- Status code: the first response is a 301, not a 302, a 200 or a 404.
- Final destination: the resolved URL matches the Redirect to value exactly.
- Destination status: the final URL returns 200.
- Hop count: one hop. Two or more means a redirect chain.
- Indexability: the destination is self-canonical with no noindex directive.
Status: 301
Location: /products/blue-shirt
Status: 200
Canonical: self
Redirect failures to flag, in order of SEO impact
| Failure | Typical cause | Corrective action |
|---|---|---|
| Old URL returns 404 | Row missing from CSV, or skipped on import | Add the row and re-import |
| Old URL returns 200 | Source path matches a live Shopify resource | Rename or remove the conflicting resource |
| Redirect to homepage | Fallback rule for unmapped products | Map to a relevant product or collection |
| Redirect to 404 | Destination handle changed or misspelled | Update the destination to the live handle |
| Redirect chain | Handle renamed after import | Point the original row at the final URL |
| Redirect loop | Two rows redirect to each other | Remove one of the rows |
| Redirect to non-indexable page | Destination has noindex or a canonical elsewhere | Choose an indexable destination |
Run a pre-launch and post-launch SEO comparison
The before-and-after crawl comparison is how you prove the migration preserved your technical SEO. Crawl the old store before it goes offline and save it as the baseline. Crawl the Shopify store on staging before launch, then again on the live domain within 24 hours of DNS cutover.
Pair each old URL with its new one using the mapping file, then compare:
| Signal | What a regression looks like |
|---|---|
| Page coverage | Old URLs with no mapped Shopify equivalent |
| Status codes | Pages that returned 200 and now return 404, chains or 5xx |
| Indexability | Pages that now carry noindex or are blocked by robots.txt |
| Canonical tags | Canonicals pointing to the staging domain, the old domain or another product |
| Title tags | Titles replaced by product names only, truncated or duplicated |
| Meta descriptions | Missing, or auto-generated from product body text |
| H1 headings | Missing, duplicated or wrapped around the logo by the theme |
| Internal links | Links to old paths that redirect or return 404 |
| Structured data | Product, Offer or Review markup missing from templates |
Unique titles: 1,238
Product schema: 980
Unique titles: 1,104
Product schema: 0
The staging crawl catches most problems while they are cheap to fix. Two issues only appear after launch: canonical tags still referencing the myshopify.com domain, and password protection or robots rules left over from staging. Fix internal links at the source, so menus, descriptions and blog content point straight at final Shopify URLs.
Shopify migration issues that require manual checks
Some URLs cannot be mapped by pattern. They need a decision about where the old page's value should go.
- Query parameters: separate parameters that change content, such as variant selection, from tracking parameters like utm_source. Test how Shopify handles parameterized source URLs, and never strip parameters that select a variant.
- Variant URLs: SKU-level and variation URLs usually map to the parent product, unless a variant earned its own rankings.
- Filtered collections: redirect high-traffic faceted URLs to a dedicated collection, and let low-value ones resolve to the parent collection.
- Deleted products: redirect to a direct replacement or the most relevant collection. Homepage redirects are usually treated as soft 404s.
- Retired categories: merge them into the closest surviving collection and update the links that pointed to them.
- Pagination: paginated category URLs rarely need individual redirects. Check that page one maps correctly and that ?page= URLs are crawlable.
- Language and market paths: map old /fr/ or /de/ subfolders to Shopify Markets subfolders and verify hreflang after launch.
- Pages with no replacement: old account, cart and plugin pages can return 404 or 410 unless they earned backlinks.
Monitor technical SEO after the migration
A Shopify migration is not finished at launch. Monitor for eight to twelve weeks, until Google has recrawled most old URLs and rankings stabilize.
- Prioritize by business value. Rank open errors by the traffic and revenue each source URL earned before migration.
- Rerun the crawl weekly. Compare each crawl against the original baseline, not just last week, so slow regressions stay visible.
- Check Google Search Console. Watch Page indexing for spikes in Not found (404), Page with redirect and Duplicate without user-selected canonical. Submit /sitemap.xml on launch day.
- Track app and theme changes. New apps and theme edits can quietly remove metadata. See SEO after a theme update.
- Keep migration redirects permanently. Old backlinks keep sending users and crawlers to legacy URLs for years.
Downloadable checklist
Tick items as you work, then download the list as CSV for a spreadsheet or ticket, or print it and save as PDF. Your ticks and the corrective action for each check are included in the download.
Frequently asked questions
Can you keep WooCommerce URLs when moving to Shopify?
No. Shopify requires fixed prefixes such as /products/ and /collections/, so paths like /product/blue-shirt/ cannot be reproduced. Keep the same slug as the Shopify handle and 301 redirect the old path.
Why do Shopify product URLs require the /products/ prefix?
Shopify routes each request by resource type, and the prefix tells it which template and data to load. You can edit the handle after the prefix, but not the prefix itself.
How do you redirect WooCommerce categories to Shopify collections?
Add one CSV row per category, such as /product-category/shirts/ to /collections/shirts. Nested subcategories need their own flat collection handles.
How do you import redirects into Shopify using a CSV?
Create a CSV with Redirect from and Redirect to columns and upload it in Online Store > Navigation > URL Redirects > Import. Validate duplicates, malformed paths and existing source paths first.
How do you check whether a Shopify redirect import worked?
Crawl every source URL from your mapping file and confirm a single 301 to the intended destination, which returns 200 and is indexable. The import confirmation alone does not prove this.
What happens when a Shopify product is deleted?
Its URL returns a 404 unless you add a redirect. Redirect it to a replacement product or relevant collection if it had traffic or backlinks.
Should collection-nested product URLs redirect to the canonical product URL?
Usually not. They are live paths that Shopify canonicalizes to /products/handle. Confirm the canonical is correct and link to /products/ URLs directly.
How do you find broken redirects after a Shopify migration?
Crawl the full old URL list against the live store and flag 404s, chains, loops, homepage redirects and non-indexable destinations. Cross-check the Not found report in Search Console.
How do you compare SEO data before and after migrating to Shopify?
Save a baseline crawl of the old store, crawl the new store, and pair URLs with your mapping file. Compare status codes, indexability, canonicals, titles, descriptions, H1s and internal links for every pair.