Skip to content
Stock Management Guide

Stock Management Guide

This guide is for whoever sets up a company’s stock. By the end of it your first goods receipt will land in the right location, appear on the stock balance, and carry a cost you can defend. It takes about an hour for one company, and it is an hour you only spend once — almost every long-running stock problem in BigLedger traces back to one of the six decisions below being made by accident.

The most important of them is Step 1, and it is not the one people expect. A document line only moves stock if its item is a stock item — a basic item, or an alias that points at an inventory item. Get that wrong and everything else works perfectly while the balance never changes.

  1. Decide what is stock.
  2. Choose tracking at create.
  3. Set up locations.
  4. Choose the receiving pair.
  5. Map the stock GL codes.
  6. Load opening balances.
  7. Set min and max levels.

Meet GadgetSphere

GadgetSphere Sdn Bhd sells consumer electronics from 22 branches. Head office is setting up stock tracking for the Klang Valley branches first: GS-KV-01 through GS-KV-12. About 5,200 items — some serialised (phones, laptops), some not (cables, cases), some not stock at all (extended warranty, delivery charge).

Stock management: before you start

You need:

Step 1: Decide what is actually stock, and link it

Master Data > Inventory Item Maintenance, then Master Data > Doc Item Maintenance

There are two item records and they do different jobs:

  • The inventory item is the stock-keeping record. The balance is keyed by it.
  • The document item is what you put on an invoice, order or transfer line.

Stock moves only when a document line’s item resolves to a basic or alias inventory item. A basic item that has no inventory item yet is given one, and the link, the first time it posts, and then moves stock. A service item, a charge, or an alias with no inventory item is silently ignored by the stock processor — the document finalises, the journal posts, and no ledger line is written.

So for GadgetSphere:

WhatInventory item?Result
A flagship smartphoneYes, basicMoves stock
A charging cableYes, basicMoves stock
The same cable sold under a second codeYes, aliasMoves stock, against the basic item’s balance
Extended warrantyNo — service itemNo stock movement, ever
Delivery chargeNo — service itemNo stock movement, ever
The symptom to recognise later: a finalised invoice, GRN Stock In or return that never appears in the stock balance. Usually the item is not a basic item, or is an alias that points at no inventory item; a basic item with no link is linked for you when it posts. It is not the document, and it is not the processor. Check the item type first, every time.

Step 2: Choose serial, batch and bin tracking when you create the item

Master Data > Doc Item Maintenance > Create > Sub Item Type

Tracking is chosen once, on the item’s create screen, in the Sub Item Type field. For each item, decide:

  • Basic quantity: a quantity is all you need. Cables, cases, chargers.
  • Serial number: every unit has an identity. Phones, laptops, anything with a warranty.
  • Batch number: units arrive in lots with dates. Rare for electronics, essential for anything with an expiry.
  • Bin number: you care which shelf, not just which location.
The choice locks earlier than you expect: at the create screen’s first save, not at the first receipt. The create screen saves the item on its own as soon as code, name, type, unit and currency are filled in, and from then on Sub Item Type is greyed out. Inventory Item Maintenance shows the field read-only too, so there is no second place to change it. An item created with the wrong tracking is replaced, not repaired: create a new code with the right tracking, retire the old one and move the stock across. For GadgetSphere that means choosing Serial number for the smartphone and laptop codes while you are still on the create screen.

Tracking type changes the shape of every document line for that item — serial, batch and bin sub-tabs appear on transfers, adjustments, invoices and counts — so it also changes how long a receipt takes to key. Serialise what you need to trace and nothing else.

Step 3: Set up locations, and check the branch default

Master Data > Organization

Three things:

  1. Locations, one per physical place stock sits. They must be ACTIVE to be selectable on a transfer.
  2. The branch’s default location. This is the one that catches people.
  3. Nothing to do for stock in transit. BigLedger creates one in-transit location per company (code L-SIT-<company>) the first time a transfer posts, and transfers park quantity there between despatch and receipt. Leave it out of the location sets your transfer users pick from (why).

