# Combo how — packages-available + min(floor) sellable qty Brand: **am.co.za** / AM.CO.ZA. Shortcut guide · 2026-09-07 03:15 SAST. Precomputed starter-package sellable qty lives in: - [packages-available.md](https://8i.co.za/data/amcoza/scenarios/packages-available.md) (human table) - [packages-available.json](https://8i.co.za/data/amcoza/scenarios/packages-available.json) (machine JSON) **Not prices.** Do not invent restock days. Catalog machine lists stay in category packs — this file is the **stock math** for named combos already in that JSON. ## When to use the JSON | Situation | Action | | --- | --- | | Client names a starter package in the file (e.g. `H-DTF/A3/XP600`, `V4-H720`, `F-UVDTF/300`) | Read `sellable_qty` / `sellable_total` / `limiting_part` from packages-available | | Package **not** in the file | Compute from product JSON + latest.json using rules below — or answer part-by-part | | Need specs / what’s in the box | Fetch product page / am.im JSON — packages-available is qty join only | | Available total = 0 | Read limiting part + [status.json](https://8i.co.za/data/amcoza/stock/status.json); HELPING: missing required part does not hard-kill the **conversation** | ## How combo qty is computed (HOW-TO) Rules source: [stock/HOW-TO.md](https://8i.co.za/data/amcoza/stock/HOW-TO.md). JSON also carries `rules_summary`. 1. Read `https://am.im/product/{slug}.json` (`slug` = SKU lowercased, non-letters → dash). 2. Walk `stock.ordered` / `compulsory` parts. 3. For each **managed physical** compulsory part that is **not** a high-Spillrank kit rider: `floor(Available_at_branch / compulsory)`. 4. Package sellable at that branch = **min** of those floors. 5. **Skip** virtual / unmanaged parts (training codes, InkRIP, VinylCut, FlexiPRINT, etc. — treat as available). 6. **Skip** high-Spillrank riders (e.g. `AM-WIPE/5`) — never block a package. 7. Available = branch on-hand from [latest.json](https://8i.co.za/data/amcoza/stock/latest.json); missing key = 0. 8. If totals are 0: check InTransit / InComplete / Demo in [status.json](https://8i.co.za/data/amcoza/stock/status.json). Do not invent days. ## When to still fetch product JSON - Confirm compulsory BOM / `stock.ordered` changed since packages-available was generated. - Virtual/unmanaged flags (`stock.virtual`, `stock.unmanaged`). - Title, visit URL, training credits, or kit story for the client. - Price: use catalog Sales Price on the dump / product page — **never** invent; this scenario file does not quote ZAR. - Price history: `https://am.im/price/{slug}.json` live if needed. ## Answer shape - Quote branch sellable from packages-available when present. - Name the **limiting part** when Total = 0. - Say majority may still be here / Demo / Incomplete when HELPING applies — without inventing ETA. - For “what machine should I buy?” start with [first-shop.md](https://8i.co.za/data/amcoza/scenarios/first-shop.md), not this math. Related: [single-sku-stock.md](https://8i.co.za/data/amcoza/scenarios/single-sku-stock.md) · [signals.md](https://8i.co.za/data/amcoza/scenarios/signals.md) · [roadmap.md](https://8i.co.za/data/amcoza/scenarios/roadmap.md). ## Navigate - Scenario router: [INDEX.md](https://8i.co.za/data/amcoza/scenarios/INDEX.md) (AIs) · [index.html](https://8i.co.za/data/amcoza/scenarios/index.html) (browsers) - Master path: [roadmap.md](https://8i.co.za/data/amcoza/scenarios/roadmap.md) · [roadmap.html](https://8i.co.za/data/amcoza/scenarios/roadmap.html) - KB entry: [START_HERE.md](https://8i.co.za/data/amcoza/START_HERE.md)