---
title: Inventory overview
order: 1
updated: 2026-07-12
---

# Inventory overview

The *Inventory* section is where your firm tracks physical stock — what you currently hold, what is coming in from suppliers, what is going out to customers, and every movement in between. This page is the map: it explains how stock is modelled, what each screen and action does, which permission unlocks it, and where to go for the step-by-step detail.

Everything on these screens is re-checked on the server. The app assumes any request can be forged, so a stock movement is only committed after the backend re-verifies the product, the location, your scope over that location, and that the quantity does not drive on-hand stock somewhere it should not go. A screen may hide a control you lack permission for, but even if the control were forced, the server refuses the operation.

## Open the Inventory section

Click *Inventory* in the sidebar. It expands to the screens your permissions allow. Three entries can appear directly in the sidebar:

- *Stock* — the snapshot of what you currently hold, and the launch point for transfers, adjustments, conversions, the ledger, assembly costs, and sample deliveries. Needs *Open Inventory Pages* (`inventory.viewInventory`).
- *In Stock* — arrivals coming in from suppliers, split across *Pending Arrivals*, *Pending Approvals*, and *Arrival History*. Needs *Open Inventory Pages*, *Create Stock Arrival Entry*, or *Approve Stock Arrival*.
- *Delivery Receipt* — dispatches going out to customers. Needs any delivery permission.

The *Inventory* group has no permission of its own — it appears whenever at least one child screen is visible to you. Several further pages (Pending Transfer, Assembly Cost, Sample Delivery, Delivery Note, Send Delivery Receipts, Send Arrival Receipts) are deliberately kept out of the sidebar and reached from a menu on one of the three screens above, so the primary navigation stays short.

## Before you start

Inventory records lean on other parts of the app. Set these up first:

- Warehouses, rooms, and racks — the location hierarchy every movement is recorded against. See [Warehouses](/docs/records/warehouses) and [Warehouse rooms](/docs/records/warehouse-rooms).
- Products — product heads and their codes. See [Products](/docs/records/products) and [Product codes](/docs/records/product-codes).
- Suppliers and their contact persons — needed to record incoming stock. See [Suppliers](/docs/records/suppliers) and [Supplier contacts](/docs/records/supplier-contacts).

## How stock is modelled

A few ideas run through every inventory screen. Learning them once makes the rest obvious.

### Locations: godown → room → rack

Stock is always held at a specific *rack*, which sits inside a *room*, which sits inside a *godown* (warehouse). Every arrival, delivery, transfer, adjustment, and conversion names the exact rack it affects, so you can always answer "where is it kept?" down to the shelf. Read-only location breakdowns are reachable from the per-head *Manage* view — see [Storage locations](/docs/inventory/storage-locations). To create or rename godowns, rooms, and racks, use the records screens, not the inventory screens.

### Movements, not edits

On-hand quantity is never typed in directly. It is the running total of individual *movements*: an arrival adds stock, a delivery removes it, a transfer moves it between racks, a physical entry nudges it up or down, a conversion consumes one product and produces another. Because every figure is derived from movements, the history always explains the snapshot. When today's number looks wrong, walking back through the movements almost always reveals why — see [Stock history](/docs/inventory/stock-history).

### Approvals: two pairs of eyes

Stock-changing actions that come from staff generally follow a *pending → approved* flow: one user records the entry, a second user with the matching approve permission commits it, and only then does on-hand stock actually move. This applies to arrivals, reverse arrivals (returns to supplier), deliveries, sample deliveries, and delivery notes. Transfers, physical entries, and conversions are committed immediately by the acting user, but only within locations that user is scoped to manage.

### Sellable stock

Some outbound records reserve stock before it is finally gone. A sample handed to a customer, or a delivery note raised before the sales order exists, subtracts its quantity from sellable stock while it is out — so the same pieces can never be sold or delivered twice — and adds it back if it is returned or unlinked.

### Manage scope

Stock operations are gated by *manage scope*: which godowns, rooms, or racks a user is allowed to move stock in. A firm administrator, or a user with *Manage Stock in Godowns/Rooms/Racks* over the relevant location, can act there; anyone else is refused server-side even if the location appears in a picker. Scope also decides whether the *Stock* screen shows its location filters at all — without any manage scope you simply see "Showing all locations".

