Skip to content

The Stock Ledger — a journal of moves, not a stored number

What this covers. Every physical change to inventory — goods arriving, a dish sold, a transfer between warehouses, a spillage, a monthly count, a batch of dough produced — is recorded as one stock movement: a quantity going from one location to another, on a business date. On-hand is never a number the system keeps and edits; it is derived from the boundary that governs the day and the movements after it. The close is what fixes the record: while a period is open the paperwork and the movements it made can still be put right together, and once the period is sealed nothing in it moves again. This chapter teaches that one primitive — why stock is kept as a journal rather than a balance, why every movement has two sides like double-entry bookkeeping, the small set of locations that lets one shape describe every operation, and where the line between correcting and carrying forward falls.


1. The one idea: a history of movements, never a stored level

A restaurant's flour does not have a "stock level" that the system bumps up and down. It has a history of movements, read from the boundary that governs the day. Usually that boundary is settled history itself; a posted count may also say, for the items it observed and from its own day, where the running balance stands, without adding a movement or changing the history. This is the single most important decision in the whole stock domain, so it is worth pinning down precisely. There are two ways to run an inventory, and the difference is everything.

A periodic inventory — what most small food businesses run on paper — keeps no running record. You count what is there, you count it again next month, and the difference is what you used. That is all you can ever know. You cannot answer "how much flour did we have last Tuesday?" or "what did this one dish actually cost to make?" — only "how much disappeared over the whole month," with the receipts, the transfers, the spillage, and the cooking all blurred into one figure.

A perpetual inventory writes down every event that touches stock the moment it happens. On-hand at any instant is the strongest starting balance that governs it plus the movements that follow. The monthly physical count does not replace the running book — it reconciles it: the count is the truth event that absorbs the theft, spoilage, and over-portioning the book could never see, and the gap between book and count is itself recorded as one more movement (see Period close).

Why this matters — the why, not just the what. A perpetual journal supplies every settled balance and every event after a boundary. You cannot strike a period's price without every valued arrival of the period, nor value what left without every issue. You cannot compare what a dish should have used against what it actually used without a per-sale consumption record. You cannot show on-hand as of a closing date, or say what a period's stock was worth, without a complete dated history. The journal is not one feature among many; it is the foundation the costing, variance, procurement, and period-close layers all stand on. This pattern has a textbook name — perpetual inventory backed by a stock-move journal — and it is the spine the whole stock domain is built around.


2. The movement — the single primitive

A stock movement is one record of one event. Every operation in the entire stock domain produces one of these — or, for two-sided operations like a transfer, a pair of them. A movement records:

What it captures Meaning
from-location where the quantity left
to-location where the quantity arrived
the item which inventory item moved
quantity always a positive number, always in the item's base unit (grams, milliliters, pieces)
a reason the business intent that the two locations alone cannot tell apart
business date the date the event belongs to in the restaurant's own local clock — not the wall-clock instant the row was written
its source document the receipt, count, transfer, sale, or production run that created it
its source line when one concrete document line caused the move, which line — named as it stood when the move posted, so later reordering of the document cannot rewrite history

A document-level movement, or one aggregated from several source lines, names no line at all.

One of those fields does quiet, load-bearing work: the business date. It is stamped once, in the restaurant's own local clock, and it is the day all the accounting hangs on — a delivery placed at 23:55 and handed over at 00:10 must land on the day (and therefore in the month) the business counts it, which neither the raw timestamp nor the day the record happened to be imported can be trusted to name.

Two things are deliberately absent from a movement, and their absence is the whole design.

There is no "movement type" field. There is no "sale / supply / waste / transfer" label on the row. The type of an operation is simply which two locations it runs between, plus its reason. A movement from a supplier into a storage location is a receipt. A movement from a storage location to a customer is a sale. A movement from a storage location to the scrap location is waste. You do not record the name of the operation; you record its two endpoints, and the name falls out of them. Two orthogonal questions — between which two places? and for what reason? — do the work a list of named movement kinds (sales, supplies, wastage, transfers in, transfers out, overages, shortages, and so on) would otherwise have to.

