How to find and remove duplicate Shopify products

two identical product cards merging into one, one duplicate crossed out with a redirect arrow pointing to the survivor

Learning how to remove duplicate products in Shopify sounds simple: find the copy, hit delete, move on. It isn’t. Delete the wrong one and you lose the URL Google already ranks, the reviews a product collected over two years, and the sales history that feeds your reports. Picture a store where the same hoodie exists four times, once per color, each on its own product page, each with a handful of reviews and a trickle of search traffic. Deleting three of them to tidy the catalog would toss out ranking signals you already paid for. So the real work isn’t deleting. It’s deciding which copy to keep, redirecting the rest, and spotting the case where a duplicate isn’t junk at all.

We build Shopify apps, so we see messy catalogs constantly. Re-imported CSV files, half-finished app syncs, one-product-per-color setups left over from a migration. Duplicates pile up quietly until a shopper searches your store and gets three near-identical results on one page. Which one do they click? Does it matter that two of them are out of stock? This guide walks through finding duplicates, removing them without wrecking your rankings, and the one situation where you should combine instead of delete.

In this post

Why Shopify stores end up with duplicate products

Duplicate products in Shopify almost never appear on purpose. They creep in through the back door. Four usual culprits: re-imported CSV files, app syncs, one-product-per-color setups, and store migrations.

The CSV one bites the most people. If you edit a products export and re-import it without matching on the handle column, Shopify treats each row as a new product and creates a second copy. Do that twice and you’ve got triples. (We wrote a full walkthrough on getting imports right in our Shopify product CSV import guide, because this exact mistake is so common.) App syncs cause the next batch: inventory tools, dropshipping connectors, and marketplace integrations that push products in can collide with items you already created by hand, especially when SKUs don’t match.

Then there’s the one-product-per-color pattern. A store lists “Nova Tee Black,” “Nova Tee White,” and “Nova Tee Olive” as three separate products instead of one product with a color option. Are those duplicates? Sort of. They’re the same design split across three URLs. And migrations from another platform drag their own baggage: exporters that append a suffix to handles, or that split variants into standalone items, so what was one product on the old store becomes five on the new one.

Why does Shopify let this happen so easily? Because the platform keys products on the handle, not the title. Two products can share the exact same title and live happily side by side as long as their handles differ (nova-tee and nova-tee-1). That single design choice is the root of most duplicate messes.

How to find duplicate products

You can’t clean what you can’t see. Finding duplicates means checking three fields that tend to repeat: title, handle, and SKU. Start in the admin, then move to a full export once the store gets past a few hundred products.

Search by title in the admin

Go to Products, type a product name into the search bar, and count the results. If “Nova Tee” returns four rows when it should return one, you’ve found a cluster. Sort the product list alphabetically by title and scroll: exact-name twins line up right next to each other. Quick, but it only catches duplicates you already suspect. For a real audit you need the data in one place.

Export a products CSV and dedupe by handle and SKU

From Products, click Export and pull a CSV of all products. Open it in a spreadsheet and run three passes. First, sort by the Title column and eye any exact matches. Second, look at the Handle column: handles ending in -1, -2, or a copied slug are a dead giveaway that an import spawned a copy. Third, and this is the one people skip, dedupe by SKU. Two products carrying the same SKU on their variants are almost certainly the same item entered twice. A conditional-formatting rule that highlights duplicate values in the SKU column surfaces them in seconds.

No SKUs assigned? That’s its own problem, and it makes deduping much harder. Our free SKU generator builds a consistent scheme so future imports match cleanly instead of forking. If you want a faster read on the whole catalog without a spreadsheet, run our free store analyzer against your storefront. It flags near-duplicate titles and thin product pages so you know where to look before you touch anything.

One honest caveat: automated matching gets you most of the way. The last stretch needs human eyes. A “Nova Tee” and a “Nova Tee (Limited)” might be genuinely different products, or the same one with a lazy rename. Only you know your catalog.

Before you delete anything

Stop. Before a single product goes to the trash, answer one question for each cluster: which copy do you keep? This is where stores hurt themselves. The instinct is to keep the newest one, or the one with the tidiest photos. Wrong instinct. Keep the copy with the most equity.

Equity means the things that took months to build and can’t be recreated with a click:

  • Reviews. Star ratings and written reviews attach to a specific product. Delete that product and, in most review apps, the reviews go with it.
  • Backlinks and rankings. If another site links to one of the copies, or Google already ranks that URL, keeping it preserves the authority. Check which URL gets organic traffic before choosing.
  • Sales history. The copy with real order history keeps your reporting honest and often has better inventory data attached.
  • Inbound links from your own store. Collections, blog posts, and menu items that point at one specific URL.

So the survivor is often the older, uglier product page, not the shiny new one. That feels backward, and it trips people up every time. Once you’ve picked survivors, export a fresh backup CSV of everything you’re about to change. If something goes sideways, you can re-import and restore. We’ve watched stores skip this step and spend a weekend rebuilding products from memory. Don’t be that store.

How to remove duplicates without tanking SEO

This is the part most tidy-up guides get wrong. When you delete a product in Shopify, its URL starts returning a 404. If that URL had any Google visibility or inbound links, that value evaporates. The fix is a 301 redirect: point the dead URL at the survivor first, then delete or archive the copy. The 301 passes most of the old page’s ranking signal to the page you kept.

