The big picture
Items are the atoms — everything you buy, make and sell is one.
Inventory is the shared master under every other module. A product/item is bought (Purchasing), consumed and produced (Production), and sold (Sales). Its stock is one authoritative number moved by those modules through a single audited ledger. This guide is about the item itself and the stock behind it.
An item can also track batch/lot numbers and use-by dates — which units came in on which delivery, first-expiry-first-out picking, and labelling stock you already hold. It is a per-item switch and needs no migration. Read Batch, Lot & Expiry.
stockQty is the single source of truth for on-hand. Sales invoices, GRNs, work orders, and adjustments all move it — and every move writes one row to the item's stock history with a reason code. Learn to read those reasons (§04) and you can explain any quantity.
Where the screens live
Items
The catalogue — natures, codes, stock, price, low-stock.
/catalogStores
Where stock physically sits; inter-store transfers.
/catalog/storesStock Transfer
Move quantity between stores (no total change).
/catalog/stock-transferStock Movements
Every item's history rows in one list, filterable by reason.
/catalog/stock-movementsStock Valuation
Quantity × average cost, today or as of a past date.
/catalog/stock-valuationReorder Suggestions
Items at or below their reorder point, grouped by supplier.
/catalog/reorderItem detail
Stock card, pricing, BOM usage, adjust & history.
click an itemAll but Item detail are entries under Inventory in the sidebar; item detail / edit / stock history open by tapping through. Inventory ships in every plan. Permissions: canViewInventory to see, canAddProduct / canEditProduct to change (there's no separate delete flag — delete rides on edit/owner).
The item
Nature, an auto code, goods-or-service, and opt-in stock.
Item nature & the auto-code prefix
Every item carries a nature that classifies it and drives an auto-generated code prefix (per-nature running counter, e.g. RM-0007):
| Nature | Prefix | Can be a BOM's finished good? |
|---|---|---|
| Finished Good | FG | Yes |
| Semi-Finished | SF | Yes |
| Raw Material | RM | No (never manufactured) |
| Bought-Out | BO | No |
| Subcontracting | SC | Yes |
| Consumable | CO | No |
| Trading Good | TG | Yes |
| Unspecified | — none — | — |
The counter measures existing codes so it pulls up past any you typed manually. Prefixes are editable per business (Settings → Item Code Prefixes).
Goods vs service, and opt-in stock
- Item kind —
goodsorservice. Services hide stock/specs/production and relabel HSN → SAC. - Maintain stock — stock tracking is opt-in. When off, the item is never decremented/restocked (services, non-inventory items).
- Tax preference —
taxable · exempt · nilRated · nonGst; non-taxable forces GST 0. - GST unit (UQC) — required on a goods item under India GST (NOS, KGS, and the rest of the portal's list). A service is stored as NA and is never asked. Fix missing GST units, on the Items menu, writes the code onto the item or onto a finalised invoice, credit note or debit note, and does not change amounts.
Reading stock
On-hand, reserved, available, QC-HOLD, at-vendor — five balances, one item.
| Balance | Meaning |
|---|---|
On hand stockQty | Authoritative, issuable today. Always in the base unit. |
Reserved reservedQty | Committed to released work orders (recomputed live on the detail). |
| Available | stockQty − reservedQty — what's truly free. |
QC-HOLD qcHoldQty | A separate countable balance; blocking-receipt goods sit here until the incoming inspection is submitted — accepted qty then moves to good stock, rejected qty out to an NCR (never issuable/sellable while held). |
At vendor atVendorQty | Owned stock physically at a subcontractor; left on-hand. owned = stockQty + atVendorQty. |
Multi-UOM
Enter in boxes, store in pieces.
An item has one base unit (e.g. pcs). Stock is always stored and moved in the base unit — alternative units are a data-entry convenience only.
- An alternative unit carries a factor = how many base units make one alt unit (base
pcs,boxfactor 12 → 1 box = 12 pcs). - When you receive or adjust in an alt unit, the system converts to base for the ledger and records the entry unit/qty for the audit trail.
- Purchase cost is normalised to a per-base-unit cost so weighted-average costing stays consistent.
The stock ledger
Every movement, named. This is the master reason table for the whole system.
Each change writes a row to the item's Stock history with a signed quantity and a reason. The history and the Stock Movements screen show the label in the first column; these are written across Sales, Purchasing, Production and Quality — this is the complete map:
| Reason (as shown) | Written when | Δ |
|---|---|---|
| Goods receipt (PO) | Goods received against a PO | + |
| Received on bill | A direct bill (no PO) brings the goods in, when Settings → Purchases is set to receive and capitalise | + |
| Received into QC hold | Receipt held by a blocking incoming gate — counted in QC-HOLD, not on hand | 0 |
| Released from QC hold | Incoming inspection submitted — accepted qty joins good stock | + |
| Quarantined (QC) | Units rejected at inspection / NCR | − |
| Accepted as-is (NCR) | Non-conforming units accepted into stock | + |
| Returned to vendor | Goods sent back on a debit note | − |
| Issued to production | Components issued to a work order | − |
| Returned from production | Unused components returned from a work order | + |
| Produced (work order) | Finished goods received from a work order | + |
| Sent for job work · Returned from job work · Written off at vendor … | Subcontract material out and back | ± |
| Invoice sale | Invoice finalised — the only sell-side stock-out | − |
| Invoice cancelled | A finalised invoice is cancelled | + |
| Returned on credit note · Credit note cancelled | Customer return restocked / undone | + / − |
| Store transfer · Placed into a store | Location only — the total does not change | 0 |
| Landed cost applied | Freight etc. added to the cost — a revaluation, no quantity | 0 |
| Purchase · Sale Return · Opening Stock · Damage / Loss · Correction · Other | Manual stock adjustment (§05) | ± |
Adjusting stock
The manual lever — with a reason and an overselling guard.
The Adjust stock action opens a sheet: pick a reason, enter a quantity (in any unit), add a note. The six manual reasons:
| Reason | Direction |
|---|---|
purchase — receive stock | + |
saleReturn — customer return | + |
openingStock — opening balance | + |
damage — damage / loss | − |
correction — count correction | ± (you choose) |
other — misc | ± (you choose) |
With Settings → Allow overselling off (the default), a reduction that would take on-hand below zero is refused: you see "Stock would go negative" and, if you press Proceed, "Insufficient stock…". Turn the setting on and the adjustment goes through. The same setting decides whether finalising an invoice may oversell. Other outward moves have a fixed rule: a return to vendor or a job-work issue always refuses, a work-order issue goes below zero only if you tick its over-issue override, and a QC quarantine takes only what is there.
Stores & transfers
Where the total sits — an attribution layer over the one true quantity.
An item's stockQty is the truth; stores only attribute it. A transfer moves storeBalances and writes a zero-quantity store_transfer ledger row — the on-hand total is untouched. Anything not yet attributed sits in an unattributed pool; over-attribution shows as drift. That's why "needs placing" and "needs reconciling" exist.
Valuation
Moving-average cost — where it updates, and where it doesn't.
Stock is valued at a moving-average cost (stored as costPrice, per base unit). On each priced GRN the cost re-blends:
newCost = (existingQty × existingCost + receivedQty × purchaseCost) ÷ totalQty
A partial receipt from a work order blends the order's standard cost per unit into the average, the same way a GRN does. When the work order completes and Books is on, the finished good's average is re-stamped from the actual production cost. A landed cost voucher revalues the goods still on hand. Nothing else — a sale, a transfer or an adjustment — changes the average.
Inventory → Stock Valuation values every item at quantity × average cost, today or as of a past date (it rolls later movements back). On the Items screen the Stock value tile leaves out any item whose on-hand or cost is negative and lists them, so one bad row cannot distort the total.
Low stock & reorder
Knowing when to buy.
- Low stock — an item is low when on hand ≤ its Low stock at threshold. The item detail shows a red level bar, and the dashboard rolls low items into a "running low on stock" banner and tile; an adjustment that crosses the threshold raises a notification.
- Reorder point — separate from the threshold. Inventory → Reorder Suggestions lists every active, purchasable item whose position (on hand − reserved + QC-HOLD + at vendor + still due on open POs) has reached its reorder point, grouped by preferred supplier.
- The suggested quantity is reorder point + safety stock − position, at least the minimum order qty. Edit it, untick what you don't want, and one tap creates a draft PO per supplier that follows the normal approval flow.
- A morning reminder lists items at or below their reorder point — sent when a new item joins the list, otherwise as a weekly digest while items stay low.
Quick reference
The tables to keep open while you learn.
| Concept | Values |
|---|---|
| Routes | /catalog · /catalog/stores · /catalog/stock-transfer · /catalog/stock-movements · /catalog/stock-valuation · /catalog/reorder |
| Item natures | Finished Good · Semi-Finished · Raw Material · Bought-Out · Subcontracting · Consumable · Trading Good · Unspecified |
| Code prefixes | FG · SF · RM · BO · SC · CO · TG (Unspecified → none) |
| Item kind | goods · service |
| Tax preference | taxable · exempt · nilRated · nonGst |
| GST unit | UQC on a goods item (a service is NA). A goods invoice line copies it, and a tax invoice cannot be finalised without one. |
| Stock balances | on-hand stockQty · reservedQty · available · qcHoldQty · atVendorQty |
| Adjustment reasons | Purchase · Sale Return · Opening Stock · Damage / Loss · Correction · Other |
| Below-zero rule | Settings → Allow overselling (off by default) — governs Adjust stock and invoice finalise |
| Permissions | canViewInventory · canAddProduct · canEditProduct |
One quantity, one ledger. Every module moves the same stockQty and signs its reason. Stores say where it is, GRNs set what it cost, and QC-HOLD keeps unverified goods out of it. Read the reason codes and nothing about stock is a mystery.