Shopify decides part of your URL structure for you, so every product and category URL on an existing store is going to move. The redirect map is the artefact that decides whether the rankings move with them.
By Rehan Idrisi · · 7 min read
Part of: Shopify
Moving an existing store onto Shopify changes every URL on the site. That part is unavoidable. What is avoidable is reaching launch day with a half-finished redirect map, collections that do not line up with the old categories, and a theme quietly overwriting hand-written title tags. Search visibility does not survive that combination well.
Most of the work happens before the cutover.
On a self-hosted store you can serve a product at any path you like. Shopify does not work that way. Products sit under a /products/ prefix, collections under /collections/, static pages under /pages/, and blog posts under their blog's handle. You choose the handle at the end of the path. The prefix in front of it comes with the platform, and there is no setting that removes it.
That removes an option you might otherwise reach for. On many replatforming projects the safest plan is to keep every URL identical so search engines see no change at all. Here, that plan does not exist. A store serving products at /shop/mens/shoes/runner-x cannot keep that path, which makes the old-to-new URL map the most important artefact of the project.
A redirect map assembled after the new site is live is always incomplete, and the reason is mechanical. Once the old store stops responding, the authoritative list of what it contained is gone with it. You are left reconstructing that list from a sitemap that may have been stale for months, from analytics that only show pages someone happened to visit inside the reporting window, and from Search Console, which tells you what it crawled and not what existed. Each of those sources misses pages, and they miss different ones.
Take the inventory while the old site still answers requests. Crawl it end to end, export its sitemap, pull every URL that earned an impression or a session in the last twelve months, then merge and deduplicate. Every row on that list needs a destination, or an explicit decision to let it go.
A redirect says the content moved. Recreating says the content now exists at a new address. Both are required, and the order matters. Point an old product URL at a Shopify product that has not been imported yet and the redirect lands on a 404, which drains the accumulated signal into a dead page. Import first. Confirm the destination returns 200. Then switch the redirect on.
Some old URLs have no replacement at all: a discontinued line, a category you are not carrying forward, a seasonal page that ended. Sending all of them to the homepage is the reflex, and it is a weak choice: a redirect to an unrelated page tends to be treated as a soft 404 anyway, so you lose the clean signal a real 404 or 410 would have given and gain nothing. Redirect to the closest relevant page. Where nothing is close, let the URL go.
Old category trees are usually deeper than the collection structure that replaces them. Three categories fold into one collection. A category that existed only because of how the old CMS handled navigation has no Shopify equivalent. This is the many-to-one problem, and it is where most migration maps turn sloppy.
Several old URLs pointing at a single collection is fine and often correct. The damaging version is the opposite mistake: picking one of the three old categories as the important one, mapping it carefully, and dropping the other two on the homepage because nobody checked whether they ranked. Check them. A category page with a handful of ranking queries is worth more than its traffic figure suggests, because category queries carry commercial intent that product-name queries do not.
Shopify will serve the same product at more than one URL when the visitor arrives through a collection. The product exists at /products/handle and also at /collections/collection-handle/products/handle. Same product, same content, two addresses, and the internal links on a collection page often use the longer form. Left alone that splits signal between duplicates and spends crawl budget on nothing.
The canonical tag is what resolves it, and most themes do emit a canonical pointing back at the bare /products/ form. Most is not all. Verify it on a live product page once the theme is installed, and verify it again after any theme customisation, because a hand-edited product template is exactly the kind of place a canonical tag gets dropped without anyone noticing.
Every product on the old store carries a title tag and a meta description, and on a mature catalog a large share of them were written by hand. Shopify keeps those as separate SEO fields, distinct from the product name and body copy. An import that maps only name, description, price, inventory and images leaves them empty, so the theme falls back to its template. Overnight, thousands of hand-written titles become the product name followed by the store name.
Nothing errors. Nothing looks broken. The pages render correctly and click-through rate slides over the following weeks, by which point nobody connects it to the import. Map the title tag and meta description columns explicitly in the import file, then read the rendered HTML source of a dozen products across different categories before launch.
old_url,new_url,status
/shop/mens/shoes/runner-x,/products/runner-x,301
/shop/mens/shoes,/collections/mens-shoes,301
/shop/mens/trainers,/collections/mens-shoes,301
/promo/diwali-2024,,410Our Product CSV Validator checks an import file for the structural faults that cause silent data loss, including SEO fields left blank, before you upload it. The Shopify and WooCommerce CSV converter handles column mapping between the two formats. After launch, the SEO Analyzer reads the canonical tag and metadata a live URL serves, and the Sitemap Validator flags submitted URLs that resolve to something other than an indexable page.
The pages that hurt most when they disappear are the ones nobody thought to write down.
Almost always an incomplete redirect map. Old URLs that nobody inventoried before the cutover return 404s, and the ranking signal they carried has nowhere to go. The next most common causes are missing canonical tags on duplicate collection product paths, and SEO title fields left empty during the product import.
Check a product CSV for missing columns, broken variant handles, duplicate SKUs, invalid barcodes and bad prices before you import it.
Convert a product CSV between Shopify and WooCommerce column formats in either direction, with every dropped column listed explicitly.
Check a sitemap.xml against the sitemap protocol - well-formed XML, valid URLs, lastmod/changefreq/priority formats, duplicate entries, and the 50,000-URL limit.
Perform an instant SEO check. Validate meta titles, description lengths, heading tags hierarchy, and image alt tags.