There is no signed quantity and no stored balance. Quantity is always a positive number. The direction — whether a movement adds to or subtracts from a location's on-hand — is not a plus-or-minus sign on the row; it falls out of the from/to pair. A location that appears as the to gains; a location that appears as the from loses. The sign is structural, so there is no per-row sign to get wrong.

Why "the movement is the event; the meaning is the locations"

The movement row answers exactly one question: what physically happened — this much of this item went from here to there, on this date. The interpretation is read off the endpoints. The pair of locations tells you the class of operation; the reason disambiguates within a class. A staff meal and a sold portion both end up at the customer location — the reason is what separates a sale from internal use. This keeps the journal a tiny, stable record of facts, and pushes all the "what does this mean" judgment into a small, queryable vocabulary instead of a sprawling type list.


3. Locations — the double-entry primitive

Every movement has two ends, and each end is a location. Each location is one of exactly seven kinds of place:

  • storage location — a real place the business manages and counts: a walk-in, a bar, a back room, a dry store. These hold actual countable stock, and on-hand is computed against them. Each one sits inside exactly one warehouse — the contour that values it and closes its books. (See Scope & locations.)
  • transit — an in-between holding place used as the middle leg of a transfer between two warehouses; stock that is provably "on the truck."
  • supplier — where received goods come from.
  • customer — where sold or served goods go to.
  • scrap — where wasted or spoiled goods go.
  • production — the conceptual prep bench that an ingredient passes through when it is consumed into a made item (a batch of dough, a base sauce) and the made item is yielded back.
  • stock-loss — the counterparty for count adjustments: the place a shortage "goes to," and the place an overage "comes from."

The first kind is a real place you can walk up to and count. The other six are virtual — they are not physical places at all. They are the counterparty side of an entry, seeded once per company so that every movement always has a second end to point at.

Why every movement needs two sides — double-entry, applied to food

The bedrock rule is that quantity is globally conserved: every movement decreases somewhere and increases somewhere else by the same amount. Nothing ever appears from nowhere, and nothing ever silently vanishes — even waste and shrinkage have an explicit destination (the scrap location, the stock-loss location). This is double-entry bookkeeping — the centuries-old accounting discipline that every entry has two equal sides — applied to physical stock. It buys three things.

  1. One primitive covers everything. Receipt, sale, transfer, waste, count adjustment, and production are all the same shape — a movement between two locations — distinguished only by which locations and which reason. Transfers and production, which a naive one-sided "in / out" model treats as awkward special cases, are just ordinary movements here.
  2. Auditability. Because nothing is created or destroyed, the books always balance against a known counterparty. Shrinkage is not a silent subtraction; it is a recorded movement into the stock-loss location that you can total, attribute, and investigate. This matters double when entries are written by machines — scanned supplier papers, automated posting, assistant-driven counts: every movement names the document that made it, so an automated mistake is traceable to the paperwork that caused it and is answered by correcting that paperwork. Provenance on every row is what makes automated entry safe to trust, and to audit after the fact.
  3. The sign is structural. Each movement's contribution to a location is into it minus out of it. There is no per-row sign to get wrong, whether the tail begins at a settled close, a posted observation, or the beginning of history.

Every operation, written as a movement

Operation The movement(s)
Receipt (goods arrive) supplier → storage location
Sale / service storage location → customer
Transfer (warehouse A → warehouse B) a location in A → transit, then transit → a location in B
Waste / spoilage storage location → scrap
Count overage (more counted than the book says) stock-loss → storage location
Count shortage (less counted than the book says) storage location → stock-loss
Production — consume an input storage location → production
Production — yield the made item production → storage location

That small table is the entire operational vocabulary of the stock domain. For the location taxonomy and the warehouse-versus-restaurant scope axes, read Scope & locations.

A write-off names the place it came off

