Fixing Duplicate Content Issues on E-commerce Sites
Facets, sort orders, variants and category paths can turn one product into dozens of URLs. Here is how to find e-commerce duplicates and fix each type properly.
Fixing Duplicate Content Issues on E-commerce Sites
Online stores create duplicate content by default. A catalog of 2,000 products can easily produce tens of thousands of crawlable URLs once filters, sort orders, tracking parameters, variants and multiple category paths are combined. None of that is a penalty. It is a dilution problem: crawl activity is spread across copies, ranking signals are split, and Google may pick a URL you did not want as the one it shows in search.
This guide covers the duplicate content patterns specific to e-commerce, how to find them, and the right fix for each.
Duplicate content is not a penalty
Google has been clear for many years that duplicate content on your own site is not grounds for a manual action unless it is deceptive or manipulative. What actually happens is:
- Google clusters duplicates and selects one URL as canonical for the cluster. Only that URL is typically shown in results.
- Signals consolidate to the canonical if Google picks correctly, or end up on the wrong URL if it does not.
- Crawl activity is wasted on near-identical pages, which on large catalogs can slow the discovery of new or changed products.
So the goal is not to "avoid a penalty." It is to make sure the URL Google chooses for each product and category is the one you want, and that crawlers spend their time on pages that matter.
The common e-commerce duplicate patterns
| Pattern | Example | Typical fix |
|---|---|---|
| Faceted filters | /shoes?color=black&size=10 | Canonical to the unfiltered category, or index only valuable facets |
| Sort and view parameters | /shoes?sort=price_asc&view=grid | Canonical to the clean URL; consider robots.txt on large sites |
| Tracking parameters | /product?utm_source=newsletter | Canonical to the clean URL; strip in internal links |
| Product in several category paths | /men/shoes/runner-x and /sale/runner-x | One canonical product URL, linked consistently |
| Variants as separate URLs | /runner-x-black, /runner-x-white | Canonical to a main variant, or index variants that have demand |
| Host and protocol variants | http://, https://, www, no www | Site-wide 301 to one version |
| Trailing slash and case | /Shoes/ vs /shoes | 301 to one format |
| Pagination | /shoes?page=2 | Self-referencing canonical on each page; not a duplicate |
| Manufacturer descriptions | Same text as 50 other retailers | Write unique content for priority products |
| Session IDs | /cart?sid=8f3a... | Remove from URLs; use cookies |
Step 1: Find your duplicates
In Search Console
Open the Pages report under Indexing and look at these reasons:
- Duplicate without user-selected canonical. Google found duplicates and you gave no canonical. It chose one itself.
- Duplicate, Google chose different canonical than user. You declared a canonical, but Google picked another URL. This is the one to investigate first; your signals conflict.
- Alternate page with proper canonical tag. Duplicates handled correctly. Usually fine, but a huge count here can indicate a crawl waste problem.
Use URL Inspection on a few examples to see the User-declared canonical and the Google-selected canonical side by side.
With a crawler
Crawl the site with a desktop crawler set to follow parameters, then check:
- Pages with identical or near-identical titles and H1s.
- The number of unique URLs per product (search the crawl for a product's SKU or slug).
- Pages whose canonical points somewhere other than themselves, and where those targets lead.
- Canonicals pointing to redirects,
404pages ornoindexpages. Each is a mixed signal.
In server logs
Logs show what Googlebot actually requests. If a large share of Googlebot hits go to parameter URLs, your crawl activity is being diluted. Our crawl budget audit guide walks through log analysis in detail.
Step 2: Fix host, protocol and URL format first
Before touching canonicals, make every product and category reachable at exactly one address format. Do this at the server or CDN with permanent redirects.
# Force HTTPS and the www host
server {
listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
# Lowercase paths are best handled in the application or at the CDN,
# with a single 301 to the lowercase URL.
Chain-free redirects matter: an old http://example.com/Shoes URL should reach its final destination in one hop, not three.
Step 3: Use canonical tags for parameter variants
For filters, sort orders, views and tracking parameters, a canonical tag on every variant pointing to the clean URL is the standard fix. On https://www.example.com/shoes?sort=price_asc&view=grid, the head should contain:
<link rel="canonical" href="https://www.example.com/shoes">
Rules that keep canonicals effective:
- Use absolute URLs, including protocol and host.
- Every indexable page gets a self-referencing canonical, so stray parameters are covered automatically.
- The canonical target must return
200, be indexable and not redirect. - Internal links should point to the canonical URL. If your navigation links to
/shoes?sort=popular, you are telling Google that URL matters while your canonical says it does not. - Do not canonicalize paginated pages to page 1. Page 2 lists different products. Google no longer uses
rel="prev"andrel="next"as indexing signals, so give each page its own self-referencing canonical and plainhreflinks between them.
A canonical is a strong hint, not a directive. Google may ignore it if other signals, such as internal links, sitemaps and redirects, disagree. Our canonical tags guide covers the signals Google weighs.
Step 4: Control crawling of infinite facet spaces
On a large catalog with many filters, canonicals alone may not be enough. Google still has to crawl each variant to see its canonical, and multi-select filters can generate a practically unlimited number of combinations.
Options, from least to most aggressive:
- Do not generate crawlable links for low-value combinations. Render filters as form controls or buttons that update the page without creating a plain
href, except for the facets you want indexed. - Disallow specific parameters in robots.txt once canonicals have done their job and the variants carry no unique value:
User-agent: *
Disallow: /*?*sort=
Disallow: /*?*view=
Disallow: /*?*sessionid=
Be aware of the trade-off: a URL blocked by robots.txt cannot be crawled, so Google cannot see its canonical tag, and signals from any external links to it are not consolidated. Use robots.txt for parameters that create crawl waste at scale, not as a general duplicate fix. The differences between robots.txt, noindex and canonicals are covered in robots.txt vs noindex vs nofollow.
Note that Search Console's URL Parameters tool was retired in 2022, so parameter handling must now happen on your site.
Step 5: Give each product one URL
A product listed in three categories should still have one product URL. Two common approaches:
- Flat product URLs such as
/products/runner-x, linked from every category. This is the cleanest option and avoids the problem entirely. - Category-based paths such as
/men/shoes/runner-x, with every alternative path canonicalized to one primary path.
Shopify is a well-known example of the second pattern. Product pages are reachable at both /products/handle and /collections/name/products/handle; Shopify sets the canonical to /products/handle, but many themes still link to the collection-scoped version from collection grids. Changing those theme links to the canonical URL removes thousands of unnecessary crawl paths on a typical store. If you are working on a Shopify store, our Shopify speed optimization guide covers other theme-level fixes.
Step 6: Decide how to handle product variants
Variants (size, color, material) are where intent matters most.
- Variants that people do not search for separately, such as shoe sizes: keep them on one product URL and let users select the option on the page. If the selection changes the URL, canonicalize to the main product.
- Variants with distinct search demand, such as a specific color of a popular product: separate indexable URLs can make sense, each with a unique title and image, and a self-referencing canonical.
Google supports product variant structured data using ProductGroup with hasVariant and variesBy, which helps it understand the relationship between variants:
{
"@context": "https://schema.org",
"@type": "ProductGroup",
"name": "Runner X Trail Shoe",
"productGroupID": "RUNX",
"variesBy": ["https://schema.org/color", "https://schema.org/size"],
"hasVariant": [
{
"@type": "Product",
"sku": "RUNX-BLK-10",
"name": "Runner X Trail Shoe, Black, Size 10",
"color": "Black",
"size": "10",
"url": "https://www.example.com/products/runner-x?variant=blk-10",
"offers": {
"@type": "Offer",
"price": "129.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
]
}
Step 7: Fix thin and copied product descriptions
Manufacturer descriptions shared by every retailer selling the same item are not a technical duplicate on your site, but they give Google little reason to rank your page over others.
You do not need to rewrite the whole catalog. Prioritize:
- Products with the most impressions in Search Console but low clicks.
- Best sellers and high-margin items.
- Category pages, which often target the most valuable queries and deserve unique introductory copy.
Add details only you can provide: fit notes, real photos, sizing advice, comparisons, and answers to common customer questions.
Keep it fixed
Duplicate content problems come back with every new filter, theme change, app install or marketing campaign. Add these checks to your release process, or let OctaneAudit Monitoring watch for new canonical and indexing issues daily. For the wider picture, the technical SEO audit checklist covers the other checks a store needs.
Summary
- Duplicate content on e-commerce sites is a dilution and crawl efficiency problem, not a penalty.
- Start with Search Console's Pages report, especially "Google chose different canonical than user", then confirm with a crawl and server logs.
- Fix host, protocol and URL format with single-hop 301s, then use self-referencing and parameter canonicals, with internal links that match.
- Control infinite facet spaces by not linking low-value combinations, and use robots.txt selectively, knowing it hides canonicals.
- Give each product one URL, handle variants by search demand, and write unique copy for the products and categories that matter most.
Get Your SEO Audit
Every issue in this article, checked on your site by an auditor and delivered as a prioritized roadmap within 48-72 hours.
See pricing