Stock

Overview
This page shows the inventory of all stock-managed items. Three figures sit side by side, and telling them apart avoids most misunderstandings:
| Figure | Meaning |
|---|---|
| On hand | what is physically there |
| Reserved | what is already promised through orders |
| Available | on hand minus reserved — the only figure that promises anything |
Planning on on hand rather than available means selling goods that belong to another order.
Alongside sit the reorder point and reorder quantity, plus average cost and stock value; items without a value appear as unvalued.
Keep B-stock separate. Even without multi-warehouse, every item condition — new, used/B-stock, refurbished, damaged — has its own stock. A return as B-stock never lands in new stock; only new goods can be sold on orders. A channel listing with a condition (e.g. used) is served from exactly that stock. Checked B-stock becomes new goods again via change condition — a movement type of its own, logged; the cost value stays unchanged.
Core tasks
Find shortfalls. The below reorder point only filter shows where reordering is due — the row marks it as well. The comparison uses the available stock, not the physical figure.
Adjust stock. Stock adjustment books a difference — positive in, negative out — with a reason/note. The reason is not a formality: a correction without a justification cannot later be told apart from a mistake.
Open stock settings. Reorder point and reorder quantity are maintained per item.
See and change B-stock. If an item also lies in a condition other than new, a tag per condition with the quantity appears below its name (e.g. Used/B-stock: 3). The columns on hand, reserved and available count new goods only. The Change condition button in the row books goods from one condition into another — prefilled with the usual case "checked B-stock becomes new"; the form shows the free stock of the source condition. Only users with the permission to change conditions see the button.
Fields in detail
The list itself is a display — writing happens through two masks per article row: stock adjustment and stock settings. Both work on ProductStockResource, addressed by the article ULID (productUlid).
Stock adjustment
| Field | Required | Values / format | What it does |
|---|---|---|---|
Adjustment (±) delta | yes | signed whole number, not 0 | The quantity booked — positive values book in, negative values book out. Nothing is overwritten: the correction becomes its own line in the stock journal (origin manual). If it is missing or 0, the server rejects the booking. |
Reason/Note note | no | text | Why the correction was made. Formally optional, practically half the value: a correction without a reason cannot later be told apart from a mistake. |
If a booking would take stock below 0 it is rejected — unless allow negative stock is set for the article.
Stock settings
| Field | Required | Values / format | What it does |
|---|---|---|---|
Reorder point reorderPoint | no | whole number, 0 or more in the mask; empty = no monitoring | From which available stock level reordering is due. Falling below marks the row and is the basis of the reorder suggestions. The comparison uses available, not onHand. |
Reorder quantity reorderQty | no | whole number, 0 or more in the mask | How much is suggested when the level is undercut. |
Allow negative stock allowNegative | no | yes/no (default: no) | Off: a booking that would take stock below 0 is rejected. On: bookings below 0 are permitted — meant for backorders, not as a permanent state. |
Change condition
| Field | Required | Values / format | What it does |
|---|---|---|---|
Article productId | yes | stock-managed article | Which article is rebooked. A sales set cannot be rebooked — its stock lives on the components. |
From condition fromCondition | yes | new, used/B-stock, refurbished, damaged | Which stock the goods come from. Only the free stock of this condition can be rebooked; more is rejected with a message. |
To condition toCondition | yes | as From condition, but a different one | Which stock the goods go to — e.g. checked B-stock becomes new and can be sold on orders again. |
Quantity qty | yes | whole number greater than 0 | How many units change condition. |
Warehouse warehouseId | no | warehouse (multi-warehouse only) | In which warehouse the rebooking happens. With multi-warehouse the form offers the warehouse, prefilled with the default warehouse; the quantity hint then shows the free stock of that warehouse. Via the interface, empty means the default warehouse. |
Bin binId | no | bin (multi-warehouse only) | Where the goods lie. Outgoing and incoming stay on the same bin; the distribution across bins stays correct per condition. The form offers the bins of the chosen warehouse that hold goods in the source condition; without a bin the booking takes what is free in the warehouse. A bin without a warehouse is rejected. |
Reason note | no | text, max. 1000 characters | Why the goods are rebooked, e.g. the inspection result. Appears in the log and in the stock journal. |
Every rebooking is logged with who and when, and appears as two lines of the type condition change in the stock journal. The cost value does not change — writing down B-stock is a deliberate booking by accounting.
Displayed values
These figures are not entered but calculated. They change through bookings: goods receipt, delivery, stock take or transfer.
| Element | Field | What it means |
|---|---|---|
| SKU / article | sku, name | Which article it is about. |
| On hand | onHand | What is physically there — the sum of all journal lines. |
| Reserved | reserved | What is lying there but already belongs to someone through orders. |
| Available | available | onHand minus reserved. The only figure that promises anything. |
| Avg. cost | avgCostAmount | Moving average cost price per unit, in cents. Empty means unknown, not "zero euro". |
| Stock value | stockValueAmount | avgCostAmount × onHand, in cents; not valued without a known cost price. |
| Last valued | valuedAt | When the average was last carried forward. |
| Movements | movements | The last 50 journal lines (single fetch through the interface only). |
| Item id | productId | The internal number of the item — Change condition addresses the item through it. |
| B-stock per condition | conditionStock | Per condition other than new: on hand, reserved and free (condition, onHand, reserved, available). Only conditions with stock or reservations; shown as tags below the item name. |
Above the list sit two totals that deliberately do not follow the list filters: the total stock value and the number of articles without a cost price. As long as the second figure is above 0, the stock value shown is a lower bound — the page says so explicitly.
Negative stock. If an article is below zero (only possible when negative stock is allowed), it counts as 0 in the total stock value — not as a deduction. The page names such lines and their quantity in a separate notice; through the interface they are in negativeStockLines and negativeStockOnHand.
B-stock in the stock value. B-stock is valued at the average cost of new goods of the same item and is included in the total stock value; a tile Of which B-stock shows its share and the quantity. There is no automatic write-down — that is a deliberate booking by accounting. If the average cost of new goods is missing, the B-stock stays unvalued and the page reports the quantity as a gap. Through the interface, the stock value report (/v1/product-stock-value) returns one line per item and condition (condition) and the totals conditionOnHand, conditionValueAmount and conditionUnvaluedOnHand.
Settings & permissions
- Module
module.products. products.stock.viewto see,products.stock.managefor adjustments.products.stock.change_conditionto change the item condition — a permission of its own,
because it makes B-stock sellable (role Umsetzung).
- Only stock-managed items appear. The marker is set on the item, see
- For regular counting, a stock take is the right route — not a
series of individual adjustments.
FAQ & troubleshooting
An item is missing from the list. It is not marked stock-managed.
Available is lower than on hand although nothing was sold. Then goods are reserved — through open orders. That is normal, not a fault.
**The stock value reads unvalued.** Then no cost value exists. It arises from receipts carrying a price.
We corrected many differences by hand. Use a stock take. It freezes the target figure, records the count and is therefore evidenced — individual adjustments are not.