Faceted Search

A large catalog is only useful if shoppers can narrow it down — by price, brand, size, or any other attribute a merchant cares about. BigCommerce calls this faceted search, and like product data, the available facets and their current state arrive as structured data a template just needs to render.

Facets on a category page

A category context includes a facetedSearch object describing every available facet for that category and which values are currently selected:

Handlebars rendering facet checkboxes
{{#each facetedSearch.facets}}
  <fieldset>
    <legend>{{this.name}}</legend>
    {{#each this.values}}
      <label>
        <input type="checkbox" name="{{this.name}}" value="{{this.value}}"
          {{#if this.selected}}checked{{/if}}>
        {{this.label}} ({{this.count}})
      </label>
    {{/each}}
  </fieldset>
{{/each}}

Submitting selected facets as query-string parameters re-requests the category page with filtering applied server-side — the same request/response cycle as a normal page load, just with different results based on the parameters sent.

Price range facets

Price is handled slightly differently from a list of discrete values — it's typically a min/max range input rather than a checkbox list, reflecting the underlying data's continuous nature rather than a fixed set of options:

Handlebars a price range facet
<input type="number" name="price_min" value="{{facetedSearch.priceMin}}">
<input type="number" name="price_max" value="{{facetedSearch.priceMax}}">

Sorting

Alongside filtering, category pages support sorting (by price, name, relevance, or newest) through a dedicated query parameter, usually rendered as a simple select control that resubmits the page on change:

Handlebars a sort dropdown
<select name="sort" onchange="this.form.submit()">
  <option value="featured">Featured</option>
  <option value="price_asc">Price: Low to High</option>
  <option value="price_desc">Price: High to Low</option>
{{/select}}

Ajax-driven filtering

As with a Shopify collection, reloading the entire page on every facet change feels slow. Stencil themes commonly intercept the filter form's submit with JavaScript, request just the updated product grid markup, and swap it into the page — avoiding a full navigation while still relying on BigCommerce's own server-side filtering logic rather than reimplementing it in the browser.

Note: which attributes are even available as facets (a specific custom field, a certain product option) is configured per-category by the merchant in the control panel — a theme renders whatever facets are actually enabled, rather than deciding that list itself.