Stock Valuation
ERPX values stock using Weighted Average Cost (WAC), and the weighted-average rate is global per item — one single rate for an item across all warehouses.
There is no per-warehouse rate to choose, and no FIFO or LIFO valuation option. This one decision explains most of what you will see in the valuation reports, so it is worth reading once properly.
In one sentence: every item has one cost rate at any point in time; a receipt re-averages it, an issue uses it, and a transfer between warehouses does not change it.
The two rules
Rule 1 — A receipt re-averages the rate
When stock comes in (GRN, Stock Entry Receipt, Manufacturing, Stock Opening), the new rate is:
(previous global qty × previous rate) + (incoming qty × incoming rate)
new rate = ───────────────────────────────────────────────────────────────────────────
previous global qty + incoming qty“Previous global qty” is the total on-hand quantity of that item summed across every warehouse, as at the posting date.
If there was no stock before, the new rate is simply incoming value ÷ incoming quantity.
Rule 2 — An issue uses the current rate
When stock goes out (Delivery Note, Stock Entry Issue, consumption), the outgoing line is valued at the current global weighted-average rate. An issue never changes the rate — it only reduces quantity and value.
Worked example
Two warehouses, one item. Watch the rate: it is always the same in both.
| # | Transaction | Warehouse | Qty | Rate | Global qty after | Global WAC after |
|---|---|---|---|---|---|---|
| 1 | Stock Opening | Main | +100 | 10.00 | 100 | 10.00 |
| 2 | GRN | Main | +100 | 14.00 | 200 | 12.00 |
| 3 | GRN | Branch | +200 | 15.00 | 400 | 13.50 |
| 4 | Delivery Note | Main | −50 | 13.50 | 350 | 13.50 |
| 5 | Transfer Main → Branch | both | 30 | 13.50 | 350 | 13.50 |
Reading the table:
- Row 2:
(100 × 10 + 100 × 14) ÷ 200 = 12.00. - Row 3: the receipt is in the Branch, but it still re-averages the global rate:
(200 × 12 + 200 × 15) ÷ 400 = 13.50. The Main warehouse’s stock is now valued at 13.50 too. - Row 4: the issue leaves at 13.50 and the rate does not move.
- Row 5: a transfer moves 30 units of value from Main to Branch at 13.50. Total value is unchanged.
Row 3 is the consequence people find surprising: a purchase into one warehouse changes the valuation of the same item in every other warehouse. That is the definition of a global weighted average, and it is intentional — one item, one cost.
What “global” means in practice
| Question | Answer |
|---|---|
| Can two warehouses show different rates for one item? | No. The rate is one number per item |
| Can two warehouses show different quantities? | Yes. Quantity is always per warehouse |
| Does a transfer change total stock value? | No. It moves value between locations |
| Does a transfer change the rate? | No. |
| Is warehouse stock value meaningful? | Yes — it is warehouse quantity × global rate |
So the Warehouse Inventory Valuation report differs between warehouses only by quantity, never by rate.
Where the rate comes from on each document
| Document | How the rate is set |
|---|---|
| Stock Opening | You enter the rate. This is the starting point of the average |
| GRN | The purchase rate on the item row, converted to stock UOM and organization currency |
| Stock Entry — Receipt | The Basic Rate you enter on the row |
| Stock Entry — Issue | Derived: the current global WAC. Not editable |
| Stock Transfer | Derived: the current global WAC on both sides |
| Delivery Note | Derived: the global WAC at the delivery date, used for COGS |
| Manufacturing Entry | Derived from consumed materials plus operating cost, less scrap recovery |
| Stock Reconciliation | You may enter a new valuation rate as well as a new quantity |
| Landed Cost Voucher | Increases the GRN’s incoming rate, then triggers recalculation |
Unit conversion
Rates are always stored in the item’s stock UOM and in the organization currency. If you buy in cartons at 1,200 per carton with a conversion factor of 12, the ledger records 100 per piece. Get the conversion factor wrong on the item master and every rate downstream is wrong — which is why ERPX blocks changing it once stock exists.
Backdated documents and recalculation
Because the average depends on the order of transactions, inserting a document into the past invalidates every rate after it. ERPX handles this by recalculating forward, and by enforcing rules on what may be backdated:
| Document type | Posting date rule |
|---|---|
| Stock Opening | Can be moved, but must stay earlier than every other entry for those items and warehouses |
| Receipt / GRN | Cannot be dated before an existing Stock Opening. Can move forward only when no Issue / Transfer / Manufacturing entry sits after it |
| Issue / Transfer / Manufacturing / Send to Subcontractor | Posting date cannot be changed once posted |
The messages you will see:
- “Receipt cannot be dated before the Opening Entry. Opening Entry must remain at the root (earliest position).”
- “Stock Opening entry cannot be moved. There are other stock entries (Receipt/Issue/Transfer/Manufacturing) on or before the new date.”
- “Posting date cannot be changed for this stock entry type.”
When a valid backdated receipt is approved, ERPX re-runs the weighted average forward from that date for the affected items, updating the later ledger rows, stock values, and accounting entries. On large histories this runs as a background task — the document shows as processing until it finishes.
Valuation vs batch picking — two different things
This trips people up, so it is worth stating plainly:
| Concept | What ERPX does | Configurable? |
|---|---|---|
| Valuation — what the stock is worth | Weighted average, global per item | No |
| Physical batch allocation — which batch leaves | FIFO by manufacturing date, or a batch you pin manually | Yes, per line |
| Physical serial allocation — which unit leaves | The serials you select | Yes, per line |
So you can ship the oldest batch (FIFO) while still valuing it at the weighted-average rate. The two decisions are independent.
Accounting side
Every approved stock movement posts a matching accounting entry, using accounts on the document:
| Movement | Debit | Credit |
|---|---|---|
| Receipt (Stock Entry) | Stock Assets Account | Stock Adjustment Account |
| Issue (Stock Entry) | Stock Adjustment Account | Stock Assets Account |
| Stock Opening | Stock Assets Account | Temporary Opening Account |
| GRN | Stock Asset Account | Stock Liability Account |
| Delivery Note | Expense Account (COGS) | Stock Account |
| Reconciliation | Stock In Hand / Stock Adjustment, by direction | opposite side |
This is why the Stock Balance report and the inventory line on the Balance Sheet agree: they are two views of the same postings.
Where to see valuation
| Report | Shows |
|---|---|
| Stock Balance | Quantity, latest valuation rate, and value per item and warehouse |
| Warehouse Inventory Valuation | Stock value by warehouse |
| Stock Ledger | Every movement with the valuation rate applied at that moment |
| Item Ledger | One item’s movements and running balance |
| Stock Dashboard | Total stock value by fiscal year, and value by warehouse |
Troubleshooting
| Symptom | Likely cause |
|---|---|
| Rate changed but I only received into one warehouse | Expected — the average is global |
| Rate looks too low after a receipt | The receipt’s rate or conversion factor is wrong on the row |
| Rate is 0 | The first inward document had a zero rate — fix it at the source, usually the Stock Opening |
| Stock value does not match the Balance Sheet | A document is still Draft/Pending, or a background recalculation is still running |
| Cannot change a posting date | Expected for Issue / Transfer / Manufacturing — cancel and re-enter instead |