Stock you can trust.
Never oversold.
On-hand, movements, transfers, purchase orders, counts — every unit through one door, so the number on screen is the number on the shelf.
Inventory
receive stockEvery unit moves by a movement.
Stock changes only through recorded movements — received, sold, transferred, adjusted. No silent edits, so no mystery shrinkage in the books.
Purchasing is a declared workflow.
Purchase orders and suppliers are declared in your rulebook. Receive against a PO and the position updates itself — one step, one record.
Counts settle arguments.
A count is a recorded fact. A discrepancy becomes an adjustment on the record — who counted, when, and by how much — not a guess.
See it at the door.
Receiving stock and advancing a purchase order are typed commands — the position updates itself, and every step is on the record.
$ whale cmd inventory.receive --json '{"sku":"beans-1kg","qty":24,"location":"back-room"}' # received 24 · on-hand 61 · movement recorded $ whale cmd lifecycle.advance --json '{"type":"purchase.order","id":"po_18","to":"received"}' # po_18 → received · stock posted · supplier on the record
Stock can't go below zero.
Oversell is refused in the engine, not in an app. No screen, import, or AI can promise a unit that isn’t there — the door refuses the sale and names the reason.
more capabilities: selling & pos · workflows & reports · devices & hardware