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.
Take over opening stock. When moving from a legacy system, the data import with the target Stock (standard warehouse) takes on the counted quantities per SKU — as an adjustment movement with the run as its source, optionally with unit cost.
Trace movements. The Movements button in the row opens a timeline on the right with the item's latest 50 bookings, newest first: type (adjustment, reservation, release, shipment, goods receipt, stock-take difference, condition change), signed quantity, source (e.g. manual or the triggering document), note, who booked it and when. Bookings without a signed-in user — from a channel or a background run, for instance — show as System. B-stock carries a tag with its condition. The same timeline is on the item in the Stock tab. Read permission is enough to view it.
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, newest first — in the Movements timeline and on a single fetch through the interface. Per line quantity (delta), type (type), condition (condition), source (sourceRef), note (note), time (bookedAt) and the name of the booking user (bookedByName, empty for bookings without a user). |
| 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.