Know what Shopify already handles before you fix anything
Shopify serves every product at two kinds of address: the plain product URL, and a version nested under whichever collection the shopper came through. This looks alarming in a crawl report and is generally not a problem, because the nested version carries a canonical tag pointing at the plain product URL.
The same applies to variant addresses. A product URL with a variant parameter is treated as the same page, and the canonical points back to the product.
So the first step in any Shopify duplicate content project is to check the canonicals rather than start rewriting. View the source on a nested product URL and confirm the canonical points where you expect. If it does, that set of URLs is not costing you anything and you can move on.
Where this does go wrong is in themes that have been modified. A theme edited over several years, or one that renders its own canonical tag, can end up with a canonical pointing at the current URL instead of the product, or with two canonical tags on the same page. Check a nested product URL, a variant URL and a paginated collection page, and you will know within ten minutes whether you have a real problem or an inherited crawl report.
Filtered collections, tag pages and search results are the real duplication
The URLs worth acting on are the ones your store generates for shoppers browsing rather than for pages you wrote deliberately.
Filtered collection URLs, produced when someone narrows by size, colour or price, create large numbers of addresses showing subsets of the same products. They are useful for shoppers and almost never useful as landing pages. Keep them working on the site and keep them out of the index.
Tag-based collection URLs are the same problem with a different shape. A store that tags products generously can generate hundreds of tag pages, each showing a handful of products with no written copy and a title assembled from the tag name.
Internal search result pages are the third set. They should not be indexable at all.
The exception is worth naming. If a filtered or tagged view matches something people genuinely search for, and you are willing to give it real copy and a proper title, then promote it into a real collection with its own handle rather than leaving it as a filter. That converts a duplicate into an asset. Doing this for a handful of high-demand combinations is worth far more than doing it for all of them.
Near-identical product pages in your own catalogue
The duplication that costs most is usually between products you created yourself, not between URLs the platform generated.
The common pattern is a range where the only difference between fifteen product pages is a colour name, with the same description copied across all of them. Search engines have to choose one, your own pages compete with each other, and none of them says anything specific enough to rank.
The fix is usually structural. If the difference is a colour, a size or a capacity, those should be variants of one product with one strong page rather than separate products. Consolidating a range into a single product with proper variants gives you one page with all the links and all the reviews instead of fifteen weak ones. Redirect the old product URLs to the surviving one.
Where separate products are genuinely justified, because people search for that specific version by name, then the pages have to be genuinely different. Different descriptions, different photographs, different specifications, and copy that explains who each version suits.
The other source of identical text is manufacturer-supplied descriptions, which every store selling that product also has. Rewriting the top of the description in your own words, with details you can add and they cannot, is what separates the page.
Overlapping collections compete with each other
Collections that cover almost the same ground split your own traffic and confuse which page should rank. This happens gradually, as collections are added for campaigns, menus and seasonal edits and never cleaned up.
Audit them by listing every collection with the number of products in it and the traffic it receives. Two things will stand out: collections with almost identical product sets under different names, and collections with very few products that were made for a menu.
For overlapping pairs, choose the one that matches how people actually search, put the copy and the internal links into it, and redirect the other. For collections that exist only to organise a menu, decide whether they need to be crawlable at all.
Also check the automated collections. Rules that are too broad produce collections containing most of the catalogue, and a store with three collections each containing eighty percent of the products has three pages saying the same thing.
Then fix the internal linking so it agrees with your decision. If your menu, your footer and your product pages all link to a collection you have decided is secondary, you are telling search engines the opposite of what your canonical says.
International storefronts and the development domain
Stores selling in several countries create the most confusing duplication, because the pages genuinely are near-identical by design.
Where you run separate country storefronts or subfolders with the same products, each version needs to declare its language and region and point at the others, so the right one is shown in the right place instead of the versions competing. Check that these declarations are present, reciprocal and pointing at live URLs, because a broken set is worse than none.
Where the only difference between two storefronts is currency, question whether you need two at all. A single storefront with multiple currencies avoids the problem entirely.
The development domain is a smaller but common issue. Every Shopify store keeps its original platform address, and it should redirect or canonicalise to your real domain rather than being reachable and indexable in its own right. Check by searching for your store name on that domain.
Finally, password-protected staging themes and duplicate stores used for testing should not be crawlable. A test store with the full catalogue on it, left open, is the one situation where duplicate content on Shopify does real damage.
Worked example, not a result
An audit of URL types on one store
- Product URLs
- 420, indexed
- Collection product URLs
- Canonical to the product, no action
- Variant parameter URLs
- Canonical to the product, no action
- Filtered collection URLs
- 3,100, excluded from the index
- Tag collection URLs
- 180, 5 promoted, rest excluded
- Internal search pages
- Excluded
- Colour products merged into variants
- 15 products into 1
Worked example, not a result