## The Stock screen

*Inventory → Stock* is the snapshot of current holdings, grouped by product head. For the full walkthrough of the list, filters, columns, and per-head drill-down, see [View current stock](/docs/inventory/stock-overview).

### The list

Each row is a product head showing its *Current Stock*, its number of *Codes*, and a *Manage* button that drills into the individual product codes beneath the head. A negative current stock is shown in red — it means more has left a location than the movements say arrived there, which is worth investigating. Search by head name at the top; the list pages in blocks of 50 with a *Load More* button.

### Location filters

If you hold manage scope, a *Filter by Location* row lets you narrow the snapshot by one or more godowns, then rooms (enabled once a godown is chosen), then racks (enabled once a room is chosen). Godowns are searched live against the server; rooms and racks filter the already-loaded lists. A *Clear* link resets all three. Without manage scope these pickers are hidden.

### Value columns

With *View Stock Value Columns* (`inventory.viewInventoryStockValue`) two extra columns appear — value excluding tax and value including tax, formatted as Indian Rupees. These reveal cost figures, so the permission is usually limited to finance-aware roles.

### Future-stock columns

With *View Future Stock Columns* (`inventory.showFutureStock`) two planning columns appear:

- *Pending Arrival* — quantity expected in from purchase orders that are sent but not fully received, plus arrivals still waiting for approval.
- *Pending Dispatch* — quantity expected out from sales orders not yet fully delivered, plus deliveries still waiting for approval.

These are pipeline figures, not on-hand stock; they refresh when you reload the page.

### Toggle Columns

The actions menu (the *⋮* button at the top right) ends with *Toggle Columns* — tick or untick a data column to show or hide it. The product-head name and the *Manage* button always stay. The choice is remembered per device.

## Actions on the Stock screen

The *⋮* menu at the top right of *Stock* groups the movement tools. Each entry only appears if you hold the matching permission.

### Transfer

Shown with *Transfer Stock* (`inventory.transferStock`). The submenu holds:

- *Transfer Stock* — move stock between racks, rooms, or godowns without selling or returning it. Both the source and destination must fall inside your manage scope. See [Transfer stock](/docs/inventory/transfer-stock).
- *Transfer History* — the record of past transfers (also gated separately by *View Transfer History*, `inventory.viewStockTransferHistory`).

### Adjustment

Shown with *Physical Stock Entry* (`inventory.physicalAdjustment`). The submenu holds:

- *Physical Stock Entry* — a plain `+N` or `-N` movement at one rack, for stock found or lost during a physical count, or goods that arrived outside the purchase-order flow. See [Physical stock entry](/docs/inventory/physical-stock-entry).
- *Stock Entry History* — past physical entries.

### Convert

Shown with *Convert Stock* (`inventory.convertStock`). The submenu holds:

- *Convert Stock* — turn stock of one product into another (raw material → finished good), recorded as a single linked event with a consumed *from* side and a produced *to* side. Requires manage scope on **both** the source and destination locations. See [Convert stock](/docs/inventory/convert-stock).
- *Convert History* — past conversions.

### Stock Ledger

Always available. Opens a combined in/out movement list for any product over a date range, with its own column show/hide and drag-to-reorder controls remembered per device.

### Pending Transfer

Always available. Opens the *Pending Transfer* page — products awaiting arrival or delivery, i.e. the movements still in the pipeline.

### Assembly Cost

Shown with *View Assembly Costs* (`inventory.viewAssemblyCost`). Opens the assembly-cost page, where a product's recipe (which components, how much of each, and the batch output) drives an assumed production cost computed from real purchase prices on approved arrivals. Editing recipes additionally needs *Manage Assembly Costs* (`inventory.manageAssemblyCost`). See [Assembly Cost](/docs/inventory/assembly-cost).

### Sample Delivery

Shown with *View Sample Deliveries* (`delivery.seeSampleDeliveries`). Opens the sample-delivery page, where samples handed to customers for evaluation leave sellable stock until returned; returns can be partial. See [Sample Delivery](/docs/inventory/sample-delivery).

## Recording stock coming in

