Core Concepts
“Stock Availability shows 50 physical but 0 available. Where did it go?” “Which document actually takes stock out?” “My count and the stock report still disagree after a stock take.” Those three questions come up again and again about stock, and the seven ideas below answer all three. This page is for the stock controller or accountant in a multi-branch group who has to explain a stock number to somebody else: a branch manager, the finance manager, an auditor. Read it once, in about fifteen minutes, and the twenty-two applet pages stop being a list of screens.
The situation it was written for. It is the week before the auditors arrive at GadgetSphere. The stock account on the balance sheet says one figure and the stock report for the same date says another, and neither screen says why. Groups in exactly this position usually find the gap by hand, document by document, and then find it again the following year. Every idea on this page is one of the reasons the two figures can differ, and none of them is a fault: each is the price of a design choice that keeps journals already written from changing, explained where it comes up.
1. The balance is a running total, not a stored number you can edit
There is no screen anywhere in BigLedger where you type a stock balance. The balance is the tip of a signed stock ledger — one row per item per movement — that the server appends to when a document is finalised. The Stock Balance applet is the enquiry over that total and nothing more.
flowchart TD
F["Document set to FINAL"] --> P1["Generic-document primary processor<br/>fans out to its subscribed jobs"]
P1 --> P2["Inventory transaction line processor<br/>one signed ledger line per item line<br/>with a non-zero quantity signum"]
P2 --> P3["Ledger line → current stock balance processor<br/>upserts the location row and the company row,<br/>updates the cost bases, then serial / batch / bin"]
P3 --> B["Stock balance<br/>item × company × location"]
P3 -.->|"cost flows back"| L["The document line's cost columns"]
F -.->|"VOID"| V["Void processor<br/>writes a <b>negated copy</b> of every line<br/>— nothing is deleted"]
V --> B
Four consequences:
- If a number is wrong, the fix is a document, never the screen. Usually a Stock Adjustment.
- FINAL is not instant. The work happens in background processors. On a busy day the balance can lag the document by moments, and the cost on the document line is written after the ledger line, by a later job.
- VOID does not delete history. It writes a negated copy of every ledger line, marked as a void. The movement and its reversal both stay, so the item’s Stock Card tab shows both.
- A backdated document is inserted mid-chain and the balance is re-projected from there, which is why backdating is expensive and why the FIFO chain is rebuilt after one.
Where a movement lands
The location on a ledger line is the first of these that is set: the line’s delivery location,
then the line’s store, then the header’s store, then the branch’s default location. Most
“the stock went to the wrong place” cases are a line with no location falling through to a branch
default nobody had looked at. At GadgetSphere, a laptop invoiced at GS-PEN-01 with no store on the
line or the header comes off whatever location the Penang branch names as its default, which may be the warehouse
rather than the shop floor.
2. The quantity signum decides everything
Two numbers on a document type decide its effect: the quantity signum (does stock move, and which way) and the amount signum (does money move). A zero means nothing happens. They are fixed in the backend for each document type — not settings, not per tenant, and the applet’s own copy is overwritten by the server on every save.
| Moves stock in (+1) | Moves stock out (−1) | Moves nothing (0) |
|---|---|---|
| Purchase Invoice | Sales Invoice | Sales Order, Purchase Order, Quotation |
| Purchase GRN Stock In | Cash Bill | plain Purchase GRN, plain Sales GIN |
| Sales Return | Sales GIN Stock Out | Invoice No Stock In / No Stock Out |
| Sales Refund Note | Purchase Return | Credit Note, Debit Note |
| Transfer In | Purchase Refund Note | Stock Requisition |
| Consignment GRN | Transfer Out | Delivery Order, Goods Delivery Note |
| Consignment GIN | Packing Order, Jobsheet, Job Order |
Stock Adjustment takes its direction from the line (adjust-in or adjust-out). Stock Conversion takes it from the tab the line was entered on.
Receiving on the purchase invoice is the common choice; GRN Stock In suits a group whose goods regularly arrive weeks before the supplier’s invoice and who wants them in the stock balance, and in its value, from the day they land. Whichever you pick, pick it per company and write it down, because the two halves of the pair are keyed by different people (the storeroom and accounts payable) who each see only their own screen.
The same trap exists on the sales side: a plain Sales GIN and a plain Sales GRN are inert, and the document types that really issue and receive stock — GIN Stock Out, GRN Stock In — are different documents.
3. Balance and availability are different numbers, and availability can exceed balance
Balance is what the ledger says you physically hold. It is a stored row, rewritten each time a ledger line is processed.
Availability is what you can still promise, and it is not stored: it is worked out at the moment you open the screen. It is not balance minus reservations. It is the balance plus a signed adjustment for open documents:
flowchart LR
SB["Stock balance<br/>ledger quantity at this company and location"]
SO["Open sales orders<br/>not yet invoiced · signum −1"]
GRN["Goods received notes<br/>not yet invoiced · signum +1"]
ADJ["Adj Qty<br/>signed sum"]
AV["Available Qty<br/>balance + Adj Qty"]
SO --> ADJ
GRN --> ADJ
SB --> AV
ADJ --> AV
So “50 on the shelf, 0 available” means open sales orders, and “10 on the shelf, 35 available” means goods received and not yet invoiced. Both are correct. The Details screen in Stock Availability lists the documents behind the adjustment by type, so the difference is always traceable to specific documents rather than to a mystery.
Reservation is a third, separate thing. A reservation adds to the reserved column on the balance row, which the availability screens subtract. It moves no stock and posts nothing. It is opt-in — an action somebody takes in the Stock Reservation applet, or one that the Sales Order, Job Order and Packing Order applets take on a document’s behalf. There is no “hard” and “soft” allocation, and a plain FINAL sales order does not lock anything.
An idea worth using: because availability counts goods received and not yet invoiced, a branch can promise stock that is in the storeroom but not yet billed by the supplier. Because it subtracts open orders, a sales order you will never fulfil keeps hiding stock from every other salesperson for as long as it shows an open quantity. Reviewing stale sales orders each week is as much the stock controller’s job as the sales team’s, and you know it is done when the Sales Order tab of the Details screen lists only orders somebody still means to deliver.
4. Counting measures the gap; adjusting closes it
These are two applets and two documents, and conflating them is the commonest misunderstanding in the module.
| Stock Take | Stock Adjustment | |
|---|---|---|
| What it is | A counting session for one location, with devices attached and records captured by scan or by hand | A document with lines, saved as a draft and finalised |
| What it produces | A report: counted against system, a tolerance band for movements during the count, missing and unexpected serials, and the cost of the difference | A ledger line per item and a journal |
| Effect on the balance | None. It never changes a balance | Changes it |
| Effect on the ledger | None | One signed line per item |
There is no “post the variance” button. Somebody reads the count report, decides which differences are real losses and which are timing, and raises an adjustment for the real ones. That decision is the stock controller’s, and a write-off above whatever limit your policy sets should carry a second signature from finance before the adjustment is finalised.
5. Which stock movements post a journal
Two kinds of record in this module post a journal of their own when they are finalised.
Stock Adjustment. One journal per document:
| Adjustment direction | Debit | Credit |
|---|---|---|
| Adjust-Out (quantity down) | Stock adjustment expense (STOCK_ADJUSTMENT, or the line’s own GL code) | Stock (STOCK_BALANCE) |
| Adjust-In (quantity up) | Stock (STOCK_BALANCE) | Stock adjustment (STOCK_ADJUSTMENT, or the line’s own GL code) |
Reset Moving Average, which lives in the Stock Adjustment applet, posts two lines for the change in value: the stock account against the reset’s own GL code, or the company’s Reset MA default. It posts in the same request as FINAL, and if that journal fails the reset still stands with no journal behind it, so look for it in Ledger and Journal’s Missing Journal check with the Reset MA document type.
Two receiving documents post through handlers of their own. A consignment GRN posts through the
consignment handler — CONSIGNMENT_LIABILITY against CONSIGNMENT_STOCK — because the stock is not
yours until it sells. The consignment GIN that sends it back does not: it has no consignment mapping
of its own and posts through the ordinary purchase mapping, so it reaches your ordinary supplier
(CREDITOR) and purchase (PURCHASE) accounts. Check those accounts, not the consignment ones, when a
returned consignment does not seem to have left the books. A GRN Stock In posts to inventory received
and not invoiced (INVENTORY_NOT_INVOICED) against a not-yet-invoiced supplier balance
(CREDITOR_NOT_INVOICED).
Everything else in the module posts nothing. Stock transfers carry quantity only: value stays on the balance sheet wherever the goods physically are, and the company’s unit cost is untouched by construction — the transfer types are excluded from the moving-average calculation, so the transfer is a cost-neutral relieve. The per-location cost is a different number and it does not follow the goods: the location calculator seeds from the previous line at the receiving location, so a location that has never held the item seeds at zero and values the arrival at zero. Read the company figure for valuation; see Stock Transfer for the three cases. Stock conversions post no journal either, and their stock step is not connected: no job is subscribed to the conversion’s posting run, so a FINAL conversion leaves the balance where it was. Until it is, record a conversion as Stock Adjustments, out for the components and in for the kit. An adjustment’s line amount does enter the moving average, so put the components’ cost on the kit’s line, and check the kit’s average on its Costings tab afterwards.
No sale carries a cost line. A sales document posts receivable, sales, discount and tax, and nothing for the cost of the goods. Cost of sales is written once a month, by Month End Processing in the Financial Report applet, from opening stock, the month’s purchases and closing stock read from the stock ledger when the close runs. Until somebody runs it for the month, the income statement shows sales with no cost against them. The arithmetic and its traps are in Costing internals.
Why it is built this way. A stock account that moved on every sale would agree with the stock report by construction, but every backdated receipt would then rewrite the cost on journals in a month you had already reported. A group that receives late, keys supplier invoices days after the goods arrive and moves stock between twenty branches would see closed months change underneath it. The monthly close keeps posted journals still and puts the reconciling in one place, at month end, where a person can do it.
6. Four cost bases are kept at once, and moving average is the one that bites
Every balance row carries moving-average, weighted-average, FIFO and LIFO amounts and prices, plus last purchase cost and landed cost. They are columns maintained side by side, not a costing mode you select. Each screen decides which one to show. In practice the LIFO columns are empty on every movement, so a report read in LIFO shows zero. Which column values the month-end closing stock is the company’s Inventory Closing Base On setting, moving average when it is empty.
Moving average is what most screens use, and three things distort it or leave it short:
- A stock conversion moves no cost between items. Once its posting chain is connected, the kit comes in at its own last price at that location — zero for a new item — and the components leave at their running average. Each item’s average holds; the kit never carries its components’ cost.
- A trade-in unit is not inventory stock at all. Trade-ins live in their own tables with their own cost, appear in Stock Availability because that screen unions the two, and never appear in the historical balance report.
- A backdated document re-projects the chain, which moves every average computed after it.
Reset Moving Average, in the Stock Adjustment applet, is the correction. It changes inventory value on the balance sheet at once, and cost of sales the next time Month End Processing runs, so it belongs to finance and to nobody else.
7. Nothing in this module is approved
BigLedger’s document-approval engine covers three document types — Purchase Order, Purchase Requisition and Stock Requisition — is off until a tenant configures it, and causes FINAL rather than gating it. No transfer, adjustment, conversion or count consults it.
And the one inventory document the engine nominally covers is a dead end today: the Stock Requisition applet shows an Approval Settings screen but has no approval tab on the document, no request screen and no history screen, so a setting created there cannot be used from that applet.
Your control over who may write stock off, move it between branches or reset a cost is the permission set, and nothing else. Say so during implementation rather than after the first write-off nobody expected. The review that an approval step would have given you becomes a person’s job: the finance manager reads the month’s stock adjustments and resets before Month End Processing, and knows it is done when every adjustment over the write-off limit carries the second signature the policy asks for.
Where each number comes from
When somebody asks “where did this figure come from?”, the answer is one of these.
| The number | Stored or worked out | Written when, from what |
|---|---|---|
| Balance on Stock Balance | Stored on the balance row | Rewritten by a background job each time a ledger line is processed, after FINAL; the sum of the item’s signed ledger lines at that location |
| Available on Stock Availability | Worked out each time you open the screen | Balance, plus open sales orders and uninvoiced goods received (signed), less reservations |
| Cost on a document line | Stored on the line | Written back by the costing job after the ledger line exists, from the moving average just before this movement; rewritten if a backdated document replays the chain |
| Cost Value on a stock take report | Stored when the report is generated | The moving-average price on the last movement at that location before the session started |
| Stock account on the balance sheet | A journal balance | Moved by stock adjustments, Reset MA, opening balances and Month End Processing, and by anything else a person codes to that account |
| Cost of sales on the income statement | A journal | Written by Month End Processing for the month; deleted and rewritten each time the month is processed again |
The last two are the pair that disagree in the week before an audit. They are made by different machinery at different times, and nothing in BigLedger compares them for you. Stock report versus the stock account lists the conditions under which they agree and how to tie them out.
When a stock number looks wrong
| What you see | Which idea explains it | What to do |
|---|---|---|
| A purchase GRN is FINAL and Stock Balance has not moved | §2: a plain GRN is paperwork | The purchase invoice books the stock. Check it is FINAL |
| Stock doubled after the supplier’s invoice was keyed | §2: GRN Stock In and a stock-booking purchase invoice | VOID the duplicate, settle the GRN Stock In with a Purchase Invoice No Stock In, and agree which pair this company uses (Related applets) |
| The stock went to the wrong location | §1: the line had no location and fell to the branch default | Check the branch’s default location; correct with a transfer |
| “Stock Availability shows 50 physical but 0 available. Where did it go?” | §3: open sales orders or reservations | The Details screen names the orders; deal with the stale ones |
| “My count and the stock report still disagree after a stock take.” | §4: a count never changes a balance | Raise a Stock Adjustment for each variance you accept |
| A conversion is FINAL and nothing moved | §5: the conversion’s posting run is not connected | Record it as a Stock Adjustment pair |
| A branch values transferred stock at zero | §5: the per-location cost starts from that location’s own history | Read the company cost for valuation |
| Sales this month show no cost of sales | §5: cost of sales is the month-end journal | Run Month End Processing for the month |
| A voided document still shows on the Stock Card | §1: VOID adds a reversing line | Expected: both lines stay, and they net to zero |
| Margins on last week’s sales changed | §1 and §6: a backdated document replayed the chain | See Costing internals for controlling backdating |
How you know a stock document worked
After you finalise any stock document, you can see that it worked without waiting for the month end. Open the item in Inventory Item Maintenance, go to the Stock Card tab, choose the location and a date range that includes the document’s date, and find your document number with the quantity you expected, signed the right way. Then open Stock Balance for the same item and location and confirm the quantity has moved by that amount. If the stock card has the line and the balance has not caught up, wait a moment and refresh, because the balance is written by a later job. If the stock card has no line at all, the document’s type moves no stock (§2) or the item is not a stock-keeping item.
For a Stock Adjustment or a Reset MA, also open the journal for that date in Ledger and Journal: two sides for the same amount, stock against the adjustment or reset account.
How this sits among the other modules
- What must exist first. A branch default location on every branch (§1 falls back to it), and the
company default GL codes the journals in §5 resolve against:
STOCK_ADJUSTMENTandSTOCK_BALANCEfor adjustments, the Reset MA code unless each reset names its own, andCOGSwithSTOCK_BALANCEfor Month End Processing. A missing code does not stop FINAL; it stops the journal afterwards, and the stock moves anyway. The full list is in Configuration. - What it makes possible. Sales promises from the availability in §3, and E-Commerce derives each marketplace’s quantity from the balance in §1; Financial Accounting closes the month on the closing stock the ledger in §1 holds.
- Its siblings, and when to use which. Stock Take or Stock Adjustment (§4); Purchase Invoice or GRN Stock In for receiving (§2); Stock Transfer between locations of one company, or a sale and a purchase between companies of the group, which, unlike a transfer, carries value and tax.
- What breaks elsewhere if it is wrong. A double-counted receipt in Purchasing inflates closing stock, which understates cost of sales and overstates profit for the month. A zero per-location cost at a branch understates that branch’s stock value on any report read by location.
- What it is used with. A stock take, then an adjustment for each accepted variance; an outbound transfer, then the inbound that receives it; the month-end stock check, then Month End Processing.
Read next
Costing internals — where the cost on a document line comes from, what makes it jump, and how cost of sales is worked out at month end. It takes §5 and §6 of this page down to the arithmetic.