NEWSLayers closes first external funding round led by LOI VentureRead more
‹ All Articles

The Complete Guide to Filtering and Faceting on Shopify Plus

Jake Casto14 min read

Key Takeaways

  • Filters are the highest-intent interaction on a big-catalog collection page. A shopper who taps "Red," "Size 8," "Under $50" is telling you exactly what they want.
  • Most stores ship raw attributes. A size_2 value, a one-option "Final Sale" filter, 40 ungrouped colors in alphabetical order. That is a data dump the shopper has to fight through.
  • Good faceting is an editorial layer. You group values into shopper buckets, relabel codes into plain language, order the useful ones first, and hide the noise.
  • Filtering and sorting are different jobs. Filters remove products that do not match. Sort decides the order of whatever survives.
  • Facets should reflect how people shop each collection. A shoe collection and a dress collection do not think alike, and your filter rail should notice.

Why do filters matter more than search on big catalogs?

On a large catalog, most shoppers never touch the search box. They land on a collection and start narrowing.

Filters are how a browsing shopper hands you their intent, one tap at a time, which makes your filter rail one of the most valuable surfaces you own.

I spend a lot of my week on customer calls, and faceting comes up more than almost anything. On a 5,000-SKU collection, the filter rail does the work the shopper's eyes cannot.

  • Search serves the minority who arrive knowing the exact word. Everyone else browses and filters.
  • Filters compound. A shopper three filters deep is closer to buying than one who just landed.
  • The rail is always on. It works on every collection, every session, whether or not the shopper types a thing.

The UX research backs this up. Nielsen Norman Group draws a clean line: a filter excludes what does not match, while faceted navigation stacks filters that together describe the whole catalog.

And Baymard finds the average site performs mediocre at best on product-list UX, with 36% carrying flaws serious enough to actively harm the experience.

A hair-and-beauty brand we work with put the bar plainly after we rebuilt their rail. They told us it was "super easy to use." That is the whole goal. When filtering feels effortless, shoppers keep narrowing instead of leaving.

What makes a filter set bad?

A bad filter set exposes your database instead of guiding your shopper. The tells are consistent: raw attribute codes, single-value filters, duplicate labels, an alphabetical wall of colors, and the high-intent filter the shopper wanted quietly missing.

Here is the checklist I run against a storefront the first time I see it:

  • Raw attribute dumps. Values like size_2 or clr-nvy-01 that leaked straight out of a spreadsheet.
  • One-option filters. A "Final Sale" facet with a single choice filters nothing and only adds clutter.
  • Duplicate values. "Navy," "navy," and "Dark Blue" fragment the same shopper intent across three rows.
  • Alphabetical noise. 40 colors sorted A to Z, so the shopper scrolls past Aubergine to reach Black.
  • Missing high-intent filters. No "in stock," no price band, no material, on a catalog where those are the first questions a shopper asks.

Each is fixable in configuration, not theme code. The rest of this guide walks the levers in the order I pull them.

How do you group 40 colors or 20 sizes into a few shopper buckets?

You group facet values under friendly headers so a long list becomes a few scannable buckets, while every underlying value still shows. Forty colors collapse under "Neutrals," "Brights," and "Pastels." Twenty sizes gather under "Lounge" or "Petite." The shopper sees structure instead of a scroll.

We built this into the Group facet values tool on the Faceting tab. The moves are direct:

  • Create group. Name a bucket in shopper language, like "Neutrals" or "Premium brands."
  • Add to group. Select the values that belong under it, and they keep their relative order inside the group.
  • Reorder by dragging. Groups themselves can be moved so the most useful bucket sits first.
  • AI Sort & Group. An assist that proposes a grouping for you, though it never saves on its own. A human always makes the final call.

An intimates brand we work with wanted exactly this. Their size run was long, and they asked to gather sizes under readable headers, like a "Lounge" header above the lounge sizes, while still showing every individual size.

