Ecommerce platforms

Migrating a catalog to Shopify without losing search visibility

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.

Shopify fixes part of the URL for you

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.

  • Product handles are yours to set. The /products/ prefix is not.
  • Old paths that encoded a category hierarchy collapse to a flat product URL.
  • Anything you were serving at the site root, other than the homepage, needs an explicit new home.
  • URLs nobody remembers, like a discontinued product or a landing page from a campaign two years ago, are still URLs that need a decision.

The redirect map has to be finished before launch

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.

The old site is the only place a complete URL list exists. Capture it before the DNS change, not after.

Redirecting and recreating are two different jobs

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.

Collections rarely map one to one

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.

One product, several paths

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.

Title tags and descriptions are easy to lose in the import

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,,410

What the first crawl after cutover should tell you

  1. Run every old URL from the map through a bulk status checker. You want one 301 landing on a 200, never a redirect onto another redirect, and never a 301 onto a 404.
  2. Crawl the new site from the homepage and compare the URLs it discovers against the product and collection counts you expect. Anything missing is not linked from anywhere a crawler can reach.
  3. Submit the new sitemap, then watch index coverage for a month. A collection product path excluded as an alternate with a proper canonical is working as intended. The same message on a bare product URL is not.
  4. Sample product pages and confirm the canonical points at the /products/ form, and that paginated collection pages canonicalise to themselves instead of to page one.
  5. Keep the original crawl export. When a ranking drops six weeks later, that file is the only way to find out what the URL used to be.

Our 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.

What causes the traffic drop after a Shopify migration?

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.

Share this guideLinkedInXWhatsAppFacebook
All guides