Stock movements and balances
Movements — /stock/movements [stock.read, post stock.post]
| Type | Prefix | Direction | Reason required | Unit cost |
|---|---|---|---|---|
| Receipt | RCV | → warehouse | no | required |
| Issue | ISS | warehouse → | yes | moving average |
| Transfer | TRF | warehouse → warehouse | no | carried |
| Adjustment | ADJ | ± | yes | moving average / standard cost |
| Job issue | JIS | warehouse → job | over-issue needs a reason | moving average |
| Job return | JRT | job → warehouse | no | same rate as issued |
Lifecycle: draft → posted (immutable) or draft → cancelled. Each posting is one database transaction with a gapless per-workspace document number and an idempotency key; a repeated post with the same key answers the original document, a different payload with the same key is refused (idempotency_key_reused). Job issue / return are created from the job page.
Views: table or timeline; filters by type, status, date, item, warehouse; export. The movement page shows lines, ledger effects, attachments (photos, signatures) and links to the PO or job that produced it.
Item cost: where it is used and how it changes
Every item has one current cost — the Standard cost on its form. It is the starting value of every cost or price you enter for the item, and it follows the cost stock really comes in at.
Where it is used. Picking an item on a line fills the line's cost or price with the item's current cost: stock movement lines (receipts, adjustments — also when you enter opening stock), purchase orders, vendor bills, quotes and sales orders, invoices, credit notes and vendor credits, and recurring profiles. Zudo AI uses it too when it fills in an order and you gave no price. The field stays editable: type another amount and a small Item cost ₹130.00 note under the field reminds you of the item's cost. Change the line's item and an amount that was filled in follows the new item; an amount you typed is never replaced. The BOM editor shows each component's cost (quantity per × scrap × current cost) and the material cost per unit from the current costs.
How it changes.
- Post a receipt (or an increasing adjustment) at a unit cost that is not the item's cost — for example BOLT-M8 costs ₹0.25 and the delivery note says ₹0.30.
- The line shows a ticked box Use ₹0.30 as BOLT-M8's cost from now on. Leave it ticked and post: from now on the item's cost is ₹0.30, so the next movement, purchase order and invoice start at ₹0.30. Untick it to post at ₹0.30 while keeping the item's cost at ₹0.25 (a one-off price).
- Receiving a purchase order works the same way: the Receive dialog has one box, Use the order's unit costs as the items' costs from now on.
Good to know:
- The change happens in the same step as the posting (all or nothing) and is written to the audit log: "Standard cost of BOLT-M8 changed from ₹0.25 to ₹0.30 by stock movement RCV-000123".
- The item's quick view shows the current cost and Last changed by RCV-000123 on <date> (or by hand after an edit); the Items list has the optional columns Cost changed and Cost set by movement. Reports, dashboards, procurement and Zudo AI read the same value.
- Posting needs only the stock permission (
stock.post): the cost is updated by the posting on the item's behalf, so a storekeeper who cannot edit items still keeps costs current. - Several lines for the same item in one movement: the last line wins.
- Issues, transfers, decreasing adjustments and job issues/returns never change the cost. Reversing a receipt (issuing the stock back) does not change the cost back — edit the item if you need the old cost.
- Stock value (the Average cost on Balances) is a separate figure: the moving average of what you actually paid. The item's cost is the price you expect to pay next.
Balances — /stock/balances [stock.read]
Quantity and value per item and warehouse, straight from the ledger. Low-stock alerts: set a level per item; items below it are flagged and listed. A heatmap view shades warehouses × top items. The on-hand range slider filters rows. Export for stock counts.
Item history — /stock/items/:id/history
The per-item ledger: every entry with document, warehouse, quantity in/out, running balance and cost.
Last updated