Particular Audience Particular Audience
Talk to us

The retail operating system

One engine for every retail decision.

Most retailers run four or five separate tools.

Search in one tool, pricing in another, ads bolted on top — nobody owns the order shoppers see, and margin leaks between them. The Unified Decision Engine governs relevance, inventory, margin and sponsored demand in one pass, on every surface, including the AI assistants now doing the shopping.

Start with one surface. Leave the rest of your stack untouched.

Need one thing first? Start with our AI product recommendation engine or AI site search.

Store-Specific Grocery Search: Stock and Assortment

Design grocery search around store assortment, local offers and stock freshness. Explore a worked data model, changed-store behaviour and availability checks.

Store-specific grocery search: stock, assortment and availability

The right grocery product in the wrong store is an unsuccessful search result. Separate product meaning from the offer a shopper can actually buy. This guide sets out a proposed data and testing pattern for store assortment, availability, fulfilment context and the ranking of eligible products.

Separate a product from a local offer

A product record describes the item: identity, brand, size, attributes and imagery. A local offer describes where and how it can be bought: store, fulfilment mode, price, availability and the time that evidence was updated. Keeping these concepts separate makes it easier to explain why the same query can legitimately return a different list in another store.

Use a stable join between the two. Do not assume a catalogue-wide in-stock flag proves availability for a selected collection location. PA's public Products API documents a product-level stock field; a store-specific implementation needs an agreed mapping beyond that field. Products API.

Establish eligibility before choosing the order

The proposed pattern is to resolve the shopper's fulfilment context, select the authorised local offers, apply explicit constraints and rank the remaining products for the query. Keep the meaning of “available” consistent between the results page, product page and basket.

For a synthetic example, Example Oat Drink is stocked at Store A but unavailable at Store B. A second oat drink has the reverse pattern. A shopper changing stores should see the eligible offer change, even if both products remain in the master catalogue. The example demonstrates a data contract, not a production PA endpoint or an inventory promise.

Treat stale and missing stock as different states

Agree what each availability value means. “Not stocked”, “temporarily unavailable” and “not recently checked” are different conditions. A missing update should not silently become an in-stock assertion. Document the owner of the stock feed, its expected update cadence and the behaviour when that cadence is missed.

If the source cannot establish local availability, show the uncertainty or ask for the required context. Choose a fallback that preserves the retailer's policy. Relaxing an availability condition merely to produce a longer list can create a misleading shopping journey.

Revalidate when context changes

A store switch, fulfilment change or refreshed offer should trigger the checks relevant to that decision. Test cached results, saved lists, recommendations and cart entry as well as the first query. Keep the selected context visible so the shopper can understand the result.

Measure the failures the customer experiences

Track mismatches between the search offer and the destination or basket, stale-offer responses and successful recovery when an item becomes unavailable. Evaluate relevance within the eligible assortment instead of rewarding an engine for retrieving products the shopper cannot buy. Explore PA's grocery approach.

Illustrative example

Synthetic conceptual schema, not PA API: products [{product_id:"P1",name:"Example Oat Drink"},{product_id:"P2",name:"Example Oat Drink Plus"}]; offers [{product_id:"P1",store_id:"A",status:"available"},{product_id:"P1",store_id:"B",status:"unavailable"},{product_id:"P2",store_id:"A",status:"unavailable"},{product_id:"P2",store_id:"B",status:"available"}]. Query "oat drink": Store A eligible=P1; Store B eligible=P2.

Downloads

Sources

How Particular Audience does it

Frequently asked questions

Is product-level stock enough for multi-store search?

Only if that field accurately represents the shopper’s selected fulfilment context. Otherwise separate the master product from local offer records and agree the join. A global stock value cannot by itself establish availability in every store.

What should happen when a shopper changes store?

Re-evaluate eligibility, offer details and affected cached results using the new context. Preserve the query where appropriate, explain changed availability and avoid displaying a previous store’s price or stock assertion as though it applies to the new store.

Does search predict inventory?

Search should use the availability evidence agreed with the retailer. A model’s estimate is not the same as confirmed stock. If predictions are used, distinguish them from observed records and define how uncertainty affects display and purchasing decisions.

Related guides

How-to guides · All guides