Incoming stock is logged on *Inventory → In Stock*, which has three tabs: *Pending Arrivals* (sent purchase orders still awaiting goods), *Pending Approvals* (logged arrivals waiting on a second user), and *Arrival History* (everything recorded). For the full tour of the tabs, filters, advanced filters, deleted-arrival logs, and the reverse-entry (return to supplier) flow, see [In stock and arrivals](/docs/inventory/in-stock).

Two ways to log an arrival:

- *Add Entry* on the *In Stock* screen records a direct arrival (no purchase order). See [Add a stock arrival](/docs/inventory/add-stock-arrival).
- *Upload Arrival* from a sent purchase order records the arrival against that PO, pre-scoped to its pending lines. Needs *Upload Stock Arrival From PO* (`inventory.uploadArrivalFromPO`).

Either way the arrival starts *pending* and a user with *Approve Stock Arrival* (`inventory.approveAddStockRequest`) must approve it before stock lands. Creating an entry needs *Create Stock Arrival Entry* (`inventory.generateAddStockRequest`); viewing the pending-PO tab needs *View Pending Arrival POs* (`inventory.viewPendingArrivalPurchaseOrder`).

After an arrival is approved you can email the supplier a receipt confirming what was received and what is still pending — via *In Stock → ⋮ → Send Arrival Receipts*, gated by *Send Arrival Receipt to Supplier* (`inventory.sendArrivalReceiptToSupplier`). See [Send arrival receipt to supplier](/docs/inventory/send-arrival-receipt).

### Undoing an arrival

- Goods that must go back to the supplier are recorded as a *reverse entry* from the purchase order — the inbound mirror of a sales return. It needs *Create Reverse Arrival (Return to Supplier)* (`inventory.generateReturnArrivalRequest`) to raise and *Approve Reverse Arrival* (`inventory.approveReturnArrivalRequest`) to commit.
- A direct (non-PO) arrival can't be reversed, so an approved one is undone by deleting it — firm admins always can; other users need *Delete Manual Arrival Entry* (`inventory.deleteManualArrivalEntry`), which is limited to non-PO entries.

Every deleted arrival is snapshotted to a permanent audit log before removal, recording who deleted it and when. See [In stock and arrivals](/docs/inventory/in-stock).

## Recording stock going out

Outgoing stock leaves against a customer order, recorded on the *Delivery Receipt* screen — see [Delivery receipt](/docs/enquiry-bank/delivery-receipt). Like arrivals, a delivery slip is created by one user (*Create Delivery Slip*, `delivery.generateDeliverStockRequest`) and approved by another (*Approve Delivery Slip*, `delivery.approveDeliverStockRequest`); only on approval does stock leave the named location. Related delivery permissions include *View Pending Deliveries*, *View Delivery History*, *Send Delivery Receipt to Customer*, *Create/Approve Return Request*, and *Back-date Delivery*.

Approved dispatches surface as a downward movement in the per-code *Stock Out* history and the stock ledger — see [Stock history](/docs/inventory/stock-history) and the read-only [Out stock](/docs/inventory/out-stock) list of approved dispatches.

### Delivery notes (goods handed over before the order exists)

A *delivery note* records goods you hand a customer on the spot, before any sales order exists; you link it to the order later so the same items are never delivered twice. While approved or linked, its quantity leaves sellable stock at the location it went out from. Reached from the *Delivery Receipt* page's top-right menu (*Delivery Note*). Gated by *View Delivery Notes* (`delivery.seeDeliveryChallans`), with separate permissions to create, edit, approve, attach to an order, detach, and delete. See [Delivery Note](/docs/inventory/delivery-challan).

## Inventory permissions at a glance

All inventory permissions depend on *Open Inventory Pages* (`inventory.viewInventory`), the module root. Assign them from [Users and permissions](/docs/settings/users-and-permissions).

