Inventory here does two jobs: it saves you re-typing part numbers and prices, and it stops you promising the same alternator to two customers. The second one is where the design decisions are.
A part record
Name, part number and cost are the working minimum. Beyond that a part can carry a SKU, a vendor, a brand, a category, a pricing matrix, and the stock figures: quantity on hand, minimum and maximum.
Minimum quantity is what makes the low-stock filter work. Set it and a part that drops below it is flagged; leave it empty and the part is never reported as low, because you never said what low means.
Retail price comes off cost
If you don't type a retail price, it is calculated from the cost by the part's pricing matrix — and it is recalculated whenever the cost changes. A supplier puts their price up, you update the cost, and the sell price follows the rule you set instead of drifting.
Type a retail price explicitly and it stands.
Note
A part with no matching matrix band sells at cost, with no markup. That is the single most expensive thing that can go wrong here — see pricing matrices for how the bands cover the range.
Categories are shared with services
Warning
Part categories and service sections are one list, not two. Renaming a category renames it everywhere it is used, on parts and on the service sections of your orders alike.
Worth knowing before you reorganise them. It is one list on purpose — Brakes is Brakes whether it names a shelf or a section on a repair order — but it does mean a tidy-up in one place shows up in the other.
Reserving, and why it exists
The unit that matters is not what's on the shelf, it's what's available — on hand minus reserved. That is the number you can still promise.
Add a part to an order and it is reserved straight away. The stock hasn't moved — the part is still on the shelf, still in your on-hand count — but it is spoken for, and it no longer counts as available to anybody else.
Add a part to an order
Reserved. On hand unchanged, available drops.
Remove the line, or the customer declines the service
Released. Available goes back up.
Mark the order completed or invoice it
Consumed. On hand drops, the reservation clears. This is the moment stock actually leaves.
Every one of those movements is written to the part's transaction log with who did it and against which order, alongside your manual adjustments — receipts, returns, corrections, stock counts. The log is the answer to "where did those four go".
One part, one line
Adding the same part twice to the same service bumps the quantity on the line that's already there rather than opening a second identical row. The reservation follows the new quantity.
When there isn't enough
Reserving more than is available is refused, and the message says how many you actually have. A shop that would rather sell first and sort the stock out later can allow negative stock, in which case the reservation goes through and the available figure goes below zero — visibly, not silently.
Auto-reservation is on by default. With it off, parts land on the order without holding stock and you reserve deliberately.
Reserving by hand
The order's sidebar shows what is reserved and what isn't. From there you can reserve a single line, reserve everything on the order at once, or release a line. Use it when a part was added before the stock arrived, or when a job has been sitting long enough that you want to free the parts for something urgent.
Deleting a part
A part with live reservations cannot be deleted — something is depending on it. Release the reservations, or mark the part inactive instead: inactive keeps the history intact and takes it out of the picker.
Troubleshooting
"Available doesn't match what's on the shelf." It isn't meant to. Available is on hand minus reserved. The shelf count is on hand.
"Adding a part failed." Not enough available stock, and negative stock is not allowed for your shop. Receive the stock first, or allow negative stock.
"Stock didn't drop when I added the part." Correct — it was reserved, not consumed. It drops when the order is completed or invoiced.
"The retail price changed by itself." You changed the cost, and the part has no explicit retail price, so the pricing matrix recalculated it.
"A part sold at cost." No matrix band covers its cost. Check the bands.
"I can't delete this part." It is reserved on an open order. Release it, or deactivate the part.
"Renaming a category changed my order sections." Categories are one shared list across parts and service sections.