Waste is destructive at a place. Somebody found the broken bottle in the walk-in and not in the bar, and that is the fact being recorded — so every line of a write-off names the storage location the quantity left, exactly as a receipt line names where the goods were put away. (A made-to-order dish is the one exception: its ingredients may follow its restaurant's routing instead — see below.) Without it the loss would have to be guessed onto some default corner of the warehouse, and every per-location loss report would be fiction.

The place is part of the fact, so it is named when the write-off is saved: "two trays of mussels, spoiled" is not yet a record of anything until somebody says which storage location they came off. Where a business keeps a single warehouse there is only one possible answer, so a stock line is placed on its default location for you and nobody is asked to state the obvious. The placement stays correctable afterwards like every other thing the document says.

A write-off of something made to order

What gets thrown away is not always a raw ingredient. The latte made for the wrong table and the two sandwiches that sat out too long were never stock: each is a phantom — a made-to-order item, of which nothing is ever held — so there is no balance of lattes to take one from. What was lost is what went into them. A write-off line naming a made-to-order item therefore explodes that item's recipe, the one in force on the write-off's date, exactly as a sale of it would, and every ingredient the recipe consumes leaves to scrap at its own pool's cost. The loss is the materials' incurred cost and nothing more — a discarded dish carries no margin and no selling price into the books.

Each ingredient leaves where a sale of the dish would have drawn it: the write-off names the restaurant whose kitchen made the dish, and that restaurant's consumption routing places every ingredient — the dish's station, an item's own override, the default store — exactly as it places an internal use. When routing changes, the write-off's draws move with it, as a sale's do. A line may instead name one storage location; it then answers for everything the dish was made of, and a later routing change leaves it where it was put.

The reason is always plain waste. An expired ingredient is written off as that stocked item, with reason expired.

A dish with choices is written off as the build it actually was — oat milk, no syrup. While a required choice is still unanswered, or a saved choice no longer fits the recipe in force, the write-off spends what the build does answer and the unanswered rest keeps the period open (see Period close).

Packaging on a lost dish follows its fulfillment and draws stock according to its own accounting treatment.

A remake has two distinct physical facts: the failed preparation is waste, and the replacement handed to the customer belongs to the sale. A refund changes money; it establishes neither a new physical loss nor a return of ingredients to stock.

Worked example. A latte's recipe is 18 g of coffee, 200 ml of milk and one cup. Two are made for the wrong table and binned. The write-off names Latte × 2 at the café, whose routing sends the bar station to the bar: 36 g of coffee, 400 ml of milk and 2 cups leave the bar to scrap, each at its pool's price. Nothing named "latte" moves, because nothing named "latte" was ever there.

Because the place is stated line by line, one write-off document can reach across warehouses — a broken crate in the dry store and a spoiled tray in the freezer, recorded on one walk. Each line leaves the location it names — or, for a routed dish, wherever its routing sends each ingredient — and is valued at the average cost of the warehouse that owns that location, so each warehouse's books see only its own loss. The document is one piece of paper; it is not one valuation contour.


4. On-hand is derived, never stored

On-hand for an item in a storage location is never kept as a single number. It is computed from a boundary and a tail:

on-hand as of a date = the quantity at the boundary that governs the room and day + movements after that boundary.

In an open period the quantity boundary is decided by item and storage location. The latest posted count that explicitly observed that item supplies its starting quantity, whether the count is full or spot. A count is the stock at the end of its day, so movements on that day are already inside its quantity and only later movements are added. Omission from a newer count leaves the existing basis intact; an explicit zero replaces it with zero. Two observations dated the same day are ordered by which count was made later. Publication and completeness are taught in Period close §2.

Without a newer observation, the boundary is the preceding close. Before the first close, it is the warehouse's initial balances, effective at the beginning of the warehouse's opening date: movements on that date are included. An empty initial balance means zero, not an unknown balance. Dates before the warehouse's opening date read the earlier movement history (§4 of Period close).

Run the same derivation over every storage location a warehouse owns and you have the warehouse's on-hand — the grain the close settles and the costing values.

Each period close records settled on-hand and value for each warehouse and item as of the close date; later balances add the movements since that border until a walk speaks again. A count plays the same arithmetical role for the working book but not the same evidential one: it is an observation the running balance stands on, made fact only when a close answers for it — and the close reads the forms the accountant chose, which need not be the ones the book happens to stand on (Period close §3).

Value is derived the same way, and independently of quantity. On-hand quantity and inventory value are two separate things. A movement can change quantity without changing total value — a transfer moves units between warehouses, but the company's total stock value is unchanged, only the place holding it changed. Value is quantity times the warehouse's weighted-average cost — the blended price of everything that came into that warehouse's pool. Publishing a count changes quantity, not price: the pool's price stands on the sealed border — or, before the first close, on the warehouse's initial quantities and costs — plus the period's arrivals, and the shrinkage a walk reveals is expensed by nothing short of a close. That provisional price is the one used to price consumption, wastage, transfers, and replenishment. The full costing math (how arrivals set the price, how landed freight folds in, what the close strikes and what it restates) lives in Costing & valuation. The journal's only job is to supply the valued, time-ordered stream of arrivals and issues that the costing reads from.

Valuation entries — value-only changes leave artifacts too

Some news changes what stock is worth without moving a single gram, and arrives too late for the period it is about: a sending warehouse strikes its own price after the receiving one has sealed the day the goods landed. Value learned that late cannot be threaded back into a sealed period, so it is recorded as an explicit, dated valuation entry in the open period of the warehouse it concerns, linked to the document that caused it — never as a silent nudge to a stored number. The money trail thus has dated, auditable artifacts exactly as the quantity trail does. In settled and untracked books, derived value is reconstructed from quantity movements and valuation entries. Before the first close, working value begins with the warehouse's initial balances and includes valued events from the opening date onward; the first close settles that starting claim against the earlier journal. What such news does to the receiving period's cost is Costing & valuation's subject.

Four conceptual layers, worth holding in your head. It helps to picture the system in four layers: the boundary (initial balances, settled fact, or a posted observation), the movement (the event), the derived on-hand, and the value decoupled from quantity. On-hand and value are always derived; a count changes the starting quantity, never the journal behind it.


5. Quantity and value on a movement

A movement records one item's quantity, value, business date, and source and destination. The warehouse runs one blended weighted-average price for the item.

A 10 kg flour issue at €0.80/kg therefore carries 10 kg and €8.00, regardless of which delivery supplied the flour. Use-by dates belong to the receiving facts described in Procurement.


6. The close is the boundary — correct before it, reopen or carry forward after it

The journal follows the paperwork, and the paperwork can be put right. What decides whether a mistake is corrected or answered is not how long ago it was made but whether the period it belongs to is closed.

While the period is open, the document is the truth and the journal follows it. A posted goods receipt whose quantity was wrong is simply corrected: the movements it made are taken back and made again from the corrected paperwork, so the journal says what the document now says. Cancelling a posted document takes its movements back and leaves the header standing, marked cancelled. The document is a living statement about what happened, and while its period is open, it can still be brought into line with what actually happened.

Worked example. A receipt was posted as supplier → storage location for 12 kg when the delivery was really 10 kg. The receipt is edited to 10 kg: its 12 kg movement goes, a 10 kg movement takes its place, and on-hand reads +10 kg — the number that was always true. Nobody has to read a 12 kg row and a −12 kg row to work out what the shelf holds.

While the close remains in force, the period's facts stay settled. A closed period has been counted, priced, proved, and reported. A document dated inside it is neither edited nor cancelled, and no new movement is dated into it. News that arrives later is recorded as what it is: a new, dated fact in the period that is open now — a correcting document of its own, or, where a sending warehouse strikes its price after the receiver has closed, a valuation entry (§4). A goods receipt is the exception: it carries no news forward and is corrected by reopening its period, as below.

Why the line falls there. Before the close, no figure has been published: the period's price has not been struck, no snapshot rolls forward, and nothing outside the system depends on the numbers yet, so correcting the record costs nothing and leaves the book saying the plain truth. After the close, every one of those things is true, and reaching back would silently restate a margin somebody has already reported and reconciled. Drawing the line at the close means the correction burden falls exactly where the audit value is: an open month reads as what happened, and a closed month's published result stays attributable. Reaching back is therefore never silent: it is a separate period reopening, which withdraws the close deliberately, preserves its dependencies and original evidence, and closes the span again; that process is taught in Period close §8.

A goods receipt in a closed period is corrected by reopening it. A receipt's quantities and prices are among the sources a close was counted, priced, and published from. When one of them proves wrong after the close — a quantity misread at the door, a price keyed differently from the supplier's paper — the period is reopened, the receipt is brought to the truth, and the period closes again, its price struck over the corrected totals, so the published result is reproduced from corrected sources. Such a mistake is an error in IAS 8's sense: the delivery and its paperwork were on hand before the close, and IAS 8 corrects an error in the period where it was made.

The ledger and the paperwork are two layers

The documents that create movements — a goods receipt, a transfer, a waste record, a sale's consumption posting, a production run — reach the ledger through one of two lifecycles, and which one a kind uses is decided by whether anything on it has to be settled before the books can be asked.

A goods receipt or a production run opens as a draft: freely editable, with no ledger effect at all, until the person signs it off. Posting is then the act that emits the movements, and a draft that should never have been started is deleted outright — there is nothing to withdraw.

A sale, a write-off, an internal consumption or a transfer has nothing waiting to be settled, so saving it posts it. There is no separate gesture and no draft to delete; a document that should not exist is cancelled like any other posted one.

Either way, from the moment the movements exist the document keeps answering for them: while its period is open, editing it re-states them, and cancelling it withdraws them and keeps the header so the trail remembers.

The stock count has a different job: posting publishes an observation for daily quantities, without creating a movement. Only the close turns accepted differences into movements, as taught in Period close. The goods receipt runs the landed-cost waterfall — spreading freight and handling across the lines it received so each arrives at its true delivered cost — and that valued line is exactly what the receipt movement carries into the journal.


7. Worked examples (real numbers)

These trace three everyday operations end to end, as movements. Assume an item Flour with base unit grams, and a business that values each of its sites separately. The first site is the warehouse we'll call Kitchen Store; it holds a single storage location, so one name serves both for the place the flour sits and for the pool it is valued in.

7.1 Receipt — buying 25 kg of flour

A supplier delivers 25 kg of flour, invoiced at €0.80/kg = €20.00 subtotal, plus €2.00 of allocated freight (the landed cost). The goods-receipt document posts one movement:

supplier → Kitchen Store item = Flour · quantity = 25 000 g (25 kg, converted to the base unit at the posting edge) · value = €22.00 (the €20.00 subtotal plus €2.00 landed freight, net of any recoverable tax) · reason = supply · business date = the delivery day · source = the goods receipt, its flour line.

Effect: Kitchen Store flour on-hand goes up by 25 000 g; the €22.00 net value joins the arrivals Kitchen Store's flour price is struck from. The movement carries the net, capitalized amount — what the stock is truly worth — not the gross payable; the distinction belongs to Costing & valuation. Notice the supplier location's running balance goes negative, which is correct and meaningful: the virtual supplier location is the running counterparty of everything the company has ever received from suppliers.

7.2 Transfer — moving 5 kg to the bar store

5 kg of flour moves from Kitchen Store to the Bar Store (a second warehouse). This is two movements, through the transit location:

Movement A — Kitchen Store → transit · Flour · 5 000 g · reason = transfer · source = the transfer, leg 1 Movement B — transit → Bar Store · Flour · 5 000 g · reason = transfer · source = the transfer, leg 2

Effect: Kitchen Store −5 000 g, Bar Store +5 000 g, and the transit location nets to zero once both legs are posted. Value is conserved across the transfer: the 5 kg leaves Kitchen Store at Kitchen Store's price for the period and arrives at Bar Store, where it joins Bar Store's own pool. The company's total stock value is unchanged — only the place holding it changed. The two-leg shape (rather than a single direct movement) is what makes in-transit stock visible: between leg A and leg B, the 5 kg is in neither warehouse's on-hand — it is provably on the truck.

7.3 Count adjustment — the monthly count finds a shortage

The perpetual book says Kitchen Store should have 20 000 g of flour (25 000 received − 5 000 transferred). The physical count finds only 19 200 g — 800 g unaccounted for (spillage, over-portioning, the bag that tore). The count itself moves nothing — it freezes the observation — and when whoever reconciles accepts the gap, the count wins: the difference posts as one adjustment movement:

Kitchen Store → stock-loss item = Flour · quantity = 800 g (book 20 000 − counted 19 200) · reason = shortage · business date = the count's day (at a close, the period's last day) · source = the stock count.