Grouping does that: the header organizes; the values stay selectable.

One piece of advice: keep buckets focused. A group with 25 values inside is just the original wall with a lid on it.

How do you relabel filters so they speak human?

You rename the value the shopper sees so it reads like language, not like a column in your PIM. A size_2 becomes "Small." A raw band-and-cup code becomes a friendly size range. The product data underneath stays exactly the same. Only the storefront label changes.

Facets in our platform come from your product attributes. You turn one into a filter with Enable as Storefront Facet, which syncs it as a facet the storefront can render.

From there you control how each value reads, so the rail speaks to shoppers, not your ops team.

A swimwear brand we work with had this in a sharp form. Their sizing lived as raw band and cup values that meant nothing to a first-time buyer.

They asked for those reformatted into ranges a shopper recognizes at a glance. Pure labeling, and one of the fastest wins on any rebuild.

  • Codes become words. mat-org-ctn becomes "Organic cotton."
  • Raw numbers become ranges. A cluster of band-cup values becomes a readable size range.
  • Internal shorthand disappears. Your merch codes stay in the data and off the storefront.

Should you hide noisy or one-option filters?

Yes. If a facet has a single value, or exists only for internal ops, it earns nothing on the storefront and should be hidden. Hiding removes it from view while keeping the underlying data intact for search, ranking, and reporting.

Our Hide facet values tool handles this on the Faceting tab. When you hide a value, your storefront API stops returning it in facet results, but it stays in the database and can be unhidden anytime.

  • Hide selected. Check one value or a batch, then hide them in a single action.
  • Visibility column. Hidden values show a "Hidden" status with an eye-off icon, so nothing is a mystery later.
  • Case matters. Hiding is case-sensitive, so "Red" and "red" count as separate values.

The swimwear brand above had a textbook case: a single-option "Final Sale" filter that could never narrow anything.

They asked to hide single-option filters like it, and hiding is the clean answer. The filter leaves the rail; the sale tag stays in the data.

How do you order filters so the most useful show first?

You switch the facet from automatic ordering to manual and drag the values so the choices shoppers reach for most sit at the top.

Popular sizes, best-selling colors, and the "in stock" option rise while the long tail sinks, so shoppers stop scrolling to find the obvious answer.

Our Sort facet values control lives on the same Faceting tab:

  • Automatic to Manual. Flip the Sort setting to Manual to take the wheel.
  • Drag to order. Move values up or down so the most popular or helpful options sit near the top.
  • AI Sort & Group. The same assist can propose an order, saved as an unsaved draft first so a human reviews before anything reaches the storefront.

Ordering is the lever people underrate. Grouping and relabeling get the attention, but sequence is what decides whether a shopper's most likely choice is the first thing they see or the fortieth.

How do you handle sister sizes and complex filter ranges?

Some filters are not a single value; they are a range or a rule. "Runs small," a petite band that spans several size values, a bundle of related sizes a shopper thinks of as one choice.

You express those as filter expressions in the engine, not as one value pretending to live in two places.

Our engine filtering works through a filter_group of a property, an operator, and values. There are 24 operators, including in, between, gte, and lte, which makes ranges clean to express.

You can nest groups with AND or OR logic, up to two levels deep, so "this size range and in stock" becomes one expression.

  • Ranges use range operators. A price band or a size span becomes a single between expression instead of a hand-maintained list.
  • Compound rules nest. Combine conditions with AND or OR inside a filter group, two levels deep.
  • Sister sizes group by rule. A "runs small" set is a filter expression, so you define it once and it holds as the catalog changes.

To be straight with you: this is engine-layer logic, and the two-level nesting limit is a real boundary.

If you think you need one value to appear in two buckets at once, that is a labeling and grouping decision to make deliberately. The filter logic underneath still resolves each product once.

What about multi-select and AND/OR logic?

