Stock & holds
What the shelf figure means, how to correct it honestly, how to move stock between branches, and how to put three shirts behind the counter for the customer coming back at six.
On hand and available
Two numbers, and the difference matters.
| What it means | What changes it | |
|---|---|---|
| On hand | What is physically in the shop. The shelf count. | Sales, receiving goods, adjustments, waste, transfers, cycle counts. |
| Reserved | Stock that is here but already spoken for — a hold for a customer. | Holds only. |
| Available | On hand minus reserved. What a new customer can actually buy. | Both of the above. |
A hold never touches on hand, so the shelf figure stays truthful while an item is set aside. Only the sale moves on hand.
On the Inventory page the Qty column shows
on hand, with (res 3) beside it when some of it is reserved. The
On-hand valuation report shows On hand and Available as
separate columns.
The Inventory page
Open Inventory — "On-hand grid with adjust, waste/spoilage, store transfer, ledger, lots, and cycle counts." The On hand table lists SKU, Name, Barcode, Qty, Cost, Value, Reorder and Actions.
Search matches "SKU, name, or barcode". Three filter chips narrow the list: All, Low stock and Out of stock, each with a count. Rows carry an amber Low or red Out badge.
Every row has four buttons: Adjust, Waste, Transfer, History.
The badge and chips on this page use on hand, and when a product has no reorder level set they fall back to a threshold of 5. The Low stock report in Reports uses available (on hand minus reserved) and only flags an item that either has a reorder point set or has run to zero. The two screens can therefore disagree on the same product. Set a reorder level on the products you care about and both agree.
Getting stock in
There are three honest ways stock arrives, and one that is not stock at all.
- Receive it against a purchase order. The normal route — see Suppliers & purchase orders. Posting a goods receipt raises on hand and updates the average cost.
- Adjust it in for the opening count or a one-off, with a reason on the record.
- Receive a transfer from another store in the same company.
Importing a product CSV creates products; it does not create stock. Use Inventory → Import CSV for opening quantities.
Adjust stock
An adjustment is how you tell the system the truth when the shelf and the screen disagree. It is deliberately not silent — every adjustment carries a reason and lands in the ledger.
- Find the product on Inventory and press Adjust.
- In Change quantity by, type the change, not the new total: "e.g. 5 to add, or -2 to remove". Positive adds stock; negative removes it.
- Pick a Reason: Correction, Found, Shrinkage, Damage, Theft, Write-off, Spoilage, Expired, Staff meal, Sampling, Production consumption, Donation, Breakage.
- Add a Note if it will help the next person.
- Press Post adjustment.
There is no "reverse this adjustment" button. A wrong one is corrected
by posting an opposite adjustment, and both entries stay in the ledger.
Read the sign before you press the button — typing 12 when you
meant -12 moves the count by 24.
Log waste
Waste is a deduction with a why. Use it for the tray of pastries that went in the bin, not for a counting mistake — that is an adjustment.
- Press Waste on the row.
- Enter a positive Quantity — the form takes what you lost, not the new total ("Deduct spoilage or loss from on hand").
- Pick a Reason: Spoilage, Expired, Damage, Breakage, Theft, Shrinkage, Staff meal, Sampling, Donation, Write-off.
- Press Log waste.
The Waste & loss report totals exactly these entries, valued at average cost. See Reports.
Cycle counts
A cycle count is the disciplined version of an adjustment: snapshot what the system thinks, count the shelf, and let the difference post itself.
The Stock count panel sits at the bottom of the Inventory page and needs the Advanced inventory add-on. Without it the panel says so: "Turn on Advanced inventory in Settings to run cycle counts that update on-hand stock", with a link to Open store modules.
- Choose a Count type — Cycle, Full or Spot.
- Press Start session. The panel opens the count and prints "Opened cycle count (N lines)."
- Walk the shelf and type the real figure into Counted for each line. Save a line to see its Variance against the snapshot.
- Press Finalize. Every line is saved and the differences post as inventory adjustments — "Finalized — N adjustment(s) posted."
- Discard throws the session away without posting anything.
The count table shows the first 20 lines of the session, but Finalize saves and posts every line in the session — lines you never saw are submitted with the value they were loaded with. On a large catalog, count in small Spot sessions rather than opening a Full count you cannot finish on screen.
Transfers between stores
Moving stock from one branch to another keeps both counts right without two adjustments and a phone call.
- On the source store's Inventory, press Transfer on the product row.
- Pick a Destination store. Only other stores in the same company are listed; with none you get "No other stores in this org. Add another store to transfer."
- Enter Quantity to send.
- Leave Ship immediately (deducts on-hand at source) ticked to send it now — the button reads Create & ship. Untick it to prepare the paperwork and ship later — the button becomes Create draft.
Shipping deducts on hand at the source. The destination store's count rises when the transfer is received there.
The Transfer button builds a transfer with a single line. Moving twenty products means twenty transfers. Moving stock between locations inside one store needs the multi-warehouse add-on, which the form tells you plainly.
History — the stock ledger
History on a row opens that product's ledger: every movement that made the number what it is — sales, receipts, adjustments, waste, transfers. If a count looks wrong, this is the screen that says who did what and when. The same data across all products is the Movement history report.
Low stock and reordering
- Set Reorder level on the product ("Alert when on-hand falls to this quantity").
- The Inventory page's Low stock and Out of stock chips show live counts.
- The Low stock report lists everything at or below its reorder point, plus anything with nothing available.
- The Dead stock report is the opposite question: items you are holding that have not sold in the window (90 days unless the store sets otherwise).
There is no automatic purchase order from low stock. You read the list and raise the PO yourself.
Lots and expiry
With Advanced inventory on, a Lots / expiry table appears on the Inventory page showing Lot, Product, Expiry and Status. Lots appear when you receive goods with lot tracking enabled. Without the add-on the section is simply not there.
Nothing warns the till or the manager when a lot's expiry date passes. Read the Lots table yourself, and write off expired stock with Waste → Expired.
Holding an item for a customer
"Put these three shirts behind the counter for the customer coming back at six." A hold reserves stock so nobody else can sell it, without pretending it has left the shop.
How a hold behaves
- A hold raises reserved by the quantity held. On hand does not move — the shelf figure stays honest.
- Because availability is on hand minus reserved, the till refuses to oversell the held stock to somebody else.
- You cannot hold what you do not have. Asking for more than is available is refused with a message spelling out the arithmetic: "Cannot hold 5: on hand 4, already held 2, available 2". The exception is a store that has Allow selling when out of stock turned on, or an untracked product — those never blocked a sale, so they do not block a hold either.
- A hold carries an expiry the shopkeeper sets: a fixed date and time, a number of hours from now, or explicitly never. If none is given the store's default hold life applies — and if the store has not set one, that default is 48 hours.
- When the expiry passes the hold auto-releases: it is marked expired and the reserved quantity is genuinely given back, so the stock becomes sellable again. That sweep runs whenever the holds list is read, whenever a new hold is created, and on every sale finalize — so a lapsed hold cannot quietly keep stock unsellable.
- A hold can also be released by hand (the customer changed their mind) or fulfilled (they came and bought it), which stamps the hold with the sale it became.
Each hold records the quantity, the product variant, an optional customer, a free-text note (a hold "for the man in the blue coat" with no customer record is perfectly valid), who created it, and its expiry.
Holds are built and working in the API — create, list, release, fulfil, and automatic expiry — but no page in the app shows them. There is no "Hold for customer" button on the Inventory page or at the till, and no counter list of what is being held. Until that screen ships, holds are only reachable by a system integrating with the API directly. Do not promise a customer a hold you cannot see.
For anyone driving this through the API: fulfil the hold before finalizing the sale. If the reservation is still standing when the sale checks availability, the till blocks its own sale.
Exporting
Export CSV on the Inventory page downloads the current filtered list — SKU, product, variant, barcode, on hand, reserved, average unit cost, value, reorder point and reorder quantity, plus lot columns when lots are in play.
The page loads up to 500 rows at a time and tells you when it has more: "Showing N of M matching items (API page cap). Narrow search or stock filter to find the rest."