Skip to article
Search UX 2026-07-10 35 min read

Ecommerce Search Results Page Design: States, Cards, Filters, and Measurement

An ecommerce search results page has to explain what the search system understood, present products in a state the shopper can judge, and preserve the query while filters, sorting, continuation, navigation, and recovery change the view.

Start with the response state and match boundary. Then design the header, cards, controls, loading, mobile layout, accessibility, and analytics around that contract.

Results for

“waterproof work boot”

Exact phrase and attribute matches Total available
Waterproof Work footwear

Products ranked by relevance

Sort: Relevance

Waterproof work boot

Exact attribute

Available

Waterproof work boot

Exact category

Available

Waterproof work boot

Related material

Available

Chapter 1 · Design the response states

Results, recovery, no results, and errors are different answers

A grid alone cannot explain whether products matched the query exactly, appeared after spelling correction, survived relaxed matching, or came from a fallback. Put the response state in the page header and preserve the original query.

Do not label a failed request as zero results. Zero results means the search completed and found no eligible matches under the declared rules. An error means the system did not produce a trustworthy answer.

Page states and their required communication
StateAnswerControlsDo not
Initial loadThe submitted query and stable page structurePreserve input, applied state, and any server-rendered result contextShow an empty white page while client code decides what to render.
Loading new queryWhich query is being resolved and that work is in progressKeep the search field and deliberate cancel or navigation behaviorLeave the old products looking current under the new query.
ResultsQuery, match state, count boundary, products, filters, sort, and continuationSearch, applied filters, filter access, sort, product actions, pagingHide how products matched or reset state unexpectedly.
Partial or recovered resultsWhat was changed, relaxed, corrected, or substitutedOriginal query, accepted correction, undo, related categories, full alternativesPresent relaxed products as exact matches.
No resultsWhat was searched and which recovery paths are credibleEdit query, remove filters, accept correction, browse category, contact support when appropriateReplace the failed query with unlabeled popular products.
ErrorThe query was not completed and prior state may be staleRetry, edit, preserve query, and a fallback routeReport zero results for a failed request.

Transparent correction

Showing results for waterproof work boot

Original query: “waterprooof work boot”

Search original query Edit search

Hidden relaxation

Products appear, but the shopper cannot tell that a term or filter was ignored.

The grid looks healthy while query fidelity is unknown.

Chapter 2 · Define the response contract

The interface needs more than product IDs

The response should carry enough information to render the answer honestly and trace it later. When the frontend infers match state, count type, or continuation behavior from incomplete data, the same response can produce inconsistent pages.

query

Which exact normalized and display query does this response represent?

UX use: Keep the input, heading, analytics, and history synchronized.

match state

Are these exact, partial, corrected, relaxed, fallback, or no-match results?

UX use: Explain what changed instead of making the grid carry the ambiguity.

result records

Which product or variant records matched, in what order, and why?

UX use: Render the intended purchasable state and expose useful match evidence.

count

Is this an exact total, estimated total, loaded count, or page count?

UX use: Label the number accurately and avoid false precision.

facets

Which values and counts remain available under the current filter semantics?

UX use: Enable only valid refinements and explain applied state.

sort

Which order was requested and which ranking or tie-break rules were applied?

UX use: Name the current order and preserve it in URL and history.

continuation

What cursor, page, or offset retrieves the next stable segment?

UX use: Load more without duplicates, gaps, or lost position.

diagnostic context

Which request, index version, locale, market, rules, and timing produced the response?

UX use: Trace a wrong page without exposing internal data to shoppers.

Chapter 3 · Build the answer header

Keep the query, interpretation, count, and applied state together

The top of the page should let a shopper answer four questions: What did I search? What did the system change or infer? How much of the answer am I seeing? Which filters and sort are active?

Label counts according to what they represent. An exact total, estimate, loaded-product count, and “showing this page” count are not interchangeable. If the search system cannot provide a stable total, use a truthful loaded or continuation message instead of manufacturing precision.

Query

Visible, editable, and synchronized with the URL.

Interpretation

Correction, relaxation, or recovery stated explicitly.

Count boundary

Exact, estimated, loaded, or current segment.

Active state

Filters and sort visible and removable.

Chapter 4 · Design result cards

Show the evidence needed to choose the next product

