Skip to main content
DoneThat

AI Adoption GuideRetailFulfill

Substitution Recommendation Engine

ML recommends acceptable substitutions for unavailable items using shopper preferences, product similarity, dietary rules, price sensitivity, and historical acceptance.

Retail processPlanBuyPriceStockSellFulfillReturnClear

By Don, DoneThat’s AI coach · updated

When a Substitution Recommendation Engine Fits Fulfillment Work

Out-of-stock and partial picks are routine in grocery and general merchandise fulfillment. When the ordered SKU is unavailable, the associate still needs a replacement that the shopper is likely to accept: right category, dietary constraints respected, price close enough, and brand preferences honored when they matter.

A substitution recommendation engine ranks candidate replacements from the live catalog and presents one or a short list to the associate (or, in customer-facing flows, to the shopper). The model does not place the substitute in the order on its own. A human, the shopper or the associate acting under shopper rules, accepts or rejects before the pick is finalized.

This page is for fulfillment leads, ops managers, and product owners who want substitutions that feel intentional rather than random aisle swaps. Related work includes Delivery Promise Accuracy Model for setting expectations when stock is uncertain, Fulfillment Exception Agent for routing stockouts into the right next action, and Order Routing Optimizer for choosing where the order should be picked when inventory differs by site.

What Inputs the Model Needs

Useful recommendations depend on structured, current inputs. Typical signals include:

  • Original SKU and attributes: category, brand, size, pack, unit of measure, dietary flags (allergen, vegan, kosher, halal), and any private-label vs national brand markers.
  • Availability: on-hand and pickable quantity at the fulfillment location for the ordered item and for candidates in the same assortment.
  • Shopper preferences: prior acceptance and rejection of substitutes, brand loyalty or avoidance, organic or dietary filters, and any explicit “no substitutes” or “call me” rules on the order.
  • Price sensitivity: original unit or line price, basket context, and historical willingness to accept upcharges or downgrades.
  • Similarity features: embeddings or rule-based similarity over attributes (flavor, cut, size parity, functional equivalents such as lactose-free milk vs oat milk when the shopper has accepted that swap before).
  • Historical acceptance: which substitutes were offered, accepted, and returned or complained about for this shopper and for similar shoppers in the same category.

If the original SKU cannot be resolved, availability for the ordered item and candidates is missing or stale, or preference and constraint inputs are absent when the order requires them, the engine should return empty output: no ranked list, no “best guess.” The associate then follows the store’s fallback (skip line, contact shopper, or manual search) rather than inventing a substitute from incomplete data.

How Recommendations Are Produced

At pick time (or just before the associate reaches the line), the system confirms the ordered SKU is unavailable or below the requested quantity. It builds a candidate set from in-stock items in the same or adjacent categories, filtered by hard constraints: allergens the shopper must avoid, dietary rules on the profile, blocked brands, and maximum price delta policies.

Soft ranking then scores remaining candidates. Product similarity pulls functionally close items toward the top. Preference history boosts brands and pack sizes the shopper has accepted before and penalizes past rejections. Price sensitivity adjusts rank so a modest upcharge can still win if similarity and preference are strong, while a cheaper alternative may win when the shopper historically prefers value. Dietary and quality rules stay hard gates, not soft scores.

The output is a short ranked list (often one primary suggestion plus one or two alternates) with plain reasons the associate can explain: “same brand, larger pack,” “lactose-free alternative you accepted last month,” “similar price, organic.” Scores and reasons should be inspectable so trainers and auditors can see why a substitute was preferred.

Nothing in that list is applied until acceptance. In associate-led flows, the associate offers the top option (or calls the shopper when policy requires). In app-led flows, the shopper taps accept or choose another. Either way, the model recommends; the human decides.

Associate Workflow and Guardrails

When the picker hits a miss, the handheld or station shows the recommendation panel only if inputs were complete. The associate sees the original item, why it is unavailable, the top substitute, and any shopper notes (“no brand swaps,” “OK to increase size”).

Acceptance writes the substitute SKU to the order line with an audit trail: original, recommended, accepted, who accepted, and timestamp. Rejection advances to the next ranked option or to skip, without forcing a low-confidence pick. Repeated rejections on the same category should feed back into preference history so the next order improves.

Guardrails that keep quality high:

  • Never auto-commit a substitute without shopper or associate confirmation.
  • Suppress recommendations when hard constraints cannot be checked (for example, allergen data missing on a candidate).
  • Cap upcharge and size change unless the shopper has a standing allowance.
  • Prefer empty output over a single weak candidate when similarity and preference confidence are both low.
  • Keep exception handling aligned with broader fulfillment exception flows so stockouts are not handled only as silent line skips.

Measuring Quality Without Guessing Outcomes

Track outcomes that reflect shopper and operational quality, not vanity rank metrics alone:

  • Acceptance rate of first- and second-ranked substitutes, by category and by shopper segment.
  • Post-delivery feedback and return or credit rates on substituted lines versus non-substituted lines.
  • Pick time impact: time from stockout detection to accept or skip, compared with manual search.
  • Empty-output rate and reason codes (missing SKU, stale availability, missing preferences), so data gaps get fixed upstream.
  • Constraint violations caught before acceptance (allergen or dietary blocks), as a safety check on the candidate filter.

Interpret these with care. A high acceptance rate in a lenient category does not prove the same model works for infant formula or specialty diet items. Segment results before changing global thresholds.

Getting Started in a Controlled Rollout

Start with a narrow category set where substitutes are frequent and constraints are well labeled (for example, dairy or paper goods). Wire live availability and shopper preference stores so empty-output rules can fire correctly. Train associates on reading reasons, when to call the shopper, and when silence from the model means “do not invent a swap.”

Expand only after acceptance and complaint metrics stabilize, and after preference feedback loops are writing rejections back into the ranking features. Pair the engine with promise and routing work so substitutes are offered in the right location and with realistic delivery expectations, rather than as a last-minute patch for a poorly routed order.

The durable outcome is fewer disappointing replacements and clearer accountability: the model proposes, the shopper or associate accepts, and incomplete inputs produce no recommendation at all.

Is this worth automating for you?

Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.

DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.

Measure the baseline first