Multi-select lets a shopper pick several values in one facet, like three colors at once, and see everything matching any of them. Under the hood that is OR within a facet and AND across facets. Our SDK exposes both, so headless builds match our rendered surfaces.

For teams building on the filtering SDK, the tools are explicit:

  • inValues(). Match a property against several values at once, which is multi-select in a single call.
  • and() and or(). Compose boolean logic, including nested groups, so "Color is Red or Blue, and Vendor is one of these two" is one filter.
  • filterAliases. Map a clean shopper-facing key to a full property path, so { brand: 'nike' } stands in for the underlying vendor field.
  • FilterGroup and FilterExpression. The typed objects you build programmatically when the DSL helpers are not enough.

Render through our surfaces or wire filters yourself through the SDK, and the logic model is the same one the engine enforces. Your dev team is not reinventing filter semantics for a headless build.

How do you handle availability and in-stock filters?

Availability is one of the highest-intent filters on any catalog. A shopper who taps "in stock" is ready to buy now.

Because facets come from your product attributes, availability filters like any other value, and you decide whether out-of-stock items hide, demote, or stay visible with a badge.

  • In-stock as a facet. Enable availability as a storefront facet, and shoppers can narrow to what ships today.
  • Hide or demote out of stock. On collection surfaces you can push sold-out items to the end or drop them entirely, a decision covered in our Combined Listings and Variant Breakouts guide.
  • Location-aware, if you carry the data. If your catalog stores availability by location as product data, that becomes a filterable attribute like any other. Enable it as a facet and shoppers can narrow to what is available where they are.

The honest caveat: location filtering is only as good as the inventory data feeding it. Without per-location availability as an attribute, a "near me" filter has nothing to stand on. Fix the data model first, then facet on it.

Can fit and size guidance live in the filter rail?

Yes, when fit is real product data. If you carry a fit or size-system attribute, it becomes a facet like color or price that you can group and relabel into plain language. The swimwear band-and-cup example earlier is fit guidance in the rail already.

The move is the same one you use everywhere else:

  • Expose the attribute. Enable your fit or size-system field as a storefront facet.
  • Relabel it for humans. Turn raw codes into "Runs small," "True to size," "Runs large."
  • Group the ranges. Collapse a long size run under readable headers so fit reads as a decision, not a spreadsheet.

I would not overbuild here. Fit earns a place in the rail when it helps the shopper narrow, and becomes noise when it does not.

Should filters be open or collapsed on the collection page?

It depends on how the shopper is searching and how fast your storefront responds. Always-open pill filters win when a few high-intent choices drive most decisions. Collapsed sections win when the catalog is deep and an open rail would overwhelm, especially on mobile.

Nielsen Norman Group frames the trade-off around intent and speed.

When shoppers know what they want and your engine responds instantly, interactive filters that update the grid on each tap feel great. When results are slow or the shopper is exploring, a batch approach reduces frustration.

  • Open pills. Best for a short, high-value set like size, color, and price. Fast to tap, always visible.
  • Collapsed sections. Best for deep catalogs where an open rail would bury the products.
  • Mobile tray. A dedicated filter tray keeps small screens usable when the rail is long.

Because our facets render through the SDK, Liquid, or App Embed, presentation is yours to shape. What the facets mean and how they appear are separate decisions, and you own both.

Do different collections need different filters?

Yes, and the good news is that facets already adapt to the products in front of them.

Facets are computed from the attributes on the products in a given result set, so a shoe collection naturally surfaces heel height and width, while a dress collection surfaces length and neckline. Different products, different facets, automatically.

That means your job is refinement, not building a rail from scratch per collection:

  • Group values once. Group a value set into shopper-friendly buckets, and that grouping carries wherever the attribute appears.
  • Hide the noise. Hide low-value or internal values so they never reach the storefront.
  • Order by usefulness. Put the values shoppers reach for first at the top of the list.