A result card is a decision record. Its content should match the query family. A shopper searching a part number needs identifier and compatibility evidence. A shopper searching “green linen shirt” needs color, material, fit, price, and availability.

When the match is variant-specific, preserve that variant through image, price, stock, swatch or option state, URL, and product-page handoff. Otherwise the correct result can become a second search task after the click.

Waterproof composite-toe boot

Matched: waterproof · composite toe

Available Selected width

Image

Recognize the product and meaningful variation

Do not show an image that belongs to a different variant than the price or URL.

Title

Identify the product without truncating the differentiating words

Use a consistent line strategy and preserve the full accessible name.

Matched attribute or identifier

Explain why this result is relevant when the title does not

Expose only useful shopper-facing evidence, not raw scoring internals.

Price

Represent the purchasable state, range, sale, market, and currency accurately

Do not combine one variant’s image with another variant’s price.

Availability

Set expectations before the shopper opens a result

Scope stock to the market, location, and selected or matched variant.

Variant context

Preserve size, color, model, pack, or compatibility evidence from the query

Do not force the shopper to rediscover the matching variant on the product page.

Action

Open the product or complete a safe, fully specified action

Direct add is unsafe when required options or compatibility are unresolved.

If price or availability changes between the grid and product page, use the price and stock data-path diagnostic before treating it as card styling.

Chapter 5 · Integrate filters

Filters should refine the query without hiding the search state

Facets are part of the result contract, not a static sidebar copied onto every query. Choose dimensions that help distinguish the current products and preserve applied values in the URL and visible page state.

Counts depend on filter semantics. Decide whether counts represent the current result set, results after excluding the facet’s own selection, or another model. Use one definition per facet and test combinations.

Use query-specific facets

The useful dimensions for “office chair” differ from those for “printer cartridge.”

Verify: Inspect the first category of results and the fields shoppers need to narrow it.

Preserve the query when filters change

Filtering should narrow the result set, not silently start a different search.

Verify: Apply, remove, refresh, share, and use browser navigation while checking the query.

Show applied values outside the closed control

Shoppers need to know why the result set changed.

Verify: Close the filter drawer and confirm active state remains visible and removable.

Define multi-select semantics per facet

OR within a facet and AND across facets is common, but not universal.

Verify: Select two values in one facet and one value in another; compare counts and URL state.

Disable, remove, or explain impossible values deliberately

Zero-count choices can teach the available space or create dead ends.

Verify: Apply restrictive combinations and inspect how unavailable values are represented.

Do not generate uncontrolled crawl paths

Every filter combination does not need to become a canonical indexable page.

Verify: Review URL generation, canonical policy, internal links, and crawl controls with SEO ownership.

The faceted navigation guide covers field design, value normalization, multi-select logic, counts, URL state, crawl policy, and filter diagnostics.

Chapter 6 · Define sort promises

Every sort label needs a data definition

Sorting changes the page’s promise. “Relevance,” “price,” “newest,” and “best selling” are not interface labels alone. They require a value definition, missing-value policy, tie-break, market scope, and stable continuation.

Sort options and the contracts behind them
SortPromiseRequired dataRisk
RelevanceBest match for the current query under the declared ranking systemQuery, fields, ranking signals, rules, tie-breaksA label says relevance while the implementation uses popularity or manual order.
Price low to highAscending comparable price in the active market and currencyDefined product or variant price, sale handling, ranges, missing valuesProducts with variant ranges appear in an order the displayed price does not explain.
Price high to lowDescending comparable price under the same definitionThe same price contract as ascending orderTie and range rules change between directions.
NewestMost recent product under a named timestampPublished, created, available, or launch date and tie-breakBackfilled or republished products make “new” ambiguous.
Best selling or popularOrder based on a measured behavior or merchandising definitionMetric, period, scope, eligibility, freshnessThe label implies current demand while the score is stale or global.

When the shopper changes sort, preserve the query and filters, reset or translate continuation state safely, announce the updated result state, and return focus to a predictable location.

Chapter 7 · Choose continuation

Pagination, load more, and infinite scroll have different state costs

Choose continuation based on comparison behavior, catalog size, return paths, accessibility, shareability, and technical stability. No pattern is automatically correct for every product grid.

Pagination

Strength: Stable locations, shareable pages, clear progress, easier return paths

Risk: Page boundaries can interrupt comparison and shift when ranking changes

