---
title: Stock history
order: 8
updated: 2026-07-21
---

# Stock history

Every stock figure in the app is the sum of movements — arrivals in, deliveries out, returns, transfers, conversions, samples, and manual adjustments. When today's snapshot does not match what you expected, the history views are how you walk back through those movements and find the cause. There are three of them, all reached from the *Stock* screen:

- *Stock In* — everything that added stock to one product code (supplier arrivals and customer returns).
- *Stock Out* — everything that removed stock from one product code (approved customer deliveries).
- *Stock Ledger* — the complete, combined, chronological movement list for one product code over a date range, with a running balance after every line.

*Stock In* and *Stock Out* are quick, single-purpose lists. The *Stock Ledger* is the full audit trail — it is the one to open when you need to reconcile a balance line by line.

## Open the history views

The per-code *Stock In* and *Stock Out* lists live one level inside a product head:

1. Open *Inventory* in the sidebar and click *Stock*.
2. Find the product head and click *Manage* on its row. The *Product Head — Stock* modal lists every code under that head with its current quantity.
3. On the code you want to investigate, click *View In* for stock that came in, *View Out* for stock that went out. (The third button, *View Location*, shows where the code's stock physically sits — see [View current stock](/docs/inventory/stock-overview).)

The *Stock Ledger* is reached separately, and covers any code across every movement type:

1. On the *Stock* screen, open the top-right *⋮* menu.
2. Choose *Stock Ledger* (*"Combined in/out movements over a date range"*).

Any location filter you set on the *Stock* screen (godown / room / rack) is carried into the *Manage* modal, so *View In* and *View Out* opened from there are already scoped to those locations. The *Stock Ledger* is opened fresh and is not pre-scoped.

## Who can see the history

Access is re-checked on the server for every request, so hiding a button is never the only guard.

- *Stock In* needs the *View Inventory* permission (`inventory.viewInventory`), or firm-administrator.
- *Stock Out* is broader: *View Inventory*, **or** *See Delivery History* (`delivery.seeDeliveryHistory`), **or** *Approve Delivery* (`delivery.approveDeliverStockRequest`), **or** firm-administrator. This is why a dispatcher who cannot open the rest of Inventory can still review outgoing deliveries.
- *Stock Ledger* needs *View Inventory* (or admin). The extra columns and buttons inside it are gated further — see [Opening a ledger movement](#opening-a-ledger-movement).

## Stock In history

The modal opens with the heading *Stock In — <code name>* and a running count of entries beneath it. It lists two kinds of inbound movement, newest first:

- **Supplier arrivals** — approved stock arrivals for this code. Reverse entries (goods returned *to* a supplier) are deliberately excluded here — they are outbound and appear only in the *Stock Ledger*.
- **Customer returns** — approved deliveries that came back into stock (a sales return). These add stock, so they belong on the "in" side.

Manual physical adjustments are **not** shown here — they have their own *Stock Entry History* (see [Physical stock entry](/docs/inventory/physical-stock-entry)) and also appear in the *Stock Ledger*.

### Filter tabs

Three tabs at the top narrow the list:

- *All* — arrivals and returns together. **Default.**
- *From Supplier* — supplier arrivals only.
- *Customer Returns* — sales returns only.

The tabs filter the rows already loaded in the modal. The count shown for *All* is the true server total; the count on *From Supplier* and *Customer Returns* reflects the rows fetched so far, so it can rise as you press *Load More*.

### Columns

| Column | What it shows |
|---|---|
| *Date* | The effective arrival date — the supplier invoice date if present, otherwise the approval date, otherwise when it was logged. Shown like `12 Jul 2026`. |
| *Type* | An *Arrival* or *Return* chip. |
| *Qty* | Quantity added by this movement. |
| *Price / Unit* | For arrivals, the **net** price per unit (after any purchase discount), with the tax slab appended as e.g. `+18%` when the rate is above zero. Returns carry no price and show `—`. |
| *Location* | Where the stock landed, as `Godown › Room › Rack`. Empty parts are dropped; a fully unknown location shows `—`. |
| *Reference* | For arrivals, `Inv: <invoice no>` plus the supplier name in brackets (either shown as `—` if absent). For returns, the literal text `Customer Return`. |
| *Approved By* | The user who approved the arrival or the return. Falls back to their username, or `—`. |

### Opening a movement

The rightmost *View* button opens the source record read-only:

- An arrival opens the full **arrival detail** (products, prices, discount, tax, invoice info, storage locations) — the same view described in [Add a stock arrival](/docs/inventory/add-stock-arrival).
- A return opens the **delivery detail**, which lists every product on that return and finishes with a *Summary* card showing *Total Amount*, *Total Amount (with Tax)*, and *Total Quantity* (figures taken from the originating customer order). From that view an *Open Order View* action jumps to the underlying order.

The list loads `20` rows at a time; a *Load More* button appears while more remain.

## Stock Out history

The modal opens with the heading *Stock Out — <code name>* and a count of deliveries beneath it. It lists every **approved, non-return** customer delivery that involved this product code, newest first. If there are none it shows *No stock-out history*.

Outgoing stock is never *created* on this screen — dispatches are raised against a customer order (see [Delivery receipt](/docs/enquiry-bank/delivery-receipt)) and only appear here once approved.

### Columns

| Column | What it shows |
|---|---|
| *Date* | The delivery date, shown like `12 Jul 2026`. |
| *Customer* | The customer the order belongs to. |
| *Qty* | Quantity of this code dispatched in that delivery. |
| *From* | The source location the stock left from, as `Godown › Room › Rack`. |
| *Approved By* | The user who approved the dispatch, or `—`. |

### Opening a delivery

*View* opens the same read-only **delivery detail** as above — every product dispatched in that entry, the *Summary* card (*Total Amount*, *Total Amount (with Tax)*, *Total Quantity*), and an *Open Order View* action into the underlying order. Like *Stock In*, the list pages `20` at a time with *Load More*.

The stand-alone [Out stock](/docs/inventory/out-stock) screen shows the same approved deliveries as a firm-wide list across every product, rather than for one code.

## Stock Ledger

The *Stock Ledger* is the complete movement history for a single product code over a date range, with a running balance. Unlike *Stock In* / *Stock Out*, it covers **every** movement type — arrivals, deliveries, returns both ways, transfers, conversions, samples, and manual adjustments — in one chronological list.

### Choose a product

Two pickers sit across the top:

- *Product Head* — pick the head first.
- *Product Code* — enabled once a head is chosen (it reads *Pick head first* until then).

Nothing loads until both are set; before that the body reads *Select a product head and code to view its ledger*. The server confirms the code exists in your firm's database before returning anything, so a forged or stale code id returns *Product code not found* rather than a broken list.

### Date range

*From Date* and *To Date* bound the ledger. Both default to the **current calendar month** (first day to last day) and neither can be set past today. If *To Date* is earlier than *From Date* the modal warns *End date must be ≥ start date* and does not load — the same rule is enforced on the server. Dates and times in the ledger are shown as `dd/mm/yy HH:mm` on a 24-hour clock (e.g. `12/07/26 14:30`).

The range only limits which movements are *listed*. The *Initial* balance is still computed from everything before the range, so the running balance is always correct even on a short window.

### Make and Unit filters

Two extra pickers appear **only when they would make a difference** — that is, only when this code has been transacted under more than one make, or more than one unit, across its whole history:

- *Make* — filter to one make. An *All makes* option resets it; a make recorded without a specific make shows as *Unspecified*.
- *Unit* — filter to one unit (shown by its short form where it has one). An *All units* option resets it.

If the code has only ever used a single make and unit, these pickers are hidden and the ledger simply covers everything.

### The summary strip

Once a code is chosen, a four-box strip sits above the table:

- *Initial* — the balance immediately **before** the date range starts.
- *In* — total quantity added within the range (shown `+`, green).
- *Out* — total quantity removed within the range (shown `−`, red).
- *Final* — the balance at the **end** of the range.

`Initial + In − Out` equals *Final*, so the strip is a self-checking summary of the window. *Initial* and *Final* are computed exactly from the full movement history, not just the listed page.

### Ledger columns

| Column | What it shows |
|---|---|
| *Date* | Timestamp of the movement, `dd/mm/yy HH:mm`. Always shown (cannot be hidden). |
| *Type* | A colour-coded movement-type chip (see below). Always shown. |
| *Location* | The relevant location as `Godown › Room › Rack`. For a transfer this is the *from* location on the out-leg and the *to* location on the in-leg. |
| *Reference* | Context that depends on the type — supplier and invoice for arrivals, customer and PO for deliveries/returns, the other product code for conversions, the opposite location for transfers, and `±N at <rack>` for adjustments. |
| *By* | Who is on record for the movement — the approver where there is one, otherwise the user who performed it, otherwise `—`. |
| *Change* | The signed quantity: `+N` in green for an increase, `−N` in red for a decrease. |
| *Balance* | The running on-hand balance **after** this movement. It can go negative (shown in red) if movements are logged out of physical order. |

### Movement types

Every line carries one of these type chips:

- *Arrival* — stock received from a supplier (adds).
- *Reverse Entry* — goods returned to a supplier (removes). This is the outbound arrival that *Stock In* deliberately leaves out. See [In stock and arrivals](/docs/inventory/in-stock).
- *Delivery* — stock dispatched to a customer (removes).
- *Return* — a customer sales return coming back into stock (adds).
- *Transfer Out* / *Transfer In* — the two legs of a location-to-location move; net zero across the firm. See [Transfer stock](/docs/inventory/transfer-stock).
- *Adjustment* — a manual physical entry, `+` or `−`. See [Physical stock entry](/docs/inventory/physical-stock-entry).
- *Convert Out* / *Convert In* — the two legs of a stock conversion (one code consumed to produce another). See [Convert stock](/docs/inventory/convert-stock).
- *Sample Out* / *Sample Return* — a sample handed to a customer and (later) returned. See [Sample Delivery](/docs/inventory/sample-delivery).
- *Delivery Note Out* — stock sent out on a delivery note. See [Delivery Note](/docs/inventory/delivery-challan).

### Opening a ledger movement

The rightmost *View* button opens the underlying record read-only, where one exists:

- *Adjustment* opens the physical-entry detail.
- *Arrival* and *Reverse Entry* open the arrival detail.
- *Delivery* and *Return* open the delivery detail — **but only if you hold a delivery-viewing permission** (*See Delivery History*, *Approve Delivery*, *Approve Return*, *See Pending Deliveries*, or admin). Without one, the row is still listed but has no *View* button.
- *Sample Out* and *Sample Return* open the sample delivery detail.
- *Transfer* and *Convert* rows have no *View* button in the ledger; open their own histories from the *Stock* *⋮* menu (*Transfer History*, *Convert History*).

The ledger loads `10` rows per page and pulls more automatically as you scroll; a footer reads *N of M entries* once you reach the end.

### Show, hide or reorder ledger columns

The *⋮* menu beside the date pickers has a *Toggle Columns* submenu. Tick or untick a column to show or hide it, drag the grip handle to reorder, and *Reset* returns the defaults. *Date* and *Type* are fixed and always present. The layout is remembered per device.

## Common questions

### What's the difference between Stock In and the Stock Ledger?

*Stock In* is a fast list of just the inbound movements (arrivals and customer returns) for one code. The *Stock Ledger* is the complete picture for that code — every movement type, in and out, with a running balance — over a date range. Reach for the ledger when you need to reconcile a balance rather than just see what arrived.

### Where do reverse entries (returns to a supplier) show up?

Not in *Stock In*, because a return to a supplier removes stock. They appear in the *Stock Ledger* as a *Reverse Entry* chip. See [In stock and arrivals](/docs/inventory/in-stock).

### Where do transfers, conversions and adjustments appear?

All three appear in the *Stock Ledger*. Transfers also have a dedicated *Transfer History*, conversions a *Convert History*, and manual entries a *Stock Entry History* — all under the *Stock* *⋮* menu. They are intentionally left out of *Stock In* and *Stock Out*, which cover only supplier arrivals, customer returns, and customer deliveries.

### My ledger balance went negative — is that a bug?

The *Balance* column adds movements in date order. If a delivery is dated before the arrival that supplied it (for example an arrival logged late), the running balance can dip below zero even though the physical count never did. The *Final* figure is always computed exactly from the full history, so trust it over any single mid-list line.

### Why can I see Stock Out but not the rest of Inventory?

*Stock Out* is available to anyone with delivery-history or delivery-approval permission, not just full inventory access — so a dispatcher can review outgoing deliveries without being able to open the wider stock screens.

### Can I export the history?

The history views are designed to be read on screen. There is no export button; take a screenshot or print the page. Deeper reporting lives in the Reports section rather than here.

### The dates look different between the views — why?

The *Stock In* and *Stock Out* lists show a plain date like `12 Jul 2026`. The *Stock Ledger* shows date **and** time as `dd/mm/yy HH:mm` because ordering movements within a single day matters when you are reconciling a balance.