A ledger line takes the first location it finds on the line or the header, and falls back to the branch’s default location (Inventory core concepts › Where a movement lands gives the full order).

A stale branch default silently collects stock. If a line names no location — and plenty do not — the quantity lands on the branch default. Set it deliberately when you open a branch, and check it whenever a location is deactivated. “Stock in a location nobody uses” is almost always this.

Step 4: Decide which document books the receipt — and tell everybody

This is the decision that, made inconsistently, doubles your stock.

If your flow isThe stock arrives onAnd the other document
Purchase Order → Purchase GRN → Purchase Invoicethe purchase invoicethe GRN records the receipt and moves nothing
Purchase Order → Purchase GRN Stock In → Purchase Invoice No Stock Inthe GRN Stock Inthe No Stock In invoice, knocked off the GRN Stock In, books only the money and clears the not-invoiced accrual the receipt raised. An ordinary Purchase Invoice here books the units a second time
    flowchart LR
  subgraph P2["Or: the GRN Stock In pair, never both"]
    direction LR
    PO2["Purchase Order"] --> GSI["<b>Purchase GRN Stock In</b><br/><b>the stock arrives</b><br/>stock items only<br/>not-invoiced accrual"] -->|"knocked off"| PINS["Purchase Invoice No Stock In<br/>the money only<br/>clears the accrual"]
  end
  subgraph P1["Either: the Purchase GRN pair"]
    direction LR
    PO1["Purchase Order"] --> GRN["Purchase GRN<br/>records the receipt<br/>moves nothing"] --> PI["<b>Purchase Invoice</b><br/><b>the stock arrives</b><br/>stock items only"]
  end
  GSI -.->|"an ordinary invoice instead"| DUP["Purchase Invoice<br/>books the units a second time"]
  

Pick one pair for each company, write it down, and train the receiving staff on it. Using a GRN Stock In and a stock-booking purchase invoice for the same goods counts every unit twice, and nothing warns you — both documents finalise and both look right. A receipt booked twice inflates closing stock, so cost of sales comes out low for that month.

A plain Purchase GRN (signum 0) is a receipt note; GRN Stock In (+1) is a different document type that also posts the goods-received / invoice-received accrual. Sales has the same pair, a plain Sales GIN and a Sales GIN Stock Out (Inventory core concepts §2).

Step 5: Map the stock GL codes — the finance half

Master Data > Chart of Account > Companies > Default GL Codes

The document you will post most often that carries a journal is the Stock Adjustment (the Reset MA and the consignment GRN and GIN post too: Core concepts §5). The adjustment needs two company defaults — the adjustment account and the stock account it balances against:

STOCK_ADJUSTMENT · STOCK_BALANCE

Map a third, RESET_MA, if anyone will ever use Reset Moving Average (Step 6 tells you when you might): a reset posts its difference to STOCK_BALANCE against RESET_MA. A stock adjustment’s journal uses only its two sub-ledgers and has no cost-of-goods-sold line, so there is no COGS default to set for it.

If they are missing, an adjustment still saves and still finalises — the quantity moves and the value does not, because the journal is written by a background posting job after FINAL and it is that job that fails, silently. You find out at month end, when the stock value report and the balance sheet have drifted apart with no obvious cause — or sooner, by running Trace Document in the Financial Report applet on the adjustment: its Missing Journal check fails, and Resolve posts the journal once the mapping exists.

While finance is here, agree the reason codes. The adjustment screen has no per-line GL code. What it has is one GL code on the header — switch on the applet setting Show a GL code on the header (SHOW_GL_CODE) — and that code is used for every line on the document, ahead of the company default. So raise one adjustment per reason: damage on one document, theft on another, count variance on a third, each with its own header code. That is the only way to tell them apart in the ledger, because the document has no reason-code engine that reaches it. (A file import can put a GL code on each line; the screen cannot.) Three or four codes is usually enough.

