Skip to content

Search Re-ranking

Search re-ranking applies your Dynasort recipes to your storefront’s search results. Shopify still decides which products match a shopper’s query (including typo tolerance and synonyms), and your recipe decides what order they appear in, so your best sellers, high-margin items, or in-stock products rise to the top instead of whatever the default relevance happens to surface.

Real store data shows why order matters: in one large catalog we analyzed, nearly half of all search result clicks landed past the third position. Shoppers scroll, and what they find there is up to you.

Think of search as two separate jobs:

  1. Matching stays with Shopify. A query like “jacket” matches the same set of products it always did.
  2. Ordering moves to your active search recipe. The matched products are re-scored by the recipe’s attributes (sales, conversion rate, inventory, and so on) and returned in that order.

Because matching is untouched, shoppers never see products that don’t fit their query, and they never lose results they would have found before.

When several products score the same (common on newer stores with little sales history), the recipe’s tie-breaker decides their order. Search recipes default to Shopify relevance as the tie-breaker, which means: with no data at all, your results look exactly like Shopify’s, and as data accumulates your recipe takes over gradually. No cliff, no scrambled results on day one.

Re-ranking covers both storefront search surfaces:

  • The search results page: the full result grid, with pagination.
  • The live search dropdown: the suggestions that appear as a shopper types, re-ranked by the same recipe.
  1. Create a search recipe. On the Recipes page, choose Add recipe → Search recipe. Pick the attributes that define “best” for your store and weight them. Dynasort seeds sensible defaults you can start from.

Search recipe editor with attributes and the tie-breaker setting

  1. Preview the re-ranking. In the recipe editor, type any query into Preview re-ranking to see exactly how results will be ordered, before anything is live.

Preview re-ranking showing reordered results for a query

  1. Activate it. On the Search page, choose your active recipe (search uses one active recipe at a time) and connect the storefront. The status banner tells you when everything is ready.

Search page with active recipe, storefront connection, and display settings

  1. Add the storefront pieces in your theme editor. On the search template, add the Dynasort Search Results app block (in the block picker under Apps) and remove or hide your theme’s own results section. Then, under Theme settings → App embeds, toggle on Dynasort Live Search so the typeahead dropdown is re-ranked too; set its hide selector for your theme per Live Search theme selectors.

The Search page controls how the results grid looks: columns per device, results per page, and which details show on each card (color swatches, sale and new badges, star ratings, quick add-to-cart).

These settings apply to the results page grid. The live search dropdown always uses a compact list (thumbnail, title, price) designed for fast scanning.

Swatches can render as color dots or as variant images, small thumbnails of each color’s own product photo. Variant images are the better choice when your color names are brand-specific (“Preloved Ink”) rather than plain colors, or when the product photo says more than a dot ever could.

Swatch option name pins the swatch row to one specific option, usually Color. When it’s set, products without that option show no swatches at all. That’s the tool for catalogs where some products use options for configuration rather than color: a shirt with a Color option gets its swatch row, while a golf club whose options are shaft and loft combinations gets a clean card that clicks through to the product page. Leave the field empty and Dynasort picks a color-like option automatically.

The Savings note adds the discount next to the price on marked-down products: “(Save $60.00)” as a dollar amount, or “(Save 40%)” as a percentage. When the discount varies across a product’s variants, the wording switches to “(Save up to $107.50)”. Products that aren’t discounted show nothing, so the note never renders a zero.

Beyond the built-in Sale, New, Bestseller, and Low stock badges, you can define your own. Each badge pairs a label and colors with one matching rule:

Match byThe badge appears on products that…
Tagcarry the tag you specify
Title containshave the text anywhere in their title
Vendorare from that exact vendor
Product typehave that exact product type
Metafieldhave a matching value in the metafield you name (namespace.key)

Metafield matching also understands badge metaobjects. If your store manages badges as a metaobject list on each product (a common pattern for “Preorder”, “Coming Soon”, or promo badges), a rule can simply name the badge, for example match value Preorder on product.badges, and Dynasort resolves the reference for you. New badge definitions and label edits are picked up automatically.

If some of your products can’t display an advertised price, brand MAP agreements being the usual reason, Price visibility hides the entire price block (price, compare-at strike-through, and the savings note) on flagged products behind a “Click to Reveal Price” control. Flagging is metafield-driven: point the setting at the metafield your product pages already use for this, and search result cards follow the same rules. In the live search dropdown, flagged products show the reveal text in place of a price.

Storefront search results grid rendered by Dynasort

Live search dropdown with re-ranked suggestions

Every time Dynasort serves a search results page, it records what was served. From there it tracks what shoppers did with it:

  • Serves: how many times the recipe ordered a results page.
  • Clicks and CTR: clicks on served results, with the position that was clicked.
  • Adds: served products added to the cart, whether from the result card or the product page, within the same visit.
  • Checkouts: visits where a served product was added and the shopper went on to check out.

You’ll find these numbers on the search recipe’s page: totals in the sidebar and a day-by-day table below the editor. They’re the foundation for comparing recipes, and for the A/B testing of search recipes we’re building toward.

The storefront pieces ship without !important rules, so your theme’s CSS can override anything. Useful hooks:

Results grid (.dynasort-search): the root element exposes CSS custom properties you can set from your own stylesheet:

.dynasort-search {
--ds-cols-desktop: 5; /* columns per breakpoint */
--ds-gap: 1.5em; /* grid gap */
--ds-radius: 12px; /* image corner radius */
--ds-aspect: 4 / 5; /* card image aspect ratio */
}

Element classes follow a consistent naming scheme: .dynasort-search__card, __media, __title, __price, __badges, __swatches, __pager, __summary, __empty, plus __save (the savings note) and __price-reveal (the MAP reveal control).

Live search dropdown (.dynasort-predict-*): .dynasort-predict-panel (the container, solid white by default), .dynasort-predict-item, .dynasort-predict-thumb, .dynasort-predict-title, .dynasort-predict-price, .dynasort-predict-all.

  • Start with the seeded default recipe and watch the serving numbers for a week before tuning weights.
  • If your store is new and everything ties, that’s fine: the Shopify-relevance tie-breaker keeps results sensible until your data differentiates them.
  • Sold-out products can be hidden or shown per recipe; hiding them is usually the biggest single win for search conversion.