Inventory & Spares
Warehouses, products, SKU variants, stock levels, movements, adjustments, transfers and bin locations.
This is the first operational module
Everything else depends on the warehouses and variants you create here. Procurement receiving, sales fulfilment and the port warehouse bridge all read from stock records that start in this chapter.
The module has four tabs: Products, Warehouses, Stock Levels and Movement Ledger.
Inventory → Inventory & SparesRoles
| Action class | Roles allowed |
|---|---|
| Create and edit master data | OPERATOR — CEO, COO, CFO, USER |
| Delete master data | MANAGER — CEO, COO, CFO |
| Adjust stock, transfer stock, set bin locations, manual movements | MANAGER — CEO, COO, CFO |
| View everything | Any member |
Reading a stock row
For every warehouse and variant the system shows three numbers. Understand them before you act.
| Field | Meaning | Changed by |
|---|---|---|
| On hand | Physical quantity in the warehouse | Receipt, issue, adjustment, transfer, return |
| Allocated | Reserved by an approved sales order, not yet shipped | Sales-order approval up, fulfil or cancel down |
| On order | Committed on an approved purchase order, not yet received | Purchase-order approval up, receive or cancel down |
| ATP (Available To Promise) | On hand − Allocated. What a new sales order can promise | Derived |
ATP is colour-coded in the Stock Levels table: red when negative (over-allocated), muted at zero, otherwise positive.
Which form to open first
| You want to… | Tab | Button | Minimum role |
|---|---|---|---|
| Add a stocked item | Products | New Product, then New Variant | OPERATOR |
| Group items | Products | Manage Categories | OPERATOR |
| Add a stock location | Warehouses | New Warehouse | OPERATOR |
| Correct a count or write off | Stock Levels | Adjust Stock | MANAGER |
| Move stock between depots | Stock Levels | Transfer Stock | MANAGER |
| Set a bin location | Stock Levels | Click the Bin cell | MANAGER |
| Record a return or AI ingestion | Movement Ledger | New Movement | MANAGER |
| Audit history | Movement Ledger | View only | Any member |
Adjust stock (count corrections, write-offs)
- S1
Open Adjust Stock
From Stock Levels, choose Adjust Stock.
Inventory & Spares → Stock Levels → Adjust Stock - S2
Enter the change
Choose the warehouse and product variant, enter the quantity change (positive to add, negative to remove) and an optional note.
- S3
Save
The system writes one ADJUSTMENT movement and updates on-hand.
- Quantity cannot be zero; the magnitude is capped at ±1,000,000.
- Stock cannot go negative — an adjustment that would take on-hand below zero is rejected.
- No journal entry is posted. Record the accounting effect (such as shrinkage expense) separately if you need it in the books.
- Editing after posting is not supported — post a compensating adjustment instead.
Transfer stock between warehouses
- T1
Open Transfer Stock
From Stock Levels, choose Transfer Stock.
Inventory & Spares → Stock Levels → Transfer Stock - T2
Choose the route
Source warehouse, destination warehouse (must differ), product variant and quantity, plus an optional note.
- T3
Save
The system writes two movements sharing one reference: an ISSUE at the source and a RECEIPT at the destination.
Note
No journal entry
A transfer is a pure stock movement. The source must have enough on hand, or the transfer is rejected.
Bin locations
From Stock Levels, click the Bin cell for a row, type a short location code and press Enter (Escape cancels). A bin can only be set on a row where a stock record already exists — adjust or receive stock first. The code holds up to 50 characters.
Manual movements (returns and AI ingestion)
Use the Movement Ledger's New Movement form only for RETURN (goods coming back) and AI_INGESTION (stock created from an AI-extracted document). Choose warehouse, variant, type, quantity, optional unit cost and note.
Watch
Use the right door
For receipts use a purchase order (CH 05). For issues use a sales order (CH 06) or the port gate-out bridge (CH 07). Adjustments and transfers have their own forms above.
Movement types reference
| Type | Direction | Created by | Auto-posts to GL? |
|---|---|---|---|
| RECEIPT | IN | PO fulfil/receive; port gate-in; stock transfer (destination) | Yes — via the PO: Dr 1300 Inventory / Cr 2050 GRNI |
| ISSUE | OUT | SO fulfil; port gate-out; stock transfer (source) | No |
| ADJUSTMENT | IN or OUT | Adjust Stock (signed quantity) | No |
| RETURN | IN | New Movement (customer or supplier return) | No |
| AI_INGESTION | IN | New Movement from an AI-extracted document | No |
ADJUSTMENT is the only type that can be negative. Every other type is always positive, with direction implied by the type.
Deletion rules
| Entity | Can be deleted when… |
|---|---|
| Warehouse | No active stock (on hand, allocated or on order) in it |
| Product | None of its variants has active stock |
| Variant | It has no active stock |
| Category | It has no products and no children |
Reports
| Report | Answers |
|---|---|
| Inventory Valuation | On-hand quantity × weighted-average cost, per product and variant |
| Stock Report | Current stock levels by warehouse and variant, with ATP |
| Movement History | Full movement ledger with filters by type, variant and date range |
Note
About weighted-average cost
Cost is approximated from purchase-order unit costs. A variant with no purchase history shows cost 0. All monetary values convert to your base currency.
Worked example
Warehouse Main exists; variant CABLE-10MM has on hand 100, allocated 0, on order 0.
- 01
Receive (procurement)
Approve a PO for 50 → on order 50. Receive → on hand 150, on order 0, RECEIPT movement, GL Dr 1300 / Cr 2050.
- 02
Count correction
3 units damaged → Adjust Stock −3 → on hand 147, ADJUSTMENT −3, no GL.
- 03
Transfer
Move 10 units Main → Depot-B → ISSUE 10 in Main, RECEIPT 10 in Depot-B, no GL. Main on hand 137.
- 04
Sell
SO for 40 approved → allocated 40 (ATP 97) → Fulfil → on hand 97, allocated 0, ISSUE 40, no GL.
- 05
Check
The Movement Ledger shows the full audit trail; Stock Levels shows on hand 97, allocated 0, ATP 97.
Troubleshooting
| Message | Cause | Fix |
|---|---|---|
| Cannot delete product/variant/warehouse with active stock | Stock is on hand, allocated or on order | Clear it: ship or cancel allocated orders, receive or cancel POs, then adjust or transfer to zero |
| Insufficient stock. Current on-hand: X, adjustment: Y | Adjustment would take on-hand negative | Correct the count or receive stock first |
| Source and destination warehouses must be different | Same warehouse on both sides | Choose a different destination |
| Insufficient stock in source warehouse. Available: X, requested: Y | Transfer exceeds on-hand at the source | Reduce the quantity or receive stock first |
| Cannot issue stock from empty warehouse. No stock record exists for this variant. | No stock row for that warehouse and variant | Receive or adjust stock into that warehouse first |
| Stock record not found (bin location) | No stock row yet | Receive or adjust stock first |
| No active warehouse found | No active warehouse | Activate or create a warehouse |
| Product variant not found | Variant id is not in your workspace | Pick a variant from the dropdown |
| Duplicate line item for variant… | Same variant twice in one order | Merge quantities into one line |
Ledger boundary and reconciliation
Inventory quantity moves do not post journals. Inventory is valued in the books only on a purchase-order goods receipt (Dr 1300 Inventory / Cr 2050 GRNI). Sales and issues reduce quantity but do not post Cost of Goods Sold.
- Goods received and invoiced: GRNI (2050) should net to roughly zero for fully received and invoiced POs. A residual means a receipt or invoice is missing.
- Inventory GL (1300) changes only on goods receipts and their reversals. Compare it to the Inventory Valuation report. Differences come from adjustments, transfers, issues and the warehouse bridge, which intentionally do not post.
- If you need shrinkage or COGS in the books, post a manual journal from the adjustment and issue data, or raise a change request to wire it automatically.
Cheat sheet
- Setup order
- Warehouse → (Categories) → Product → Variant
- Daily order
- Receive (PO) → adjust or transfer → issue (SO or port gate)
- New stock item
- Inventory & Spares → Products → New Product, then New Variant
- New location
- Warehouses → New Warehouse
- Correct a count
- Stock Levels → Adjust Stock
- Move between depots
- Stock Levels → Transfer Stock
- Set a bin
- Stock Levels → click Bin
- Return or AI ingestion
- Movement Ledger → New Movement
Rule
Rules that never change
Stock is tracked at the variant, not the product. ATP = on hand − allocated. Adjustments, transfers and issues do not post to the GL. Active stock blocks deletion of products, variants and warehouses.