The home of record for what the engine needs and the numbers it runs on. The how-tos and
Troubleshoot suggestions link here.
What the catalogue needs
| Requirement | Effect |
|---|
| Module enabled for the tenant | No suggestions until on |
| Name + brand on products | The minimum — the engine works from these alone |
| Dosage form, cost price, strength | Optional, but make suggestions more accurate; never blocks on a missing field |
| Cost price (for up-sell) | Drives margin ranking. Products with no cost, zero cost, or cost ≥ selling price are treated as unknown margin — never ranked top, never claimed “higher margin” |
| ~90 days of sales (for cross-sell) | Needed so basket affinities can form |
This is graceful degradation by design — the engine never over-restricts on missing
optional fields. Why: How it stays safe & self-improving.
Classification scope & timing
| Behaviour | Value |
|---|
| In scope | Every SKU in stock (qty > 0) or sold in the last 90 days is classified; the dead catalogue is skipped |
| Restock sweep | A 30-minute background sweep enqueues newly in-stock products |
| Throughput | The classifier processes ~1,500 products/hour — a restocked item is suggestible within the hour; a 3,000-SKU catalogue is covered in ~2 hours |
| Shared cache | Products already seen elsewhere on the platform classify near-instantly |
Thresholds
| Threshold | Value |
|---|
| Suppression | A suggestion is auto-suppressed tenant-wide once ≥ 2 distinct cashiers flag the same pair (tunable; default 2) |
| Cross-sell affinity | A pair must co-occur in ≥ 3 baskets to be considered |
| Cross-sell cache | Rebuilt nightly per enabled tenant |