Implement: Preserve query, filters, sort, page, and stable ordering in the URL.

Load more

Strength: Shopper controls expansion while prior products remain visible

Risk: History and return position fail if loaded state is not recorded

Implement: Announce additions, preserve focus, and update history or state deliberately.

Infinite scroll

Strength: Continuous exploration for catalogs where open-ended browsing is appropriate

Risk: Footer access, focus, position restoration, memory, and dynamic-content interoperability

Implement: Use a tested loading and accessibility contract, not scroll events alone.

Stable ordering matters across every pattern. Add a deterministic tie-break so the same product does not appear twice or disappear between segments when scores are equal.

As checked on July 28, 2026, the WAI-ARIA feed pattern documents a specific interoperability contract for dynamically loaded article feeds and warns that automatic loading creates usability and assistive-technology challenges. A product grid should not adopt role="feed" casually; choose and test semantics that fit the content.

WAI-ARIA feed pattern and dynamic-loading considerations

Chapter 8 · Design loading and failure

Preserve context while the answer changes

Loading treatment should match the scope of the change. A next-page request should not blank the entire grid. A sort or filter change should show its applied state immediately and prevent stale responses from taking ownership.

Reserve stable card geometry before media arrives. Use progress indicators and skeletons to communicate structure, not to imitate content the response may never return.

Scoped loading behavior
LayerShowPreserveAvoid
Query changedCurrent query and a clear transition to its pending stateSearch field, applied intent, navigation controlOld results appearing to answer the new query
Filter or sort changedApplied state immediately and a scoped result updateControl focus, scroll context, previous stable layoutJumping to the page top without warning
Next segment loadingA progress indicator at the continuation boundaryExisting products, focus, current count definitionReplacing the entire grid
Card media loadingReserved image geometry and meaningful text as soon as availableCard order and action locationsLayout shift that moves a product under the pointer

Chapter 9 · Build the mobile result task

Preserve state when controls move into drawers and sheets

Mobile usually moves facets out of the persistent sidebar. The applied filter state cannot disappear with it. Show an active count or chips near the result header and make removing a value possible without reopening the whole drawer.

Decide whether filter selections apply immediately or on an Apply action. Immediate updates need stable focus and responsive counts. Staged updates need a clear pending state, result preview or count boundary, Apply, and Reset behavior.

Filter · active
Sort
Waterproof × Available ×

Mobile verification

  • Query, result state, and applied filters remain visible near the top of the result task.
  • Filter and sort controls are distinct, labeled, and report active state.
  • The filter drawer preserves selections until Apply, or updates immediately under an explicit model.
  • Closing the drawer returns focus to the control that opened it.
  • Product cards expose the fields required for this query without hover.
  • Grid density adapts without making titles, prices, swatches, or touch actions ambiguous.
  • Loading, empty, and error states fit above the virtual keyboard and browser chrome.
  • Returning from a product restores query, filters, sort, loaded segment, and scroll position.

Chapter 10 · Make dynamic results understandable

Announce status without moving the shopper’s focus

Search, filter, and sort updates can change results without a page navigation. Make the new status programmatically determinable while leaving focus at the control the shopper is using, unless a deliberate navigation requires another target.

W3C’s WCAG 2.2 example demonstrates using role="status" for a search-result message. Keep the announced message concise and do not put the entire changing result grid inside a live region.

Result status

Dynamic result-count or no-result changes are programmatically determinable without moving focus.

Evidence: Test with a screen reader after query, filter, and sort changes.

Heading and landmarks

The query result task, filters, controls, and result list have understandable structure.

Evidence: Navigate by headings, landmarks, lists, and form controls.

Product names

Each result link has a useful accessible name and repeated actions remain distinguishable.

Evidence: Read links out of surrounding visual context.

Filters

Labels, checked state, counts, groups, clear actions, and drawer behavior are operable by keyboard.

Evidence: Apply and remove combinations without a pointer.

Dynamic loading

Added products, busy state, focus, and position remain understandable.

Evidence: Load another segment with keyboard and screen reader.

Visual state

Match emphasis, sale, stock, selection, and error do not rely on color alone.

Evidence: Inspect high contrast and non-color cues.

W3C search-results status-message example

Chapter 11 · Instrument the result task

Connect the search response to visible products and outcomes

