How to Structure Categories and Filters for SEO on Your Online Store

Author profile
Harish GanapathiFounder of Chakril Apps
How to Structure Categories and Filters for SEO on Your Online Store

How to Structure Categories and Filters for SEO on Your Online Store

Structure categories around search demand and filters around shopper convenience. If a filter combination has real monthly search volume and enough inventory to fill a page, promote it to its own crawlable, linkable category page. Everything else stays a query parameter that search engines never index.

That one rule solves about 80% of the mess I see in store architecture audits. The other 20% is execution: URL patterns, canonical tags, internal linking, and stopping faceted navigation from generating 400,000 crawlable URLs out of 900 products. For the on-page playbook covering titles, copy placement, and schema, see our ecommerce category page SEO guide.

How do I structure categories and filters for SEO on my online store?

Think of it as two separate systems that happen to share a UI.

Categories are pages. They have a URL you'd be happy to see in search results, a title tag, an H1, unique copy, internal links pointing at them, and a place in your navigation. They exist because people search for that thing.

Filters are controls. They narrow what a shopper is already looking at. They should be fast and stateful in the URL so shoppers can share links, but they should not create indexable pages by default.

The failure mode almost every store hits is treating those as one system. Either every filter click spawns an indexable URL (crawl trap, thin duplicates, cannibalization) or nothing but the top-level categories is indexable, so you rank for "candles" and miss all 340 monthly searches for "soy wax candles for small rooms". The fix is a deliberate promotion path: a filter value earns page status, it does not get it automatically.

How do you do a category strategy for an ecommerce website?

Start from queries, not from your product spreadsheet. I pull three inputs before touching the navigation:

  1. Existing Search Console data. Queries your category pages already get impressions for at position 8–30. Google already thinks those pages are relevant but doesn't rank them well. Half the time it's because one page is covering four intents.
  2. Keyword research on attribute combinations. Cross your top three product attributes (type, material, use case, size, price band). For a candle store: scent family × room size × wax type × gifting occasion.
  3. Inventory counts per combination. No page ships with fewer than 8 products. Below that you get a thin page that converts badly and reads as an empty result to a crawler.

Then map it into a hierarchy no deeper than three clicks from the homepage: home → parent category → child category → product. Anything beyond that depth should become a sibling of a child category, not a fourth level.

Here's the part people skip. Write the intent for each page before you create it, in one sentence. "Someone who already knows they want soy wax and is comparing brands." If two planned categories have the same sentence, you have one page, not two. That single check has killed more cannibalization in the audits I've run than any technical fix.

A home fragrance store I worked through this with had 1,400 SKUs sitting under 11 collections. We mapped attribute demand, promoted 9 filter combinations to real collections, and merged 3 near-duplicates. Ninety days later organic sessions to collection URLs went from roughly 2,100/month to 5,800/month, and the new pages accounted for most of it. Nothing exotic happened. The demand was already there, the pages just didn't exist.

When should a filter become its own category page?

Four tests. A filter value has to pass all four, not three.

TestThreshold I useWhy it matters
Search demand50+ monthly searches, or clear long-tail intent in Search ConsoleNo demand means no reason for the page to exist
Inventory depth8+ products, ideally 15+Thin pages rank badly and go out of stock
StabilityThe set stays populated year-roundSeasonal-only sets are better as temporary landing pages
Unique content possibleYou can write 100+ words that aren't boilerplateIf you can't, Google sees a duplicate of the parent

Attributes that usually pass: product type, material, use case, gender/fit, brand, style. Attributes that usually fail: price ranges, sort order, ratings, availability, colours (with exceptions like "black dresses"), and anything with more than about 20 values.

Multi-value combinations almost always fail. "Blue" plus "large" plus "under $50" is three filters a shopper applies in a session. It is not a page. Promote single attributes and, at most, one two-attribute combination per parent category.

Colour is the most over-promoted attribute in ecommerce. Store owners spin up "red candles", "blue candles", "green candles" because it's easy to automate. Check the search volume before you build 14 of them. Outside apparel it's usually near zero, and you've just added 14 pages competing with the parent for the same links.

What is a faceted navigation crawl trap, and how do you avoid it?