This is where faceting meets ranking, and the two should be designed together. If you are tuning how products sort inside these collections, our custom ranking guide is the companion read, and the merchandising surface is where facets, sort, and rules live side by side.

A pre-launch faceting checklist

Before you push a new or rebuilt filter rail live, run this on your busiest collections. Every item maps to a lever in this guide, and each is a pass-or-fail check you can make on a live storefront in a few minutes.

  1. No raw codes. Every visible value reads in plain language. No size_2, no clr-nvy-01.
  2. No one-option filters. Any facet with a single value is hidden.
  3. No duplicate values. "Navy" and "navy" and "Dark Blue" are consolidated into one.
  4. Grouped long lists. Anything past roughly a dozen values sits under shopper-friendly headers.
  5. Useful values first. Popular sizes, best-selling colors, and "in stock" are ordered to the top, not left alphabetical.
  6. High-intent filters present. Price, availability, and the top attribute for that category all exist.
  7. Availability handled. You have decided whether out-of-stock items hide, demote, or show with a badge.
  8. Multi-select works. Picking three colors returns everything matching any of them.
  9. Right rail for the result set. The facets shown match the products in the collection, because they are computed from that result set.
  10. Mobile checked. The rail is usable in a tray on a phone, not just on desktop.

Any fail cell is a quiet conversion leak. The fix is almost always configuration, not code.

Where to start

If your filter rail still shows the shape of your database, start there. Group the long lists, relabel the codes, hide the one-option facets, and order the useful values first.

Those four moves change how a collection feels more than almost anything else you can do in an afternoon.

That hair-and-beauty brand I mentioned set the bar early. Their goal, in their words, was for us to "beat the pants off what we have." That is the standard I hold every filter rail to. It should feel easier to shop than what came before.

If you want a second set of eyes, we will run your busiest collections through the checklist and show you what the same rail looks like tuned for a Shopify Plus catalog, alongside your search and merchandising surfaces.

Book a demo →

FAQs

1. How do I group filter values on Shopify Plus? Use the Group facet values tool on the Faceting tab. Create a group with a shopper-friendly name like "Neutrals," then add the underlying values. Every value still shows and stays selectable, so a long color or size list becomes a few scannable buckets.

2. How do I hide a one-option filter like "Final Sale"? Use Hide facet values. Select it and choose "Hide selected," and your storefront API stops returning it in facet results. The data stays in the database and can be unhidden anytime. A single-value facet never narrows anything, so hiding it removes pure clutter.

3. How do I fix filters that show raw codes like size_2? Relabel them. Facets come from your product attributes, and once one is enabled as a storefront facet, you control how each value reads. A size_2 becomes "Small," a raw band-cup code becomes a friendly range. The product data does not change, only the label shoppers see.

4. How many filters should a collection page have? Enough to cover the decisions shoppers actually make, few enough to avoid clutter. Include the high-intent filters for that category, price and availability, plus the one or two attributes shoppers ask about first. Group long lists under headers, order the useful choices up top, and hide the rest.

5. Can I show different filters on different collections? Yes, and it partly happens on its own. Facets are computed from the attributes on the products in a result set, so a shoe collection surfaces different facets than a dress collection. From there, the shared facet tools (grouping, hiding, ordering) shape how those values read wherever they appear.

6. What is the difference between filtering and sorting? They are different jobs. A filter removes products that do not match, so "Color: Red" drops everything that is not red. Sorting reorders whatever survives, by price or best-selling. Keep the two visually separate, since shoppers confuse them easily.

Jake Casto · Founder, Layers

Jake Casto is the founder of Layers, the enterprise search and merchandising platform built for Shopify Plus. He previously co-founded Proton, a Shopify Plus engineering studio that shipped more than 400 storefronts, where Layers began as an internal tool for a problem that kept repeating. He writes about search infrastructure, performance, and the engineering behind discovery at scale.

Connect on LinkedIn