The order matters, so follow it exactly:

  1. Confirm the survivor URL and copy the handle of the product you’re removing.
  2. In the admin, go to Online Store, then Navigation, then URL Redirects. Create a redirect from the old product path (/products/nova-tee-1) to the survivor (/products/nova-tee).
  3. Test the redirect in an incognito window. The old URL should land on the survivor with no 404.
  4. Only now delete or archive the duplicate. Shopify offers to auto-create a redirect when you delete a product; that helps, but building it yourself first lets you point it at the exact survivor instead of a collection.

Delete versus archive: delete removes the product and frees the handle; archive hides it from the storefront but keeps the record and its order history. For true junk (a test product, an empty import that never sold anything), delete it and don’t look back. For a duplicate that carried real sales, archive so your reports stay intact, and keep the redirect live. For clearing out large batches of genuine junk at once, our guide on how to bulk delete products in Shopify covers the safe way to do it in volume.

Match the duplicate type to the right action. This table is the cheat sheet we hand people:

Duplicate typeKeep or merge?Action
Exact copy from a re-import (same title, -1 handle)Keep one301 redirect the copy to the survivor, then delete
Test or empty product, zero salesKeep noneDelete outright, no redirect needed
Duplicate with real order historyKeep oneRedirect, then archive (not delete) to preserve reporting
Same product split by an app syncKeep oneFix the SKU match at source, redirect, then delete
Separate color or size products (one design)Merge, do not deleteCombine into one listing with swatches, keep every URL

Notice that last row. It’s different from all the others, and it’s the one that deserves its own section.

When NOT to delete: combine instead

Strong opinion, and we’ll defend it: deleting your color and size “duplicates” throws away SEO you already earned. Those separate products are not junk. Each one has its own URL, and some of those URLs rank, collect reviews, and pull in traffic for a specific color someone searched. Merge three color products into one and delete two of the URLs and you’ve just torched two-thirds of the rankings for that design.

So what’s the move? Combine, not delete. Link the separate color and size products into one shopper-facing listing that shows swatches, while every original URL stays alive. A customer landing on “Nova Tee Olive” from Google still lands on the olive product, but now they see swatches to jump to black or white without hitting the back button. You keep the ranking of every URL and give shoppers a single connected experience. That’s exactly what our sister app Rubik Combined Listings does when it groups separate products as variants: it links them and adds collection-card and grouped-page swatches without merging or deleting the underlying products.

Why not just build one product with a color option instead? Sometimes you should, and if you’re starting fresh, that’s cleaner. But rebuilding an established catalog that way means deleting URLs that already rank. And there’s a hard ceiling: Shopify caps a product at 100 variants and three option types, so large apparel catalogs run out of room fast (we map exactly where that wall sits in our Shopify variant limit guide). Combining separate products sidesteps that ceiling entirely.

Different problem, same family: if a single product already holds all its colors as real variants but the gallery shows every photo at once, that’s not a duplicate issue, it’s a media-filtering one. You want the page to show only the selected variant’s images so clicking “Olive” hides the black and white shots. That’s Rubik Variant Images territory, and it pairs with our notes on assigning multiple images per variant and general product image best practices. Before you touch any of it, run the numbers with our free variant calculator to see whether one product can even hold your full color-by-size grid.

We build these apps, which means we’ve watched the aftermath of the delete-everything approach more than once. Traffic drops, a merchant panics, and the fix is re-creating products and stitching redirects back together. Combining upfront avoids the whole mess.

FAQ

How do I find duplicate products in Shopify?

Export a products CSV from the Products page, then sort and check three columns. Match exact titles, look for handles ending in -1 or -2, and highlight repeated SKU values. For a faster scan, run a store analyzer that flags near-duplicate titles across your whole catalog before you edit anything.

Does deleting duplicate products hurt SEO?

It can, if you delete a URL that ranks or has backlinks, because the page then returns a 404. Prevent the loss by creating a 301 redirect from the removed product URL to the survivor first, then delete. The redirect passes most of the old page’s ranking signal forward.

Which duplicate should I keep?

Keep the copy with the most equity, not the newest one. That means the product holding reviews, ranking traffic, backlinks, and real sales history. Often the survivor is the older product page, since it has had time to collect those signals. Check organic traffic per URL before you choose.

Should I delete or archive a duplicate?

Delete true junk with zero sales, like test products or empty imports. Archive any duplicate that carried real orders, so your reporting and history stay intact while it disappears from the storefront. In both cases, set the 301 redirect first so no shopper or search bot hits a dead URL.

Are separate color and size products duplicates I should delete?

No. Separate color or size products for one design each own a URL that may rank and hold reviews. Deleting them discards that value. Combine them into one connected listing with swatches instead, which keeps every URL live while giving shoppers a single product experience.

How do I stop duplicates from coming back?

Match on the handle column every time you re-import a CSV, and give every variant a consistent SKU so app syncs update instead of creating copies. A tidy SKU scheme is the single best prevention, since most duplicates trace back to imports that had nothing to match against.

One last gut check before you start deleting: open your live storefront and search a product name the way a customer would. If you see two of the same thing staring back at you, your shoppers see it too. That’s the mess worth fixing first.

Co-Founder at Craftshift