Skip to content

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 InvoiceSales InvoiceSales Order, Purchase Order, Quotation
Purchase GRN Stock InCash Billplain Purchase GRN, plain Sales GIN
Sales ReturnSales GIN Stock OutInvoice No Stock In / No Stock Out
Sales Refund NotePurchase ReturnCredit Note, Debit Note
Transfer InPurchase Refund NoteStock Requisition
Consignment GRNTransfer OutDelivery Order, Goods Delivery Note
Consignment GINPacking 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.

The receiving pair is the one that catches people. A plain Purchase GRN records that goods arrived; it does not put them in stock. Either the purchase invoice books the stock (and the GRN is paperwork), or you use GRN Stock In, which books the stock and leaves the invoice to book only the money. Use one pair or the other. A GRN Stock In and a stock-booking purchase invoice for the same goods counts them twice.

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 TakeStock Adjustment
What it isA counting session for one location, with devices attached and records captured by scan or by handA document with lines, saved as a draft and finalised
What it producesA report: counted against system, a tolerance band for movements during the count, missing and unexpected serials, and the cost of the differenceA ledger line per item and a journal
Effect on the balanceNone. It never changes a balanceChanges it
Effect on the ledgerNoneOne 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.

The stock take report values the variance at a moving-average price taken before the count began: the price on the last movement at that location before the session started. Items with no movement there before then value at zero, and a FIFO tenant never sees FIFO cost on that report. Treat the count report’s cost column as indicative and value the variance from the stock reports if the number matters.

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 directionDebitCredit
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 numberStored or worked outWritten when, from what
Balance on Stock BalanceStored on the balance rowRewritten 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 AvailabilityWorked out each time you open the screenBalance, plus open sales orders and uninvoiced goods received (signed), less reservations
Cost on a document lineStored on the lineWritten 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 reportStored when the report is generatedThe moving-average price on the last movement at that location before the session started
Stock account on the balance sheetA journal balanceMoved 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 statementA journalWritten 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 seeWhich idea explains itWhat to do
A purchase GRN is FINAL and Stock Balance has not moved§2: a plain GRN is paperworkThe 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 invoiceVOID 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 defaultCheck 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 reservationsThe 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 balanceRaise a Stock Adjustment for each variance you accept
A conversion is FINAL and nothing moved§5: the conversion’s posting run is not connectedRecord it as a Stock Adjustment pair
A branch values transferred stock at zero§5: the per-location cost starts from that location’s own historyRead the company cost for valuation
Sales this month show no cost of sales§5: cost of sales is the month-end journalRun Month End Processing for the month
A voided document still shows on the Stock Card§1: VOID adds a reversing lineExpected: both lines stay, and they net to zero
Margins on last week’s sales changed§1 and §6: a backdated document replayed the chainSee 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_ADJUSTMENT and STOCK_BALANCE for adjustments, the Reset MA code unless each reset names its own, and COGS with STOCK_BALANCE for 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.