Period Close and Reconciliation — making the book agree with reality¶
What this covers. All month long the running book quietly tracks what should be in every storage location. But the stock itself drifts: cooks over-portion, lettuce spoils unrecorded, a case walks out the back door. This chapter explains how a warehouse closes its books for a period: someone physically counts what is actually there and records the observation, whoever keeps the books compares that count against the book and posts the surviving differences as overages and shortages, and the closing average cost re-spreads value over the counted quantity — which is exactly how shrinkage lands in the cost of what you sold. It also covers what else that same walk confirms — the implements in the drawer, the assets by their serials — the cadence a warehouse keeps and why that cadence never becomes a rule, the count that happens days after the period ends, the opening count that starts a warehouse's stock-keeping — the one door cost may enter the books through outside a priced receipt — the self-check that proves the close is balanced, the deterministic reasons a close can be blocked, and how each restaurant's profit-and-loss rolls up from the same moves.
1. Why a close exists at all¶
Two ways to know what is actually on hand sit at opposite extremes.
A perpetual inventory is the running, always-on book: every receipt, sale, transfer, and waste records a stock movement, and on-hand is the signed sum of those movements (see Stock ledger). It is correct the instant anything happens — but only about what the system was told. A periodic physical count is the opposite: you ignore the book entirely, walk the storage locations, and write down what you actually see. It is the truth — but only as of the moment you counted, and it costs labor to do.
The running book is honest about everything it was told and silent about everything it was not:
- a cook who over-portions every plate by 10 g,
- a case of lettuce that spoiled in the walk-in and went in the bin with no wastage entry,
- theft,
- an invoice that billed 50 kg but delivered 48,
- evaporation, trim, breakage.
None of these record a movement, so the running book cannot see them. Left alone, the book drifts away from physical reality, and every number built on it — food-cost percentage, cost of goods sold, margin — drifts with it.
A useful consequence of how the two extremes combine: the running book degrades gracefully into the periodic ritual. An operator who records nothing mid-period beyond received deliveries, and then counts once a month, still gets fully correct books — the count trues everything up, the close re-spreads value over what was actually there, and cost of goods comes out right. That is the minimum viable ritual: invoices plus a periodic count. Everything beyond it — recording waste as it happens, cycle-counting the expensive storage location weekly, keeping recipes current — doesn't change whether the books are correct; it buys earlier truth: live on-hand you can order against, expiry alerts that fire in time, and a variance report that explains itself instead of accumulating a month of mystery.
The close is the truth event. Once per period a human counts what is actually there, and the system reconciles its running claim to that count. The textbook name for this pairing is perpetual inventory reconciled by periodic physical count: keep a live book all month, then prove it against reality at month-end. The whole process turns on one phrase.
Count wins. When the book and the count disagree, the count is the truth and the book is corrected to it. The closing average cost then re-spreads value over the counted quantity, and the difference between the projected value and the counted value is shrinkage that lands in cost of goods sold.
This is also why the close is a hard, gated boundary. It freezes a period's numbers, rolls a closing valuation forward as the next period's opening balance, and must not run while the books are internally inconsistent (§7).
Why an operator should care. The close is where "what we think we spent on food" becomes "what we actually spent on food." A period that never closes — or that closes over rows that don't add up — produces a food-cost percentage nobody can trust. The blockers in §7 exist precisely to refuse a close that would publish a wrong number.
2. The accounting period — one calendar per warehouse¶
The unit being closed is an accounting period: a single warehouse's books for one stretch of time, usually a calendar month. Crucially, the period is keyed to a warehouse, not to the company as a whole. Each warehouse closes its own books, on its own monthly calendar, in its own timezone. And the calendar begins where stock-keeping begins: a warehouse's first accounting period starts at the date of its opening count (§4) — until that opening posts, the warehouse has no periods and nothing to close.
Why per warehouse? Because that is where value lives. Stock is valued where it physically sits — the average cost of flour is a property of the warehouse holding it, not of the company (see Scope & locations). The period that finalizes that valuation must therefore be per warehouse too. A central commissary and a satellite warehouse can be mid-period at different times; there is no single company-wide "close button." Closing the company means closing each warehouse, one at a time.
A closed period is a frozen snapshot: one header for the warehouse-and-period, and one reconciliation row beneath it for each item the warehouse holds. Once written, the snapshot is the official record of that warehouse's books for that month — the opening balance the next month inherits.
The close policy — a cadence, never a gate¶
"Usually a calendar month" is a habit, not a law, and different warehouses sensibly keep different rhythms: the busy dry store monthly, the expensive spirits cage weekly, a warehouse holding nothing but fixed assets once a year. So each warehouse carries a close policy — the rhythm at which its books are meant to be closed: on demand, weekly, monthly, quarterly, or annual.
The policy is a hint and only a hint. It says where the next period boundary falls, so the system can pre-fill a close date and tell the operator a period is due; it never refuses anything. Closing stays a deliberate human act, and any date remains legal — a business that closes on the 3rd because the 1st was a holiday is doing nothing wrong. Making the cadence advisory is what keeps a scheduling preference from turning into a rule the books have to obey.
last close ends 30 Jun + policy → the boundary the system offers
weekly 7 Jul
monthly 31 Jul
quarterly 30 Sep
annual 31 Dec
on demand — (see below)
On demand is the count-to-count rhythm: there is no calendar boundary at all, and no due date to nag about. Instead the system offers the date of the warehouse's latest full count — because for an operator who closes when they have counted, the walk is the period boundary. It is the honest option for a small operation that counts irregularly, and it removes the temptation to close on a date nobody actually walked.
Cadence is also how assets get verified on their own rhythm: a warehouse holding only fixed assets, set to an annual policy, reproduces the traditional once-a-year asset walk with no separate ritual at all (see Fixed assets §7).
One honest wrinkle follows from per-warehouse calendars. A restaurant may draw from warehouses that close on different calendars — its own warehouse monthly, a shared commissary on another cycle. The consumption side of that restaurant's P&L is unaffected: consumption is posted eagerly and every movement carries its business date, so "what did this restaurant consume in June" is always answerable. But shrinkage only becomes a number when a warehouse closes, so a restaurant fed by warehouses on different calendars has no single period in which all of its shrinkage settles. The model accepts this: shrinkage is a warehouse-period fact, and it reaches the restaurant's P&L as each supplying warehouse closes its own books.
Counting is one job; making the book agree is another¶
A stock count — the document that records a physical count — is a pure observation of one storage location inside a warehouse. The sheet is written the way that storage location is walked, one row per sighting, and the same item may appear on several rows — one per spot it turned up in, each in whatever unit that spot held. A free-text label can preserve finer detail such as "shelf 3." Posting converts every row to the item's base unit, sums the sightings per item, and freezes the assertion: these items were seen at this storage location, at these quantities, on this date. Posting moves nothing — a count never touches the ledger. A full count claims that storage location is complete, so it must carry every item held there — a zero is confirmed, never assumed; a partial count covers whatever subset was walked. Both kinds exist only for a warehouse that keeps stock: a count can be taken only once the warehouse's opening count has posted, and never dated before the opening date (§4) — before that boundary there is no asserted truth for a count to stand on.
Counting is per storage location because a walk is a walk: someone goes to the cellar, or the bar, and comes back able to speak for that space and no other. The opening count of §4 is the one that is not, and for a reason worth keeping straight — it does not verify one storage location, it starts a whole warehouse.
A warehouse close gathers one qualifying full count from every active storage location. The walks may finish on different days, but together they are the evidence for the warehouse balance. A storage location archived before the close, or created after the period boundary, is outside that obligation. Once the period closes, the chosen set is frozen so a later walk cannot rewrite which observations supported the close.
What a full count covers — three kinds of thing, one walk¶
A warehouse holds more than consumables, and its count reflects that. Everything the warehouse's books carry is on the sheet, in three sections that behave differently because the things behave differently (the treatments themselves are taught in Item model & policies):
| On the sheet | How it is counted | May rows be added? | May the count find more than the book? |
|---|---|---|---|
| consumables (stock-tracked) | quantity rows, as many sightings as the walk produced | yes | yes — an overage |
| implements (expensed-on-write-off) | quantity rows, offered from the book so the walk can tick through them | yes | yes — the sighting stands, but no correction posts for the surplus, at whatever storage location it was found, until a document explains the units |
| fixed assets (capitalized) | one row per serial, a checkbox — a separate section | yes on a walk — any unit the register knows; an opening claims rather than observes, and refuses what it cannot take on | yes — the sighting stands as a discrepancy, and nothing about the register moves until a document moves it |
Consumables are the open case, and rightly so: a sack of flour nobody recorded is an ordinary find, and the overage machinery of §4 prices it honestly. Implements are just as open, for the plainest reason there is — a sheet that cannot write down eight pans where the book calls six is not a count, it is the book copying itself. The whole job of the walk is to say what is there, and a document that will not hold that number is worse than no document.
What the sheet may say and what the books may absorb are two different questions, though, and it is the second one that has to be guarded. Quantity that appeared on the books at zero cost would later leave as an expense — the day the pan is written off, the day the asset is disposed. Expense with no purchase behind it is precisely the shape auditors read as tax evasion, so found units reach the books only when a priced document explains them. Which is why the two gestures part company here: the count records eight pans, and the correction waits. An implement counted above its book posts no overage at all. The one way through is to enter the goods receipt that was never entered — the delivery those two pans arrived on, at what they cost — which raises the book to eight and gives the found units their price in a single honest gesture, after which the gap melts like any other journal fix (§4). There is no second route to found value, deliberately: it comes from the document that paid for it, or it does not come at all.
Often, though, no value was found in the first place — the pans were already on the books, just not where the book put them, and the document that answers is the transfer nobody wrote. That is why the correction waits for the whole item and not merely for the row that reads high. A storage location short of pans and another holding extra are, nine times in ten, one fact told from two ends; settling the shortage on its own would expense pans that are sitting twenty meters away in the next room, and the only way back from that is to reverse the correction. So the walk records both readings, and the correction stays out until a document says which story is true. It costs nothing to wait: unlike a delivery or a breakage, a correction is a conclusion being drawn, not an event that already happened.
The opening count (§4) is the one count that still prices what it finds, implements included. It asserts the very boundary where a warehouse's books begin, so every pool is empty by definition and the operator's asserted costs are the starting value — not value invented on top of a book that already claims something else.
Fixed assets have the same split, answered in their own way. The sheet pre-draws the serials these books expect — that is what makes the walk short and the question clear — but the walker may tick any unit the register knows, including one the books place elsewhere entirely or have already written off. Refusing those would leave the person holding the unit unable to say so, and the mistaken sheet as the only record; and accepting them costs nothing, because a tick moves no value. What cannot be typed onto a sheet is a serial the register has never heard of: such a unit enters by being registered, carrying its cost, which is the same "no value from nowhere" rule the implements answer with a waiting correction.
That generosity belongs to the walk, and only to the walk. An opening count's serials are not observations but a declaration of which units these books begin carrying, so a tick there is a claim — and a claim the document cannot honour is refused rather than recorded and quietly not acted on. A unit on another warehouse's books comes here on a transfer or not at all; a written-off one comes back only through a fresh acquisition. The distinction is worth holding on to, because the two documents wear the same checkbox: a walk may be surprised, a boundary may not.
A tick that disagrees with the register — an asset seen at another storage location, on another warehouse's balance, or after its disposal — becomes a discrepancy on this view, alongside the quantity gaps, and so does a unit two walks reported from two different storage locations. A discrepancy moves nothing by itself; it is answered by the document that moves the unit, posted by whoever answers for the books, and it clears itself once that document exists.
Every scope may carry serials, and each does a different job with them. A full count's ticks confirm the serials these books carry, and only those clear a close. An opening count also places — it is where units the company owns but has put on no warehouse's books are assigned to the books that will answer for them. A partial count records what its spot-check happened to see; nothing reads its silence, so walking the spirits cage never implies a claim about the rest of the building. The section is taught in full in Fixed assets §7: posting merely freezes the ticks, and an unticked serial becomes a close blocker rather than a posting error.
Forcing the book to agree with what was seen is a separate, deliberate gesture, often by a different person on a different day. The storekeeper counts — perhaps daily, perhaps a week before anyone reconciles. Whoever keeps the books then compares each item's count against the book's claim, fixes the journals the gap points at (a missing transfer, an unposted receipt — each fix shrinks the gap, live), and posts the differences that survive: per item or in bulk, an overage or shortage movement for exactly the residual. A difference posted too soon can be taken back — reversing it is an append-only entry that reopens the gap — right up until a close seals it (§8). Splitting the two gestures is the classic separation of the counter from the approver, and it dissolves a whole class of ceremony: an observation about a past moment cannot go stale, so a journal fix landing after the count never demands a re-count — the gap simply recomputes.
A count needn't wait for the close — cycle counts¶
A count may cover a subset of items, mid-period: count the expensive proteins and the spirits every week, everything else once a month. Differences posted from a mid-period count are dated the count's own day and valued at the current average cost — the book is corrected on the spot, which is the entire point. The practice is called cycle counting, and it is normal, healthy discipline: high-value, high-shrinkage items earn more frequent truth events. What a cycle count does not do is substitute for the close: the period close still requires a complete count of the warehouse, so the closing snapshot rests on a full picture, not a spot-check.
3. The reconciliation row — the per-item identity¶
The close computes one reconciliation row for each (warehouse, item) pair in the period. Every figure is in the item's base unit — the canonical unit each item is stored and costed in, with every unit converted to it at the moment anything enters the book (see Units of measure). Every figure has a quantity side and a money side.
A row is just bookkeeping arithmetic made visible: start with what was on hand, add everything that came in, subtract everything that went out, and you have what the book claims should be on hand. In order:
opening on-hand last period's closing, rolled forward
+ over-receipt adjustment an over-receipt folded in before the count (book was under-stated)
+ supplies received this period from a supplier (supplier → internal)
+ transfers in received from another warehouse (internal → internal)
− transfers out sent to another warehouse (internal → internal)
− sales sold dishes, recipe-exploded to leaves (internal → customer)
− direct sales a stocked item sold as-is, 1:1 (internal → customer)
− internal use staff meals, recipe tests — by category (internal → customer or scrap)
− wastage spoilage / trim (internal → scrap)
= projected on-hand what the BOOK says should be on hand
The sales line is a recipe explosion — unpacking a sold dish into the raw ingredients its recipe says it consumed (the textbook name is exploding a bill of materials). The full mechanics live in Sales & consumption; here we only need the result: every sold dish lands as depletions of its leaf ingredients, in base units, in this row.
Notice where each outflow goes. A sold dish, a direct sale, and a comped plate (a sale at €0 — the guest transaction happened) all leave to the customer side. Internal use goes where its consumption category points: eaten — a staff meal — to the customer side too (a person consumed the food), used up — a recipe test — to scrap, the destination wastage always takes (consumed by the process rather than served to a person). The destination says what kind of departure it was; the reason code is what tells a sale from internal use within the same destination.
Then the count arrives:
count the PHYSICAL count — an assertion of absolute on-hand, not a delta
variance = count − projected on-hand the raw gap, computed as of the count's date
Note what the projected on-hand deliberately excludes: the count. The count is a physical assertion, not a transaction, so it is never summed into the book's projection — that would be circular. The variance is the entire point of the exercise. It is the quantity the running book could not explain: the over-portioning, the unrecorded spoilage, the theft, all collapsed into one number per item.
A subtlety on the column names. Underneath, every line above is the same primitive — a stock movement from one location to another (see Stock ledger), distinguished by where it came from, where it went, and its reason. Supplies is just the movements that ran supplier → internal; wastage is the movements that ran internal → scrap; and so on. The friendly column labels are a reporting view over the underlying movements grouped by their (from, to, reason). The labels are for human eyes; the primitive doing the work is the movement.
Which count the close reads — the earliest full count on or after the last day¶
Completeness is a claim about one moment, so the close reads every row's count from a single qualifying full count — never a stitch of per-item latest counts across different days, which would produce a closing balance no auditor could reproduce. The qualifying count is the earliest posted, non-superseded full count dated on or after the period's last day. Ideally that is the last day itself. But real life postpones counts — the storekeeper is away, and the count that should have happened on the 30th happens on the 7th — and the model accepts that honestly, the way audit practice long has (the trade name is a postponed inventory): the book bridges the gap.
30 Jun 1 – 7 Jul 7 Jul
period's last day bridge movements, full count — keeps its
│ recorded as they happen own honest date
▼ │
corrections post ◄─────────────────────────────────────────┘
dated 30 Jun implied 30 Jun balance = count − net(1–7 Jul)
The variance is computed as of the count's date — counted versus what the book claims on the 7th — and the surviving difference posts dated the period's last day. One movement squares both dates at once: the book agrees with what was there on the day it was walked, and the period-end balance the snapshot freezes equals the count rolled back through the bridge days' recorded movements. The bridge week's shrinkage lands in the closed period — the documented, accepted price of counting late. The count document itself is never re-dated: a count re-dated to the period end is exactly the fiction an auditor exists to catch, and the roll-back reaches the same balance honestly.
Two edges of the rule earn their keep. Earliest, not latest: while a nearer count exists, next month's count can never hijack an earlier close — a worthless count leaves candidacy through its own life (cancelled or amended), never through a setting. And unbounded: the system never gates how late the postponed count may be — how far the count drifted from the balance date is the bookkeeper's judgment, answered before their auditor, not a system rule. A partial count posted after the qualifying full count does not join the close; its differences post at their own date, into the next period's truth. (The opening count of §4 never qualifies either — the opening date and the period boundary are unrelated dates.)
4. From variance to an adjustment — count-wins, made into movements¶
A non-zero variance cannot just be erased — it has to be explained and recorded. Nothing posts by itself: whoever reconciles works each row's gap down by fixing journals, then accepts what survives, which posts a correction movement against a virtual holding place called stock-loss (a bookkeeping counterpart, not somewhere anyone can walk — the place a discrepancy goes so the two sides of every entry still balance). There are three correction kinds:
| Correction | The movement it posts | Meaning | Effect on on-hand |
|---|---|---|---|
| over-receipt adjustment | stock-loss → internal |
an over-receipt that left the book under-stated before the count — folded into the pool before pricing so the average is consistent | + |
| overage | stock-loss → internal |
the count found more than projected | + |
| shortage | internal → stock-loss |
the count found less than projected (the shrinkage case) | − |
The arithmetic that turns a variance into an overage or a shortage:
final qty = projected on-hand − shortage + overage the reconciled closing quantity (= the count)
check = variance − overage + shortage MUST land at ~0 once the row is explained
Read plainly: a positive variance (counted more than projected) is absorbed by an overage; a negative variance (counted less) is absorbed by a shortage. Once the matching correction is posted, the check lands at ~0 and the final quantity equals the physical count — the book has been forced to agree with reality. That is "count wins" expressed as movements. The system never edits a past movement; it posts a new adjustment movement against stock-loss to close the gap (§8 explains why it must work this way). And until the close seals them, posted differences can be reversed — an append-only reversal that reopens the row, for the closer who posted too early and then found the real journal problem. Once the close writes its snapshot, the corrections it rests on are part of the frozen closing balance and are final (§8).
The over-receipt adjustment is the special case. It is an over-receipt correction applied before the count math, so the over-received quantity is priced into the average at the period's blended cost rather than appearing as a phantom overage at the very end. The resolver applies any over-receipt adjustment first (typically when the projection has gone impossibly negative — see §7), recomputes the projection, and only then applies the single overage-or-shortage that drives the check to zero.
A difference settles where the walk happened¶
A warehouse with several storage locations is walked several times: the bar, the cellar, and the satellite store each get their own count. Each of those counts settles one storage location against the book kept for it. Three walks that disagree with their books produce three corrections, each recorded against the storage location that was actually counted.
storage location book counted difference what is recorded
bar 12 6 −6 bar → stock-loss shortage 6
cellar 40 44 +4 stock-loss → cellar overage 4
satellite 8 6 −2 satellite → stock-loss shortage 2
The warehouse still lands four units lighter, because the warehouse figure is the sum of its storage locations — it is derived, never an endpoint a correction is posted to. What it is not is a single four-unit shortage booked against the cellar, with the other two quietly patched to match. A storage location that lost nothing must never be recorded as having lost something, and quantity must never be recorded as having moved between storage locations on evidence that says no such thing.
That honesty has a visible cost, and it is the right cost. If a porter carried six bottles from the bar to the cellar and told nobody, the two walks report a shortage of six and an overage of six where a single unrecorded move explains both — and the total volume of gross differences looks worse than the business really performed. The warehouse's value is still the net, because value is a warehouse-level figure; the gross differences at each storage location are the honest record of what the walks observed. If stock really did move, the business records the move. The system never invents one on its behalf.
A form that says nothing about an item asserts nothing about it. That storage location stays out of the settlement entirely rather than being read as "counted zero" — an item nobody walked is a gap the close names as a blocker (§7), not a shortage to post.
The opening count — the moment a warehouse starts keeping stock¶
Value is born in exactly two places: a priced document — the goods receipt, whose lines carry what the stock cost — and the one opening count that starts a warehouse's stock-keeping. Nothing else creates value; everything else moves or removes it.
A standard warehouse is born not yet keeping stock. Everything operational posts freely from its first day — goods receipts, sales, transfers, production, wastage — because real adoption is incremental: an operator often begins by entering deliveries just to see prices, and only later decides to run stock properly. That early stretch is the untracked era: the journal faithfully records whatever it is told, an average cost forms as it may, but no one has yet asserted what is actually there — so ordinary counts, posted differences, and the period close are all refused. There is nothing to reconcile the book to until someone states the truth.
The opening count is that statement — the explicit moment the operator says "from this date, this warehouse keeps stock." Its lines carry the counted quantities and unit costs — the one count that may carry a cost — and it may be dated any past or present day, never the future. The chosen date is the boundary where reconciliation begins: every later count must be dated on or after it, and the warehouse's first accounting period starts there (§2). A cost is required only where a quantity was actually counted; a zero row needs none. The system proposes each row from what the journal already knows — the book quantity and its running or last-received cost — and the operator corrects it to what is actually there.
Starting to keep stock is one event for the whole warehouse, so it is recorded on one sheet. The operator walks every storage location the warehouse has, and each row names the storage location the sighting was made in — the cellar's flour and the bar's flour are two rows of one statement, not two statements. Quantity keeps that grain, because a quantity belongs somewhere; the value the count asserts settles once for the warehouse, because value never did belong to a storage location (§5).
On an opening, silence means zero. This is the one place the opening parts company with a full count, and the two differ on purpose. A full count verifies a book that already exists, so it must account for every item that book knows about — an omission there is a hole in the verification. An opening asserts a book that does not exist yet: at an era boundary the stock is what the operator writes down, and anything they leave off is zero. Posting reads that literally — an omitted item's pool is brought to zero and whatever value it carried is extinguished at the boundary, exactly as if a zero row had been written for it. Because the sheet spans the warehouse, so does the silence: an item written down in the cellar and not at the bar is zero at the bar. That is sharper than it sounds, and it is the safer reading — the alternative leaves a storage location un-asserted, and therefore unexamined, for as long as nobody happens to walk it.
The consequence is worth stating plainly, because it is the price of the rule. A warehouse with a long untracked era may carry book quantities for two hundred items; an operator who lists twelve of them zeros the other hundred and eighty-eight and writes their value off on the opening date. That is the honest reading of the gesture — the operator is declaring what is there, and what nobody wrote down is not there — but it is only a considered decision if the operator can see what they are silencing, which is exactly what the proposed book quantities above are for: an item the form shows with a book still on it, and the operator leaves blank, is a choice rather than an oversight. An empty opening is the same rule at its limit: it asserts an empty warehouse. At a warehouse whose journal held nothing it writes nothing and simply starts stock-keeping at zero; at a warehouse with an untracked-era book it zeros every pool that era left behind.
Posting the opening settles the untracked era at the boundary — with ordinary append-only entries, never by editing or hiding the history. Per item — each one the form asserts, and each one the era left a book for — two legs, both dated the opening date, each at the grain it belongs to:
book what the untracked era left: book qty at book value
asserted what the operator counted: counted qty at asserted unit cost
(zero, for an item left off the form)
1. quantity leg per storage location: counted − book moves between that
location and stock-loss, valued the way any count difference
is (count wins; a negative book is extinguished at its
implied price)
2. value true-up once for the warehouse: one value-only entry brings the pool's
value to exactly the whole form's counted qty × asserted cost
(skipped when the quantity legs already land there)
The second leg is settled once, and against what the whole warehouse's books say, because that is where value lives. Settled one storage location at a time, it would be settled against a figure the previous one had just moved, and the warehouse would not end at the sum of what was asserted — the order they were walked in would decide the answer.
After both legs the pool reads exactly what the operator asserted, and the weighted average going forward is the asserted cost — §5's running average takes over from the operator's figures. The pre-era journal stays visible and untouched; its whole net effect lands as one visible profit-and-loss line on the opening date — the untracked era wrote off, or found, so many euros — one sentence for an auditor. A warehouse whose books were never touched is the simple case: each opening line becomes a single movement carrying the asserted quantity and value. Either way, this is how an operation's starting stock enters the books — one honest count plus honest prices, not a fabricated history of receipts.
Worked example. Before its opening, a warehouse's untracked era recorded a 100 kg flour delivery at €0.80/kg (with no consumption ever recorded), rice sold though no receipt ever entered it (book driven to −5 kg), 30 kg of sugar received at €1.00/kg, and spices never entered at all. The operator opens the books on a date D, counts what is there, and asserts 20 kg flour at €0.80, 10 kg rice at €1.20, and 2 kg spices at €3.00 — writing nothing at all for the sugar, because the tub is empty:
flour book 100 kg / €80 → asserted 20 kg @ 0.80
leg 1: 80 kg warehouse → stock-loss at €0.80 (−€64.00)
leg 2: pool now 20 kg / €16.00 = 20 × 0.80 exactly — no entry
rice book −5 kg → asserted 10 kg @ 1.20
leg 1: the deficit extinguishes at its implied price, then
15 kg stock-loss → warehouse brings the book to 10 kg
leg 2: value trued up to 10 × 1.20 = €12.00
spices book 0 → asserted 2 kg @ 3.00
one movement: 2 kg stock-loss → warehouse, valued €6.00
sugar book 30 kg / €30 → not on the form: asserted zero
leg 1: 30 kg warehouse → stock-loss (−€30.00)
leg 2: nothing to true up — the pool is 0 kg / €0
pools after D: flour 20 kg/€16 · rice 10 kg/€12 · spices 2 kg/€6 · sugar 0/€0
P&L on D: one net line — what the untracked era wrote off or found
The opening also settles which of the company's assets this warehouse's books take on. A unit may be registered — owned, costed — while no warehouse's books carry it, and the opening is the document that decides: its serial section offers those unplaced units alongside the serials already on these books, and ticking one means these books carry that unit from the opening date onward. It is the same reasoning as the quantity side — an era boundary is where a warehouse states what it is responsible for (see Fixed assets).
At most one opening is live per warehouse — a boundary is a moment, and a moment is asserted once. The way to redo one is to cancel or amend it, and cancelling reverses everything it wrote — the quantity legs, the value entries, and the assets it took on alike.
After the opening count, a count can never carry a cost again. An overage against a live pool enters at the pool's running average — found stock is stock that was already paid for, not free stock. An overage against an empty, zero-value pool enters at zero: the quantity rises, the value does not. That is deliberately conservative — an understated book is an honest error, fabricated value is not — and stock genuinely brought in from outside gets its value the honest way: a goods receipt carrying its price, supplier optional. (The full pricing logic is Costing & valuation.)
Implements take that conservatism to its end. A count may record more pans than the book claims — the sighting is never refused (§2) — but the surplus posts no correction whatsoever: not an overage at the average, not an overage at zero. An implement's entire cost leaves as an expense the day the unit breaks, so a pan that joined the pool at zero would eventually write off value nobody ever paid for. The found units therefore wait for the receipt that bought them; entering it lifts the book and prices them in the same stroke, and the row reconciles itself.
5. The closing average cost re-spread — how shrinkage lands in COGS¶
This is the heart of the close. It is the reason the costing chapter points here for the re-spread: the close does not merely fix quantities, it re-prices the survivors so the value lost to shrinkage flows into cost of goods sold rather than vanishing or hiding on the balance sheet.
The pricing happens in two stages. (The full derivation lives in Costing & valuation; here is the part the close owns.) Weighted-average cost means every unit of an item is valued at one blended price — you don't track which physical kilo came from which delivery; you pool them and average.
Stage 1 — the intra-period blended price. Everything consumed during the period is valued at one blended cost: opening value plus what came in, over opening quantity plus what came in.
intra-period cost = (opening value + inbound value) / (opening qty + inbound qty)
Inbound means everything that entered the pool, at the value it carried when it arrived: deliveries from suppliers, transfers in from another warehouse, production yields, and count overages — found stock enters at the running average when its difference posts, because found stock is stock that was already paid for, not free stock (against an empty pool it enters at zero, and only the opening count of §4 carries operator prices; the why of pricing found stock is taught in Costing & valuation). The value side also picks up any recorded price updates — a supplier invoice that arrived after the delivery note and re-priced stock already on hand.
The period's delivery value must be the net receipt value — the value actually capitalized into inventory after landed-cost handling, not the gross payable on the invoice. (The net-vs-gross distinction lives in Costing & valuation.)
Stage 2 — the value-conserving closing price. Now the count is in and the final quantity is the physical truth. By this point the count's own overage or shortage adjustment has already forced the pool's quantity to agree with the count (§4), and every adjustment carried its value when it posted — so the close's remaining job is purely about price: re-spread the value over what actually remains, at the period's one honest blended cost:
closing cost = intra-period cost
closing value = final qty × closing cost
The closing cost rolls forward as next period's starting cost — even when the count lands at zero, the price is remembered, so the next delivery blends against a sane figure. Value is conserved across the period boundary, and the gap between the projected value and the counted value is exactly the shrinkage — it has nowhere to go but cost of goods sold.
The re-spread is also recorded, not silently applied: the close writes an explicit, append-only valuation entry — a value-only adjustment linked to the close itself — so the books show that the surviving quantity was re-priced, by how much, and why. Derived totals always reconstruct from recorded artifacts; no value moves without one.
Why this is the mechanism, concretely. Suppose the book projected 650 kg of flour worth 650 × the intra-period cost, but the count found only 640 kg. The 10 kg gap is a shortage. The closing value is computed against a final quantity of 640, so the value of those 10 missing kilos is no longer carried as an asset on the books — that flour was consumed by something the book couldn't see, and that consumption is precisely part of the period's food cost. The shrinkage does not vanish and is not parked in some suspense account; it is absorbed into the cost of what was actually used. §9 walks the full numbers end to end. Where that cost ultimately goes is the financial boundary: cost of goods sold — with shrinkage inside it — is one of the conceptual accounts the stock domain exports to the operator's accounting system (see Financial boundary).
The re-spread is not only about shrinkage — it fires on a perfect count too. The close corrects two independent kinds of truth, with two different artifacts. The count truth is quantity: if the count disagrees with the book, the gap posts as an ordinary overage or shortage movement — so by the time the re-spread runs, the pool's quantity already equals the counted quantity. The price truth is value: all period long, issues left the pool at the live running average, which never exactly equals the period's final blended price (a sale posted on the 3rd couldn't know about the cheaper delivery on the 10th). The re-spread's valuation entry trues up exactly that residue. So even when the count matches the book to the gram — no adjustment movement at all — the re-spread is usually still non-zero, quietly re-anchoring the pool to the honest blended price before it rolls into the next period. Count truth fixes how much; price truth fixes what it was worth; the close always does both.
two truths, two artifacts
─────────────────────────
count truth (how much) count ≠ book → overage/shortage movement
price truth (worth) live avg ≠ blended → re-spread valuation entry
perfect count no movement posts — the re-spread entry still fires
The re-spread touches pools, never the register¶
Everything above is about pools — the fungible stock and implements whose value is a blend that a count can disturb. The assets on the same warehouse's books are deliberately untouched by all of it. The close re-prices no asset, freezes no asset figure into the snapshot, and posts no adjustment against the register. Depreciation keeps its own calendar (see Fixed assets §4), and an asset's book value on any date is simply its cost minus the depreciation posted through that date — reproducible from the record at any moment, by anyone, without a snapshot to trust.
So a warehouse's balance on a given date reads as a sum of three parts, only the first two of which the close computes:
warehouse balance = stock pools ← counted, re-spread, frozen by the close
+ implements pool ← counted, re-spread, frozen by the close
+ Σ asset book value ← derived from the register, never frozen
The division of labor is clean: the count verifies that the asset is there, and the calendar values it. Neither borrows the other's job.
6. The self-check — proving the value ties out¶
A close can balance perfectly on quantity and still be wrong on money. So the close proves itself a second way, with a money waterfall: the sum of every valued flow over the period must reconcile the opening value to the closing value. This is the classic accounting tie-out — the detailed item-by-item ledger (the sub-ledger) must agree, to the cent, with the single control total it rolls up into.
check (money) = opening value
+ receipts value
+ over-receipt adjustment value change
+ (transfers-in value − transfers-out value)
− sales value − direct-sales value − internal-use value
− wastage value
− shortage value
+ overage value change
− closing value
≈ 0
If this does not land at ~0, the row's value does not tie out and the close refuses to publish the snapshot, reporting the item and the two figures that failed to agree. The two "value change" terms capture the re-pricing that the adjustments introduce, so the waterfall stays closed across the re-spread.
Tolerance. The check is not required to be exactly zero — penny-level rounding is expected when many decimal prices multiply out. The self-check tolerance is less than 0.1: anything smaller is treated as rounding noise and zeroed; anything larger means the row genuinely doesn't reconcile and stops the close. This is a sub-unit tolerance, not a wide band — the close is meant to be tight.
7. Deterministic close-blockers — why a close refuses to run¶
A close must refuse to run while the books are inconsistent. The reasons it refuses are deterministic: they are computed, not discovered by judgment. The system enumerates every row and finds every problem — that completeness is the guarantee that no bad row slips through. The division of labor is one line:
The system enumerates the blockers → the agent diagnoses and ranks them → the operator approves → the deterministic path posts.
The blockers¶
Before any of them, one gate: the warehouse must be keeping stock at all. Until its opening count posts (§4), it has no accounting periods, so the close — like any ordinary count — is refused outright.
Warehouse and row-level problems, computed before any snapshot is written:
- No qualifying count — the warehouse has no posted, non-superseded full count dated on or after the period's last day (§3). A cycle count is not enough: completeness is a claim about one moment, and the closing snapshot must rest on a full picture.
- An unreconciled variance row — an item whose gap between the qualifying count and the book, recomputed live, is non-zero and not yet accepted. This is the working list the closer burns down: each journal fix melts a delta, each posted difference settles one, and a journal posted after differences were posted simply reopens the row for its increment. The close refuses while any row remains open. An implement counted above its book is the one row acceptance cannot settle — there is no overage to post for it (§2) — so it stays open until a document explains the units, which is exactly the missing paperwork the surplus was evidence of. Two documents can: the transfer that carried the pans from wherever the book still holds them, or the receipt that bought them.
This one is judged per storage location, not on the warehouse total, and the reason is the whole point of counting one storage location at a time. Pans found at the bar and pans missing from the store net to nothing at the warehouse grain, and a total that reads zero would close the period over both facts at once — units sitting somewhere the book does not put them, and units gone from where it does. Each storage location answers for what it holds. 3. An item the count never saw — an item the book says the warehouse holds (or shows negative, the sharper hint that a receipt or transfer is missing) with no row on the qualifying count. Mostly this cannot happen — posting a full count demands a row, zero included, for every item with a pool — but a journal fix during reconciliation can surface an item the count predates (a backdated receipt for a never-counted item), and the close must refuse rather than close over it. 4. An unconfirmed serial — a fixed asset on the warehouse's books that the qualifying count did not tick off. Assets are identified units carrying real book value, so "we couldn't find it" is not a footnote; it is either a mistake on the sheet or a loss the period owes. Exactly two answers clear it, and both are ordinary gestures: amend the count and tick the serial (it turned up), or dispose the asset (it is gone, and its remaining book value lands as a loss on disposal). An asset registered after the qualifying count's date is exempt — the walk could not have seen it, so it belongs to the next period's truth, the same courtesy the bridge rule of §3 extends to quantities. The full story is in Fixed assets §7.
Period-level problems, which block the whole close because the period's consumption cannot even be computed:
- No active recipe for a sold dish — a dish was sold during the period but has no active recipe effective on its sale date, so it cannot be exploded into ingredient consumption. Why this is a hard blocker: if a sold dish silently exploded to zero consumption, its ingredients would never deplete, theoretical usage would understate, and the variance would be quietly wrong. The close must refuse rather than publish a recipe-less zero.
- Unresolved sales line — a quarantined line is still held out of the ledger: an unmapped till or delivery-platform name, or a line whose posting failed. These are surfaced for resolution, never silently zeroed (see Sales & consumption). Until resolved — or their ticket reversed — they block the close.
- Draft documents dated inside the period — a goods receipt, transfer, wastage, stock count, or production run is still in draft while its business date falls inside the period. If posted later, it would try to change a closed period, so it must be posted, re-dated, or discarded before the close. A transfer counts on both sides: a draft dated inside the period blocks the sending warehouse's close and the receiving one's alike, because either book could still be changed by it. A production run is the sharpest case of the rule: a captured shift left unposted is real consumption the close would blend past, and it would surface a month later as unexplained shrinkage nobody can trace.
The close computes the full list of problems first and stops if any exist. Only a clean enumeration proceeds to write the period snapshot.
The three roles, and why they're split this way¶
- The system enumerates (deterministic). It computes the reconciliation for all warehouses and runs the warehouse and row checks, producing the complete set of blockers plus the count of period-level problems. This is the coverage guarantee: the list of what blocks the close is computed, never guessed.
- The agent diagnoses and ranks (advisory). When there are blocked rows but no period-level problems, the agent — Dough — explains and prioritizes them: "these three rows probably point to one missing transfer; fix that first." It produces an explanation, never a posting. If the period itself can't be computed (a recipe-less dish, an unresolved sales or production line, or a draft document), there is nothing to rank, so the agent stays out of it.
- The operator approves; the deterministic path posts. The reconciliation proposes the exact corrections (over-receipt adjustment / overage / shortage); posting differences is the approval made explicit — the closer accepts a row or a set of rows, exactly that residual posts, and the close then re-verifies a clean enumeration and writes the snapshot. The agent's diagnosis is input to the operator's decision — never the decision, and never the write.
This is the same discipline the whole product follows: the deterministic engine owns correctness and completeness, the agent owns explanation and ranking, and the human owns approval. Numbers that affect the books are never narrated into existence by an agent.
8. Immutability — corrections are movements, never edits¶
The close never rewrites history. A posted movement is permanent; a mistake is fixed by posting an opposite movement, and an adjustment is a new movement against stock-loss — never an edit of a past one. This follows from the way posted documents work (see Stock ledger). Two consequences for the close:
- Overages and shortages are postings, not patches. Every correction in §4 adds a movement; the trail keeps both the original picture and its correction, so an auditor can see exactly what happened and when.
- A sealed correction is final. While the period is open, a posted difference can be reversed — append-only, reopening the row. Once the close writes its snapshot, the corrections it rests on are part of the frozen closing balance and can no longer be reversed; anything discovered later flows forward into the next open period.
- Late sales into a closed period are not back-dated. A sale that arrives after its period has closed is not slipped back into the closed month — that would undo a finished reconciliation and silently restate an already-published margin. Instead it is recorded as a prior-period adjustment in the next open period, using today's average cost, not a retroactive repair of the closed average (see Sales & consumption and Costing & valuation).
9. Worked example — a period with a count shortage¶
One warehouse — the kitchen warehouse, the one that supplies the kitchen station — one item, flour, for the month of June. All quantities in kg (the base unit); money in the company currency (euros here).
Opening (rolled forward from May's close):
- opening qty = 200 kg, opening cost = €0.80/kg, so opening value = €160.00.
Movements posted during June:
| Flow | Movement | Qty (kg) |
|---|---|---|
| supplies (one receipt) | supplier → kitchen-warehouse |
+500 |
| transfers in | — | 0 |
| transfers out | — | 0 |
| sales (dishes, exploded to flour) | internal → customer |
−40 |
| internal use (staff meals, an eaten category) | internal → customer |
−3 |
| wastage (a spilled bin) | internal → scrap |
−5 |
The receipt's net value (its landed cost, after freight and non-recoverable tax — see Costing & valuation) is €424.00 for the 500 kg, so the receipts value = €424.00.
Step 1 — Projected (the book's claim). No adjustments yet (over-receipt adjustment = 0):
projected on-hand = opening + over-receipt adjustment + supplies + transfers in − transfers out
− sales − direct sales − internal use − wastage
= 200 + 0 + 500 + 0 − 0 − 40 − 0 − 3 − 5
= 652 kg
The book says 652 kg of flour should be on hand.
Step 2 — The count (the observation). On 30 June a staffer counts the bin and posts the count: 640 kg. Posting freezes the sighting — nothing has moved yet.
count = 640
variance = count − projected on-hand = 640 − 652 = −12 kg
The book is 12 kg short of reality — flour the system was never told about (over-portioning, uncounted spillage, trim, theft). Count wins.
Step 3 — Reconcile the row and post the difference. The variance is negative. The
closer checks the journals — no missing transfer, no unposted receipt — and accepts
the row, posting a shortage of 12 kg (an internal → stock-loss movement, dated
30 June):
shortage = 12
final qty = projected on-hand − shortage + overage = 652 − 12 + 0 = 640 kg ✓ equals the count
check = variance − overage + shortage = −12 − 0 + 12 = 0 ✓ row reconciled
The check is 0 and the final quantity is 640 — the book now agrees with what is actually there.
Step 4 — Price the period (Stage 1).
intra-period cost = (opening value + inbound value) / (opening qty + inbound qty)
= (160.00 + 424.00) / (200 + 500)
= 584.00 / 700
= €0.834286 / kg
Everything consumed in June is valued at €0.8343/kg.
Step 5 — The closing re-spread (Stage 2) — where the shortage lands in COGS.
closing cost = intra-period cost = €0.834286 / kg
closing value = final qty × closing cost = 640 × 0.834286 = €533.94
Now follow the money. The flour the book thought it held was worth
652 × 0.834286 = €543.95. The flour actually on hand is worth €533.94. The
difference — €10.01 — is the value of the 12 kg shortage (12 × 0.834286 = €10.01).
That €10.01 is not carried forward as an asset and not parked anywhere: it leaves
inventory as part of the period's cost of goods sold. That is how shrinkage lands in
COGS — the re-spread refuses to value flour that isn't there, and the lost value becomes
cost.
Step 6 — Self-check (money waterfall). Valuing each flow at the prices above (sales 40 kg, internal use 3 kg, wastage 5 kg, shortage 12 kg, all at €0.834286; closing €533.94):
160.00 (opening) + 424.00 (supplies) + 0 (over-receipt adjustment Δ) + 0 (transfers)
− 33.37 (sales) − 0 (direct sales) − 2.50 (internal use)
− 4.17 (wastage)
− 10.01 (shortage) + 0 (overage Δ) − 533.94 (closing)
= 0.01 → zeroed as rounding noise (< 0.1 tolerance)
The row ties out: opening value, plus what came in, minus everything that went out (including the shortage), equals the closing value. The close is balanced.
Step 7 — Roll forward. July opens with an opening qty of 640 kg and an opening cost of €0.834286/kg (the June closing cost). Value is conserved across the boundary; June's €10.01 of shrinkage has already become June's cost of goods and does not haunt July.
Step 8 — Restaurant attribution. The 40 kg of sales were internal → customer
movements, each stamped with the restaurant that sold the dish (the 3 kg of staff
meals — internal use under an eaten category — went to the customer side the same
way, because a person ate the food). The flour's
cost was computed once, at the kitchen warehouse (€0.8343/kg); the attribution of
40 × 0.834286 = €33.37 of flour cost rides on those movements into whichever
restaurant earned the sales. §10 explains why this is a re-slice, not a second valuation.
10. Restaurant P&L — a profit-center roll-up, not a second valuation¶
Profit-and-loss is computed at the restaurant grain, while valuation stays at the warehouse grain (see Scope & locations). A profit center is simply a part of the business whose profit you measure on its own — here, a restaurant. This separation is what lets one commissary feed two restaurants and still produce two correct P&Ls.
The rule:
A restaurant's P&L is a roll-up of the value of consumption movements stamped with that restaurant over the period — never a second place where stock is valued.
Mechanically, every consumption movement carries both a warehouse (whose cost pool it depletes, and therefore what it cost) and a restaurant (whose P&L it lands in). To produce a restaurant's cost of goods for a period, sum the money of the consumption movements stamped with that restaurant. There is no separate per-restaurant average cost; the cost was set once at the warehouse, and the restaurant only attributes it. The company roll-up is the aggregate over its restaurants (and, for the inventory balance sheet, over its warehouses) — never a separately valued grain.
This is why the close runs per warehouse but the P&L reads per restaurant. The warehouse close establishes what things cost and what is on hand; the P&L roll-up re-slices that already-costed consumption by who earned the sale. The two reports are computed from the same movements at two different grains, and neither double-counts the other. (The worked commissary example in Scope & locations shows two restaurants drawing the same dough cost into two independent P&Ls.)
See also¶
- Costing & valuation — the two-stage weighted-average math, landed cost, the net-vs-gross feed, and the edge behaviors the close consumes; the value side of everything above.
- Financial boundary — the conceptual accounts the close's results export to the operator's accounting system: cost of goods sold (food and packaging buckets), shrinkage within it, and the price-difference expense.
- Scope & locations — warehouse (valuation and close grain) vs restaurant (P&L grain), the many-to-many consumes-from relation, and which warehouse a depletion lands in.
- Sales & consumption — how sales become the consumption movements this row totals, the quarantine of unmapped dish names, and the late-sale rule.
- Stock ledger — the movement primitive every column is built from, and why postings are reversed, never edited.
- Recipes & production — production, the storage location a batch draws its inputs from, and the recipe correction that fixes wrong-recipe journals.
- Procurement — receipts and the invoice match feeding the supplies line; its own price tolerance, distinct from the close self-check.
- Item model & policies — which items appear on a count at all, and how each accounting treatment is counted and verified (expense-on-receipt items are excluded entirely; an implement surplus is recorded but corrected only by a priced receipt; a fixed asset is confirmed against the register, never added to it from a sheet).
- Fixed assets — the asset register the serial section confirms, the depreciation calendar the close never touches, and the transfer that moves a unit from one warehouse's books to another's.
- Units of measure — the convert-to-base rule every reconciliation quantity depends on.
- Glossary — the recipe, its active-from date (which the recipe-less blocker checks), warehouse, restaurant, item, and unit vocabulary.