Clicks alone cannot distinguish good ranking from a confusing card or a recovery path from an exact match. Preserve query, match state, filters, sort, result and variant identity, position, continuation, and recovery context.

search_results_request

Context: Query, request ID, filters, sort, page or cursor, market, locale, device

Decision: Coverage, latency, and state reproduction

search_results_response

Context: Request ID, match state, count type, result IDs, facets, continuation, index or rule version

Decision: Retrieval, ranking, filtering, and response integrity

search_results_impression

Context: Result ID, variant, position, query, visible rule, page or segment

Decision: Opportunity and position-aware engagement

search_result_select

Context: Result, variant, position, card action, destination, match evidence

Decision: Qualified result engagement and handoff

search_filter_change

Context: Facet, values, previous state, next state, result count boundary

Decision: Filter usefulness and dead ends

search_sort_change

Context: Previous sort, next sort, query and filter state

Decision: Sort demand and downstream quality

search_recovery_action

Context: Original query, match state, correction, relaxation, category or substitute path

Decision: Recovery effectiveness without hiding failures

search_destination_outcome

Context: Result or recovery context, product, variant, cart, purchase, return

Decision: Downstream value under a declared attribution policy

For query-level metrics and the operating review, use the Shopify search analytics framework.

Chapter 12 · Run the results-page audit

Trace one query through response, presentation, controls, and outcome

Do not judge the page from a generic popular query alone. Use cases that expose identifier, attribute, correction, filtering, variant, no-match, and failure behavior.

  1. 1

    Choose a query family and expected records

    Use an exact product, identifier, normal phrase, attribute query, misspelling, and no-match case as separate tests.

    Output: A small judged set with expected match state and useful products.

  2. 2

    Capture the response contract

    Record query, match state, result and variant IDs, order, count type, facets, sort, continuation, and diagnostic version.

    Output: Evidence of what the search system returned.

  3. 3

    Inspect the answer header

    Check the visible query, correction or relaxation, count label, active filters, sort, and recovery explanation.

    Output: A transparent answer-state verdict.

  4. 4

    Judge the first result set and cards

    Compare returned records with visible cards, variant context, price, availability, match evidence, and destination.

    Output: Retrieval defects separated from rendering defects.

  5. 5

    Exercise filters, sort, and continuation

    Apply, combine, remove, share, refresh, navigate back, and load another segment.

    Output: A state, URL, ordering, and focus defect list.

  6. 6

    Repeat on mobile and keyboard

    Use filter drawer, sorting, grid, product actions, loading, recovery, and return-from-product paths.

    Output: Responsive and accessibility repairs tied to real states.

  7. 7

    Throttle, empty, and fail the request

    Test loading, zero match, relaxed match, request error, and stale response behavior.

    Output: Proof that each state is distinct and recoverable.

  8. 8

    Verify the analytics trace

    Connect request, response, impression, selection, filter, sort, recovery, destination, and outcome.

    Output: One reproducible search-to-outcome path.

The audit should name the first divergent layer. A missing expected product is a retrieval, eligibility, or ranking question before it is a grid-design question. A correct returned variant with the wrong image or price is a projection and card question before it is a relevance question.

The page should make the search system’s answer inspectable

Show the query and match boundary, render the right product state, make filters and sort explainable, preserve continuation and history, and keep recovery distinct from exact results.

ParticleSearch is a fit when the store wants these behaviours to come from the search product rather than a collection of theme templates. The full results page keeps the submitted query, active filters, result count, sorting, pagination, and product grid in one stateful experience. It can also serve Shopify collection pages while keeping the collection as the browsing scope.

Merchants can choose contained, wide, or full-width layouts; sidebar, top, or drawer filters; grid density and desktop column count; and product-card signals such as vendor, sale state, swatches, descriptions, ratings, and quick add. Quick add is limited to an exact available variant. When another option is required, the product page remains the honest next step.

After a verified launch, the team should not need one theme patch for filters, another for result cards, and another to preserve the selected variant. ParticleSearch owns the connected result experience and its event evidence. The merchant still owns source data, commercial policy, and the judgment that determines whether a layout or product order is good.

For the input experience before submission, read the autocomplete mechanism guide. For the overall retrieval and ranking system, continue with the ecommerce search relevance guide. The ParticleSearch storefront guide shows the current modal, full-page, filter, card, and handoff controls.

Continue to faceted navigation