- *Open Inventory Pages* — unlocks the Stock and In-Stock screens; every other inventory permission builds on it.
- *View Stock Value Columns* — the money columns on Stock.
- *View Future Stock Columns* — the Pending Arrival / Pending Dispatch columns on Stock.
- *View Transfer History* — the transfer history list.
- *Create Stock Arrival Entry* / *Approve Stock Arrival* — record and commit arrivals.
- *View Pending Arrival POs* / *Upload Stock Arrival From PO* — track and record arrivals against purchase orders.
- *Create Reverse Arrival (Return to Supplier)* / *Approve Reverse Arrival* — return received goods.
- *Delete Approved Stock Entry* / *Delete Manual Arrival Entry* — remove committed arrivals (the latter is non-PO only).
- *Transfer Stock*, *Physical Stock Entry*, *Convert Stock* — the immediate-commit movement tools.
- *Manage Stock in Godowns / Rooms / Racks* (plus their scope lists) — which locations a user may move stock in.
- *CRUD Godowns / Rooms* (plus their scope lists) — create and rename the location containers themselves.
- *View Assembly Costs* / *Manage Assembly Costs* — browse and edit production recipes.
- *Send Arrival Receipt to Supplier* — email supplier receipts.
- Delivery-side: *View Sample Deliveries* and *View Delivery Notes* (with their create/approve/return/delete companions) gate the sample-delivery and delivery-note flows launched from the inventory screens.

Firm administrators bypass these individual gates and see every screen and action.

## A typical inventory week

1. A supplier delivers goods. You log the arrival from *In Stock* — either fresh via *Add Entry* or against a sent PO via *Upload Arrival* — see [Add a stock arrival](/docs/inventory/add-stock-arrival).
2. A second user approves the arrival and stock lands in the chosen godown → room → rack.
3. As stock moves around the warehouse, you record it with [Transfer stock](/docs/inventory/transfer-stock); a physical count reconciles anything off-book with [Physical stock entry](/docs/inventory/physical-stock-entry).
4. Raw materials become finished goods through [Convert stock](/docs/inventory/convert-stock).
5. Stock leaving for a customer is dispatched against the order — see [Delivery receipt](/docs/enquiry-bank/delivery-receipt) — or handed over early with a [Delivery Note](/docs/inventory/delivery-challan), or lent out for evaluation as a [Sample Delivery](/docs/inventory/sample-delivery).
6. You reconcile and audit through the per-code [Stock history](/docs/inventory/stock-history), the *Stock Ledger*, and the value/future-stock columns on [Stock](/docs/inventory/stock-overview).

## Common questions

### Why does the stock figure differ between two screens?

Every figure is derived from the same movements, but the *Stock* screen's location filters narrow what you see. Make sure both screens are filtered to the same godown, room, rack, and product before comparing. A negative figure (shown in red) means more left a location than the movements record arriving there — reconcile it through the [Stock history](/docs/inventory/stock-history).

### Why does the screen show zero for an item I just received?

Either the arrival is still *pending* (not yet approved), or you are looking at a different location than where the stock landed. Open *In Stock* to check the arrival's status.

### Can I record a manual stock adjustment?

Yes — use *Physical Stock Entry* from the *Stock* screen's *⋮* menu (needs `inventory.physicalAdjustment`). It records a plain `±N` movement at a rack: add stock that arrived outside the purchase-order flow, or write off stock found missing during a count. See [Physical stock entry](/docs/inventory/physical-stock-entry).

### Why can't I see the Transfer / Convert / Physical Stock Entry actions?

Each is gated by its own permission — *Transfer Stock*, *Convert Stock*, and *Physical Stock Entry* respectively — and all depend on *Open Inventory Pages*. Transfers and conversions additionally need manage scope over the locations involved; without it the server refuses the movement even if the control were forced.

### Why don't the location filters appear on the Stock screen?

They only show when you hold manage scope over at least one godown, room, or rack (or are a firm admin). Without any manage scope the screen reads "Showing all locations" and lists everything you can see.

### Where do I add a warehouse, room, or rack?

Not from the inventory screens — those are read-only about layout. Add and rename them on the records screens: [Warehouses](/docs/records/warehouses) and [Warehouse rooms](/docs/records/warehouse-rooms).

### How do I export a stock report?

The inventory screens are designed to be read and reconciled on-screen. Narrow the view with filters and column toggles, then screenshot or print. For historical movements use the *Stock Ledger* or the per-code [Stock history](/docs/inventory/stock-history).