Effect: Kitchen Store flour on-hand drops from 20 000 g to 19 200 g, now matching reality, and the 800 g is recorded as a quantified, attributable loss in the stock-loss counterparty — not silently zeroed away. That shortage is valued like every other issue of the period, and that is exactly how shrinkage finds its way into the cost of goods sold. Had the count found more than the book — an overage — the movement would simply run the other way: stock-loss → Kitchen Store.

Periodic vs perpetual, made concrete. A purely periodic system would only ever know "we bought 25 kg and 19.2 kg is left, so 5.8 kg was used" — with the transfer, the shortage, and any per-dish consumption all blurred into that one number. The perpetual journal separates them into distinct, dated, valued movements: a 25 kg receipt, a 5 kg transfer, an 800 g shortage, and — once sales post — the recipe-driven consumption of each dish. That separation is precisely what makes per-warehouse on-hand, per-restaurant cost of goods, and theoretical-versus-actual variance computable at all.


8. What the ledger does not do

The journal is intentionally narrow. It records valued movements between locations and derives on-hand and value from them. It does not decide:

  • what to buy — replenishment nets on-hand and open orders against par levels; see Procurement.
  • how quantities are expressed — units are normalized to base units at the posting edge; nothing enters the journal except in base units (see Units of measure).
  • how a sale becomes consumption — exploding a sold dish down to its leaf-ingredient storage location → customer movements is the sales and recipe layers (see Sales & consumption and Recipes & production).
  • how value blends — the weighted-average math and the landed-cost waterfall are Costing & valuation.
  • how the book is reconciled to truth — the physical count, its overage and shortage adjustments, and the per-warehouse close are Period close.
  • what's safe to eat or how nutritious it is — shelf-life, nutrition, and allergens are food attributes that roll up the recipe tree, not ledger facts (see Food attributes).

All of those layers write to and read from the journal; the journal's contract is just this — a double-entry, base-unit, valued stream of location movements, settled under the closes that remain in force and accountable to the history of every close.


See also

  • Scope & locations — the seven kinds of location, the storage locations a business manages, and the warehouse-as-valuation-grain versus restaurant-as-profit-center axes every movement is stamped against.
  • Item model & policies — the accounting treatment that decides whether an item is journaled.
  • Period close — the posting documents (receipt, count, transfer, waste, production) and how the perpetual book is reconciled to the physical count.
  • Costing & valuation — the weighted-average cost each movement is valued at, the one price a period carries, and what the close restates.
  • Sales & consumption — how a sale becomes the consumption movements the journal records.
  • Procurement — how derived on-hand feeds the replenishment plan, and the supplier papers a goods receipt is read from.
  • Food attributes — shelf-life and the expiry write-off.
  • Financial boundary — the conceptual accounts the journal's movements and valuation entries roll up into for export to the operator's accounting system.
Last updated · History