A crawl trap happens when filter parameters combine into a near-infinite URL space that crawlers keep discovering through links on your pages. Six filters with five values each, in any order and combination, is tens of thousands of URLs. Add sort options and pagination and you multiply again.

The damage is indirect. Google doesn't penalise you for it. It just spends your crawl budget on URL 40,113 instead of the product you launched yesterday, while near-duplicate pages dilute signals that should be consolidating on the real category page.

Four defences, in order of how much they matter:

Don't link to filtered URLs in HTML. If your filter UI renders <a href="?filter.v.option.color=Blue">, crawlers follow it. Render filters as buttons that update state via JavaScript and push the URL, or keep the links and make sure the other defences hold. Most modern Shopify themes handle this; older custom themes frequently do not.

Canonicalise filtered views to the bare category URL. Every parameterised version of /collections/candles should carry rel="canonical" pointing at /collections/candles. Check by opening a filtered page, viewing source, and searching for canonical. Broken canonicals on filtered views show up in a large share of the stores that come through our Collections Health Check, usually because a theme customisation or an app injected its own tag.

Block parameter patterns in robots.txt. Shopify's default robots.txt already disallows sort-order URLs and multi-tag combinations (the ones containing + or %2B). If you've added custom filter parameters, add matching rules.

Use noindex, follow sparingly, only where you want the links crawled but the page absent. Don't combine noindex with a robots.txt block on the same URL: if it's blocked, the noindex is never read.

Pagination is the sibling problem. Keep /collections/candles?page=2 crawlable with a self-referencing canonical. Rolling every paginated URL up to page 1 orphans your deepest products.

Not sure which of your collection URLs are indexable, thin, or duplicating each other? Rank Collections maps your live collection structure, flags the pages competing for the same query, and shows which filter values have enough demand and inventory to become their own page.

How should category and filter URLs be structured?

Flat, readable, and stable.

Keep category URLs short and descriptive: /collections/soy-wax-candles, not /collections/home-fragrance-candles-wax-type-soy-2026. Shopify forces the /collections/ prefix and has no nested collection paths, so your hierarchy lives in breadcrumbs, navigation, and internal links instead. That's fine. Path depth has never been a strong ranking factor. Use hyphens, lowercase, no unnecessary stop words, no dates or IDs.

Filter state belongs in query parameters. Shopify's Search & Discovery filters use ?filter.v.option.color=Blue and ?filter.p.tag=organic, which is the right shape: parameters are easy to canonicalise, block, and strip. Where it gets murky is Shopify's older tag-filter format, /collections/candles/soy-wax. That looks like a path, and some themes give it a self-referencing canonical, which means it can get indexed. Combined tags (/collections/candles/soy-wax+gift) are already blocked by Shopify's default robots.txt.

So decide deliberately. Either you want that single-tag URL indexed, in which case treat it as a real category with unique copy and internal links, or you don't, in which case canonicalise it to the parent. What you cannot afford is not knowing which one your theme is doing.

How do I set this up in Shopify, step by step?

Here's the actual admin path for promoting a filter to a real collection and wiring it in.

  1. Products → Collections → Create collection. Name it the way people search, not the way your PIM does. "Soy Wax Candles", not "Candles - Wax Type A".
  2. Set Collection type → Automated, then add conditions: Product tag is equal to soy-wax, or Product type is equal to Candle plus a second condition. Automated collections keep themselves populated as you add SKUs. If you're converting an existing manual collection, here's how to switch it.
  3. In the collection's Search engine listing section, click Edit and write a real title tag and meta description. Don't leave the auto-generated one.
  4. Add unique intro copy in the description field, 100–200 words on why someone would choose this subset. Our guide to category page content covers what earns rankings here versus what reads as filler.
  5. Online Store → Navigation. Add the collection as a child item under its parent in the main menu or a footer block. A collection with no internal links gets crawled rarely and ranks poorly.
  6. Apps → Search & Discovery → Filters. Configure the narrowing filters: the ones that failed the promotion tests. Colour, size, price, availability. These stay as parameters.
  7. Online Store → Themes → Customize → Collection page. Confirm the filter section renders. Then Themes → Edit code → theme.liquid and check for canonical_url.
  8. Themes → Edit code → robots.txt.liquid if you need custom disallow rules for app-generated parameters. Shopify lets you append rules without losing the defaults.

