Case study

400,000 thin URLs. One WooCommerce store. Here's what the damage looked like.

This is a real WooCommerce store. The store is not named and the URLs below have had their identifiers replaced — the structure, the counts and the dates are unchanged. This is what happens when filter, brand, rating and pagination combinations are left unchecked for years.

The store

What we were looking at.

Store type
Large WooCommerce catalogue with multiple product categories, plus brand, rating and colour filters and pagination on every archive.
Store age
Multi-year, established store carrying historic SEO signals worth protecting.
Problem discovered
A routine Search Console check revealed a catastrophic indexing situation nobody had been alerted to.
Status
Fix applied. Recovery in progress — Google is still working through the removals.

The damage

Four categories of waste, all generated automatically.

Excluded by noindex

28,000+ and processing

What it shows

Filter combination URLs, paginated archives and add-to-cart parameter URLs — all auto-generated by WooCommerce, all crawled, now being excluded.

What it means

Google spent crawl budget visiting these repeatedly before the noindex fix was applied. 372,000 URLs have already been cleaned. 28,000 remain in the exclusion queue, being processed gradually.

These URLs were never meant to exist as indexable pages. WooCommerce created every one of them automatically.

Examples28,000+ URLs
URLLast crawled
/product-category/category-a/?rating_filter=5&filter_store=brand-1,brand-2,brand-3,brand-4,brand-515 Sept 2026
/collection/category-a/?rating_filter=5&filter_store=brand-1,brand-2,brand-3,brand-4,brand-515 Sept 2026
/product-category/category-b/?filter_store=brand-2,brand-6,brand-7,brand-914 Sept 2026
/shop/page/3/?filter_store=brand-2,brand-5,brand-7,brand-914 Sept 2026
/product-category/category-c/page/2/?rating_filter=5&filter_store=brand-3,brand-813 Sept 2026
/shop/?filter_store=brand-1,brand-4&add-to-cart=300313 Sept 2026

The first two rows are the same product grid reachable under two different paths. The last row is a cart action Google crawled as a page.

Duplicate without user-selected canonical

20,000+

What it shows

Archive pages serving identical product grids, with no canonical tag telling Google which URL is the real one.

What it means

Google could not determine which URL was authoritative — the thin content signal in its clearest form. Instead of ranking the real category page, it ranked nothing, or the wrong URL entirely.

Two of these differ only in the order of the filter values. To Google they are separate pages. To a shopper they are the same grid.

Examples20,000+ URLs
URLLast crawled
/product-category/category-a/?filter_color=black&filter_store=brand-1,brand-329 Oct 2025
/collection/category-a/?filter_color=black&filter_store=brand-1,brand-329 Oct 2025
/shop/?rating_filter=5,4&filter_store=brand-2,brand-528 Oct 2025
/shop/?rating_filter=4,5&filter_store=brand-2,brand-528 Oct 2025
/product-category/category-b/?filter_color=blue&filter_store=brand-1,brand-2,brand-628 Oct 2025

rating_filter=5,4 and rating_filter=4,5 return identical content at different addresses.

Crawled — currently not indexed

8,000+

What it shows

URLs Google crawled, found thin or duplicate, and refused to index — but kept revisiting on every crawl cycle.

What it means

Pure crawl budget waste. Google kept checking pages it had already decided were not worth indexing, leaving less budget for real product and category pages.

Examples8,000+ URLs
URLLast crawled
/shop/?filter_store=brand-3,brand-6,brand-8,brand-11
/shop/?filter_color=silver&filter_store=brand-2,brand-7,brand-9
/shop/page/2/?filter_store=brand-1,brand-4,brand-6
/shop/page/3/?filter_store=brand-1,brand-4,brand-6
/shop/?rating_filter=5,4&filter_store=brand-5,brand-10

Pages 2 and 3 of the same filtered archive, each crawled as an independent page.

Not found (404)

8,000+

What it shows

URLs deleted from the store that Google is still reaching from internal links and old sitemaps.

What it means

Every 404 Google hits wastes a crawl request. Eight thousand dead URLs being revisited repeatedly means real pages wait longer to be discovered and indexed.

This one is not ours to fix

The 404s were caused by premature deletion of URLs, not by the thin URL problem. It is a separate issue WooScrub does not create and in most cases cannot reverse — once a URL is deleted without a redirect, its historical value is gone.

Examples8,000+ URLs
URLLast crawled
/product/product-1284/12 Sept 2026
/product-category/category-e/11 Sept 2026
/product/product-0977/?add-to-cart=20509 Sept 2026
/collection/category-f/?filter_store=brand-407 Sept 2026

Deleted products and categories still being requested months later.

The numbers

Where it started, and where it is now.

400,000+Thin URLs indexed at peakFrom our own records at the time. Search Console keeps no historical snapshot to screenshot after the fact.
372,000Already dropped by Google400,000 minus the 28,000 still in the queue. Arithmetic, not a separate measurement.
20,000+Canonical conflicts identifiedCurrent Search Console figure.
3–6 monthsExpected full recoveryGoogle's pace, not ours. The same window we quote every customer.

Google does not clean up overnight. Recovery is gradual — but it is happening. The noindex directives are being processed, real pages are being re-evaluated, and crawl budget is being reclaimed.

What caused this

Nobody did anything wrong.

WooCommerce generates archive URLs automatically. Every time a shopper applies a filter, selects a brand, adjusts a rating or combines several at once, a new URL exists. For a store with:

15+brands
5+rating levels
3+colour options
10+product categories
pagination on every archive

The combinations multiply exponentially. Multiply that across the whole catalogue and the numbers reach six figures without a single deliberate act.

This is not a bug. It is how WooCommerce works by default.

Why the number gets so large

Brand filters are multi-select. A shopper does not pick one brand — they pick any combination of them, and every combination is its own URL.

Combinations of 15 brands32,767
× 10 product categories327,670
+ rating, colour and pagination variantsmore
Observed at peak400,000+

Brand filters alone account for most of it. Nothing else has to go wrong for a catalogue this size to produce six figures of thin URLs.

/category-a/ ?filter_store=brand-1?filter_store=brand-1,2?rating_filter=5?filter_color=black/page/2/&add-to-cart=3003
One real page. Six of the hundreds of addresses it can be reached at.

The fix

What was done — and what it could not do.

What we implemented

  • Every thin archive URL type identified — filters, ratings, brands, colours, parameters and pagination combinations
  • Custom noindex and canonical implementation, specific to this store's theme and plugin setup
  • Robots.txt updated afterwards, once the existing URLs had been dropped, to stop new ones being crawled at all
  • Fix built to cover future URLs automatically — new filter combinations are handled the moment WooCommerce creates them
  • Fix location chosen to suit the store's specific technical stack

What the fix did not do

  • Restore the 8,000+ deleted URLs — those were already gone before we arrived
  • Clean Search Console instantly — Google processes removals over weeks and months
  • Guarantee ranking recovery on any particular timeline

Recovery status

Where each category stands today.

CategoryBeforeCurrent status
Indexed thin URLs400,000+Being removed — 372,000 already gone
Excluded by noindex028,000+ and processing
Canonical conflicts20,000+Fix applied, Google processing
Crawled — not indexed8,000+Fix applied, crawl budget recovering
Not found (404)8,000+Ongoing — separate from the thin URL fix

This case study will be updated as recovery progresses. Search Console data reflects the state at the time of writing — September 2026.

Your store may have the same problem — at any scale.

The free audit shows you exactly what Google sees: archive type counts, Search Console visibility data and a damage score. No credit card. Takes minutes.