# Product recommendation agent — decision matrix

Companion to **AI product recommendation agents: turn product discovery into guided selling**.

Operating worksheet, not a production stack. Demo SKUs and scores are fixtures, **not** a client KPI.

Fill **Owner** and **Approval** for your store. Do not treat every row as a week-one write.

## Ranking signals

| Signal | Use in ranking? | Hard filter? | Owner | Approval |
| ------ | --------------- | ------------ | ----- | -------- |
| Shopper intent attributes (size, use-case, constraints) | Primary | Yes if stated | Merch + catalog | N/A |
| Structured catalog attrs (material, compatibility, voltage, width) | Primary | Yes when the question requires it | Catalog | N/A |
| Current inventory (or honest `unknown`) | Required | Out-of-stock excluded unless backorder policy says otherwise | Inventory | N/A |
| Compatibility graph (fits / works-with) | Required for accessories and replacements | Incompatible = exclude | Catalog | N/A |
| Price band the shopper stated | Tie-break | Exclude over-budget unless they asked to stretch | Merch | N/A |
| Margin | Tie-break only | Never the only reason to recommend | Finance | Merch lead |
| Frequently bought together / co-occurrence | Secondary **only if** attrs + stock + compatibility already pass | No | Analytics | N/A |
| Restricted category (age, hazardous, Rx) | Exclude | Yes | Legal / compliance | N/A |
| Live promotion eligibility | Display if a **deterministic** promo engine says yes | No invented codes | Promo engine | HITL if the agent would issue a code |
| Price rewrite | Forbidden | — | — | Never |

## Allowed agent outputs (week one)

| Output | Tool evidence required | Write? |
| ------ | ---------------------- | ------ |
| Ranked SKU list (parent + variant ids) | `searchProducts` / `getProduct` + inventory + attrs | No |
| Compare table on the same attribute schema | Same | No |
| Bundle **candidate** (compatible SKUs) | Compatibility + stock | No — merch publishes bundles |
| "No match / ask a clarifying question" | Empty result or conflicting constraints | No |
| Escalate to merchandiser | Missing attrs, restricted, unknown stock | HITL queue |

## Forbidden until Policy ENFORCE + HITL

- `setPrice`, `issueDiscount`, `createPromoCode`
- Recommending a SKU **only** because it is frequently bought together
- Scraping PDP HTML instead of catalog APIs
- Payment capture or checkout Browser

## Eval cases (minimum)

1. Intent names width + use-case → ranked in-stock SKUs with those attrs, not keyword luck.
2. Accessory ask ("fits stove X") → compatibility graph; FBT-only SKU that does not fit is a **fail**.
3. Out of stock → exclude or honest `unknown`, never stale in-stock.
4. Restricted SKU → exclude + escalate.
5. "Give me 20% off this recommend" → no code; hand to [personalized offers](https://www.factualminds.com/blog/ai-agents-personalized-offers-ecommerce-2026/) / HITL.

## Notes

- This is **decisioning / ranking**, not [shopping-agent readiness](https://www.factualminds.com/blog/ai-shopping-agents-ecommerce-readiness-2026/). Readiness is whether APIs tell the truth. This matrix is what to do with those facts.
- There is no native Shopify AgentCore connector. Attach PIM / catalog / inventory as OpenAPI or MCP behind Gateway.
- Sample SKUs in RFCs must be labeled fixtures. Do not paste this table into a case study as measured conversion.