Then verify: open a filtered URL in an incognito window, view source, and confirm the canonical points where you expect. Once per template type, not once per store.

Navigation is where your category strategy either works or quietly dies. Three things I check:

Every indexable category is reachable from a static HTML link. Mega-menus rendered client-side after a hover event are frequently invisible to crawlers. If child categories only appear on hover and the markup isn't in the initial HTML, they're effectively orphaned.

Cross-link between sibling categories in body copy or a related-collections block. Horizontal links spread authority across the layer instead of funnelling everything down one path.

Link from product pages back up. Breadcrumbs do this in most themes. Confirm yours outputs BreadcrumbList schema, not just visual breadcrumbs.

How many collections you should have, and how products get assigned across them, is worth settling first. We covered that in how to organize products on Shopify.

How do you know if the structure is working?

Give it 60 to 90 days, then check three things in Search Console.

Filter Performance to Pages, regex-match your collection URLs, and compare impressions and clicks before and after. New categories should pick up impressions within 3–4 weeks of being linked in navigation.

Then open the Pages report under Indexing. "Crawled - currently not indexed" filling up with parameter URLs means your canonical or robots rules aren't holding. "Duplicate, Google chose a different canonical" on a category page means two pages are too similar and should be merged.

Finally, look at queries per page. One collection picking up impressions for four distinct intents is your signal to split it. Four collections competing for the same query is your signal to merge.

FAQ

Should I let filters create indexable URLs on my ecommerce site?

Not by default. Filter URLs should carry a canonical tag pointing back to the parent category so search engines consolidate signals on one page. Promote a filter to an indexable page only when the value has genuine search demand, at least 8 products behind it, year-round stability, and enough unique content to justify existing separately from its parent.

How many category pages should an online store have?

There's no fixed number, but a useful ratio is one indexable category per 10 to 30 products, with no category holding fewer than 8 products. A 1,000-SKU store typically lands somewhere between 40 and 100 collections. Beyond that you start creating pages that compete with each other for the same queries and split your internal linking too thin.

Does Shopify support nested collection URLs like /collections/candles/soy-wax?

Not as a hierarchy. That URL format exists in Shopify but it's a tag filter, not a subcollection, and Shopify has no native parent-child collection structure. Express your hierarchy through breadcrumbs, navigation menus, internal links, and BreadcrumbList schema instead. Search engines infer structure from links far more than from URL path depth.

What's the difference between faceted navigation and category structure?

Category structure is a fixed set of pages you deliberately created, each targeting a distinct search intent, each linked from navigation. Faceted navigation is the dynamic filtering layer shoppers apply on top of any category page. Categories are for search engines and shoppers; facets are for shoppers only, unless a specific facet earns promotion into a category.

Will blocking filter URLs in robots.txt hurt my rankings?

No, assuming the underlying category pages remain crawlable and linked. Blocking parameter URLs preserves crawl budget for pages that matter. The one mistake to avoid is blocking a URL in robots.txt while also relying on a noindex tag on that URL. Google can't read a tag on a page it isn't allowed to fetch, so the page can linger in the index without a description.

How long before a new category page starts ranking?

Expect 3–4 weeks for indexing and first impressions if the page is linked from your main navigation, and 8–12 weeks for positions to settle. Pages built on attributes you already rank for as a store move faster. Brand-new topical territory takes longer and usually needs supporting content and links, not just the collection page itself.

Structure work compounds. Get the category-versus-filter line right once and every product you add afterwards lands in a page that already ranks. If you'd like a read on where your current setup stands, run your store through our free Collections Health Check — it flags thin collections, missing metadata, broken canonicals on filtered views, and the collections that are quietly competing with each other.

Shopify Trends

Grow your Shopify Store with Chakril Apps

Try Apps for FREE
ChakrilApps preview

Do you want

more traffic?

Hey, I’m Harish Ganapathi, Founder of Chakril Apps!

I help merchants like you unlock growth and maximize sales.

🔍 Find out what you're missing!