eCommerce category page SEO mainly means controlling the number of URLs generated by filters, sorting options, and pagination, so Google indexes the useful variants and ignores the rest. Without this control, a store with a few hundred products can generate, through filter combinations, tens of thousands of near-identical URLs, which Google treats as duplicate content and a waste of crawling resources.
The practical solution combines three distinct technical decisions: which filters you index and which you block, how you handle pagination (page 2, page 3...) without wrongly canonicalizing it to the first page, and what you do with out-of-stock products, so the category page stays useful and complete for both Google and visitors. Last updated: June 22, 2026.
This article explains, step by step, how to recognize duplicate content generated by ecommerce categories, how to choose correctly between robots.txt, noindex, and rel="canonical" for filters and pagination, how to keep SEO visibility for temporarily out-of-stock products, and what practical plan you can apply over 30-60-90 days. It is useful for online store owners, SEO specialists, and developers who work directly on site structure.
What duplicate content on category pages is and why it happens in ecommerce
Duplicate content happens when multiple different URLs show essentially the same product list or very similar text, without meaningful differences for the user. On ecommerce category pages, the main sources are product filters (size, color, price, brand), sorting options (price ascending, popularity, newest), and technical parameters (session, tracking, display) that the platform automatically appends to the URL.
A few useful definitions before continuing:
- Faceted navigation = the filtering and sorting system that lets visitors narrow a category's product list by several criteria at once.
- Crawl budget = the number of pages Googlebot is willing and able to crawl on a site within a given period before moving on to another site.
- Index bloat = a situation where a site has far more URLs in the index than pages with real value, usually caused by filter combinations.
- Crawling vs. indexing = Googlebot can access a page (crawling) without that page actually appearing in search results (indexing); the two processes are distinct.
Google states explicitly, in its documentation on managing the crawling of faceted navigation, that "faceted navigation is by far the most common source of overcrawl issues" reported by site owners, and most cases could have been avoided by following a few standard practices, explained below.
How to optimize product filters (faceted navigation) without duplicate content
The first practical decision is to split filters into two groups: filters worth indexing, because they have real search volume and bring their own organic traffic, and filters not worth indexing, because they are technical combinations without associated searches. A "size 38" or "color red" filter rarely has relevant searches of its own; a "brand" or "category + gender" filter often does.
What URL structure to use for filters
For filters you decide to allow crawling on, URL structure matters. Google explicitly recommends the standard "&" separator for parameters, because commas, semicolons, and square brackets are hard for crawlers to interpret correctly as parameter separators.
- If you encode filters directly in the path (e.g.
/category/brand/model), keep the same logical filter order at all times and eliminate the possibility of duplicate filters in the same URL. - Return an HTTP 404 status for filter combinations that return no results, including logically impossible combinations or nonexistent pagination pages; Google explicitly recommends not redirecting these cases to a generic error page.
- Avoid filter URLs based on fragments (
#); Google generally does not support crawling and indexing based on URL fragments.
Which filters to index and which to block: decision table
There is no universal rule that fits every online store, but the table below summarizes a practical criterion applied frequently on stores with large product catalogs, including auto parts stores filtered by make, model, and production year.
| Filter type | Example | Recommendation |
|---|---|---|
| Filter with its own search volume | brand, gender, product type | Index: dedicated page, self-referencing canonical, unique title/H1 content |
| Technical filter, no searches of its own | size, color, price, rating | Don't index: robots.txt or noindex, no canonical to another URL |
| Combination of 2+ filters | brand + size, category + price | Usually don't index; high index bloat risk on multi-filter combinations |
| Sorting (no filtering) | price ascending, popularity, newest | rel="canonical" to the category URL without the sort parameter |
For filters you explicitly decide not to index, Google notes that using rel="canonical" from the filtered URL toward the base category can, over time, reduce the crawl volume allocated to non-canonical variants, but it is not an immediate guarantee. Blocking via robots.txt is generally the most effective solution for filter combinations with no search value of their own, because it prevents crawling at the request level, not just indexing afterward.
Category pagination: canonical, self-referencing, and the page-1 mistake
A frequent mistake, common on online stores, is setting rel="canonical" on every page of a paginated series (/category?page=2, /category?page=3) back to the first page (/category). In practice, this tells search engines that only the first page matters and the rest are duplicates, even though each page shows different products.
The current recommendation is that each page in a paginated series should have its own self-referencing canonical (page 2 → canonical to page 2, not to page 1). The older rel="next" and rel="prev" annotations, previously used to signal pagination series, are no longer supported by Google since 2019; they no longer affect how Google interprets pagination.
Classic pagination vs. "load more" or infinite scroll
Classic pagination, with distinct URLs for each page, remains the safest option for indexing, because it gives Googlebot clear entry points to all products in a category. "Load more" or infinite scroll mechanisms can hurt SEO if the dynamically loaded products don't also have an accessible variant through a separate URL, reachable directly without a JavaScript interaction.
- If you use infinite scroll, also expose accessible pagination URLs in parallel (e.g.
?page=2), which you can also list in your sitemap, so all products remain discoverable without depending solely on scroll. - Avoid making pages 2, 3, 4 reachable only by clicking "load more" without a real link to that page; a real, crawlable link is essential for discovering later pages.
Out-of-stock products in categories: how to avoid losing traffic and "empty" content
Schema.org Product/Offer: availability values
| schema.org value | Situation |
|---|---|
InStock | Product available, ships normally |
OutOfStock | Product temporarily unavailable, no confirmed date |
LimitedAvailability | Limited stock, about to run out |
PreOrder / PreSale | Product available for pre-order, before launch |
BackOrder | Product unavailable now, with confirmed restocking |
Discontinued | Product permanently withdrawn from the catalog |
Temporary out-of-stock vs. permanently discontinued: what to do with the page
robots.txt, noindex, or canonical: a quick decision guide for ecommerce categories
| Mechanism | What it does | When to use it on categories |
|---|---|---|
robots.txt (disallow) | Blocks crawler access to the URL; the page can still appear in the index without content if it's linked from other sources | Filter combinations with no search value of their own, technical/tracking parameters |
meta name="robots" content="noindex" | Allows crawling but explicitly requests exclusion from the index | Technically indexable filters that lack sufficiently differentiated content |
rel="canonical" | Indicates the preferred URL among a set of similar pages; a signal, not a strict rule | Sorting without filtering, minor parameters, near-identical variants of the same category |
Common ecommerce category SEO mistakes and how to avoid them
- Canonicalizing every paginated page to page 1 → fix: use a self-referencing canonical on each page in the series, not a single "main" page.
- Indexing every filter combination, including ones with no search volume → fix: apply the decision table from this article and block technical combinations via
robots.txt. - Automatically deleting or redirecting out-of-stock product pages without checking whether the product will return to stock → fix: keep the page live for temporary unavailability, with updated availability schema.
- Using non-standard separators in filter URLs (commas, semicolons, brackets) → fix: use only "&" as the parameter separator.
- Combining
noindexwith arobots.txtdisallow on the same URL → fix: don't block viarobots.txta page where you want thenoindexdirective to be honored, because Googlebot can no longer read that directive if it can't access the page. - Missing HTTP 404 status for filter combinations with no results, redirected instead to a generic error page → fix: return a 404 directly for these cases, per Google's official recommendation.
How to measure results: Search Console and GA4 for ecommerce categories
| Indicator | Where to check it | What it shows |
|---|---|---|
| Indexed vs. excluded pages | Search Console - Indexing | The real volume of index bloat and how it evolves over time |
| Impressions and clicks on categories | Search Console - Performance, filtered by category URL | Whether the optimization affects actual search visibility |
| Organic traffic and conversions per category | GA4 - traffic and conversion reports by page | The optimization's impact on business results, not just technical metrics |
Write a comment