Transfers, conversions, counts, requisitions and reservations post no journal, so they need no mapping (Core concepts §5). A transfer cannot change your company’s unit cost, but it can change the receiving location’s, which seeds from that location’s own history: a branch receiving an item it has never stocked shows the arrival at zero. Value stock on the company figure.

Step 6: Load your opening balances

Inventory > Stock Adjustment > File Import

Opening stock comes in as an Adjust-In. For a go-live with thousands of items, use File Import rather than keying documents; for a handful, a single adjustment document with one line per item is fine.

For each line you need the item, the location, the quantity and the unit cost. The cost matters as much as the quantity: it seeds the moving average, and every sale from then on takes its cost of goods sold from that average.

Get the opening cost right on day one. Correcting it later means Reset Moving Average, which changes inventory value on the balance sheet — posted against the RESET_MA default from Step 5 — and the cost of every sale after it. It is a finance action, not a warehouse one, and it should be rare.

Then reconcile before you go any further:

  1. Export the Stock Balance grid.
  2. Compare the total value against the inventory figure in your opening trial balance.
  3. Where they differ, fix it with another adjustment — never by asking for a data change.

Step 7: Set minimum and maximum levels

Master Data > Inventory Item Maintenance > the item > Location tab, or its Stock Min Max Import screen for bulk.

Levels are per item per location. Two things consume them:

  • The min/max e-mail (Inventory Item Maintenance › Settings › Email Notification) lists every item whose quantity at a watched location is below its minimum or above its maximum. A level left at zero is never compared, so a location with no levels never appears in it.
  • Stock Replenishment computes the shortfall and raises purchase orders or stock transfers from it. A location with no levels is still in the run: a purchase-order run gives it a line for zero, and a transfer run gives it the source location’s whole quantity. Check Quantity To Approve before you generate.

Stock Level Monitoring does not read these levels at all: it uses per-category values on its own template. Nothing fails to tell you a location has no levels, so put “set the min/max levels” in the same checklist as opening a branch (what goes wrong without them).

Stock management: what success looks like

Fifteen minutes, one item, five checks:

  1. Receive one unit at GS-KV-01 using whichever receiving pair you chose in Step 4, and finalise it. Open Stock Balance: the balance is +1 at the location you expected, not at a branch default.
  2. The MA Price column shows the cost you paid, not zero.
  3. Open Stock Availability for the same item. Balance and available agree, because nothing is open yet.
  4. Raise an Adjust-Out of 1 and finalise it. The balance is back to 0.
  5. Open the general ledger. There is a journal debiting STOCK_ADJUSTMENT and crediting STOCK_BALANCE.

If step 1 shows nothing, go back to Step 1 — the item type. If step 5 shows nothing, go back to Step 5 — the GL defaults.

Stock management: common mistakes

MistakeWhat you seeFix
A stock item set up as a service, or an alias that points at no inventory itemFinalised documents never reach the balance, no error anywhere. An unlinked basic item is not this: it is linked for you when it postsFix the item in Doc Item Maintenance, then re-post
Item created with the wrong Sub Item TypeThe field is greyed out on both item screens, and the phones arrive with no serial sub-tabCreate a new item code with the right tracking, retire the old one, move the stock across. There is no retrofit
A GRN Stock In and a stock-booking purchase invoice for the same goodsEvery receipt counted twice; found months later at a countPick one pair per company; never put one delivery through both
Branch default location stale or deactivatedStock accumulates somewhere nobody looksFix the default, then move the quantity with a transfer or adjustment
STOCK_ADJUSTMENT / STOCK_BALANCE not mappedQuantity moves, value does not; balance sheet driftsMap them, then Resolve each affected adjustment in Trace Document
Opening balances loaded with no costEvery sale shows 100% gross profitReset Moving Average, and get finance to sign it off
Expecting an approval before a write-offThere is none, and no separate permission to finalise: anyone who can edit an adjustment can finalise itGive the Stock Adjustment applet only to those who may write stock off, and review last week’s adjustments (Write off, and know what the money does)

Related documentation

Last updated on