Expired stock is not just a warehouse problem — it is a bookkeeping event. The moment a batch goes out of date, an asset on your balance sheet has to become an expense on your P&L, and the entry needs three things: a quantity, a cost, and a date. This guide covers how the write-off works, why batch-level records make it defensible, how weighted average cost prices it, and why mixing write-offs into COGS quietly hides your waste problem.
What happens on the books when stock expires
While stock sits on the shelf, it lives on the balance sheet as an inventory asset. When it expires and you dispose of it, that value has not been sold — it has been lost — so the asset is reduced and an expense is recognized. That is the whole mechanism: inventory down, expense up. The hard part is not the concept; it is producing a defensible number. A write-off entry needs the quantity disposed of, the cost those units carried, and the date the loss happened. If any of the three is a guess, the entry is a guess.
Why batch-level records make write-offs defensible
A write-off that says “roughly 200 units, call it $800, sometime in Q3” invites questions from anyone reviewing the books. A write-off backed by batch records answers them before they are asked:
- The lot — which specific batch was disposed of, not just which SKU.
- Its receipt cost — what those exact units cost when they arrived, including landed costs.
- The disposal event — a dated ledger entry showing when the stock left, tied to the lot.
- The reason — expired, damaged, recalled — recorded at the time, not reconstructed later.
This is the same evidence chain an audit-ready batch ledger keeps for traceability. Costing simply reuses it: the record that proves which lot expired is also the record that proves what the loss was worth.
Weighted average cost for batch inventory
Batch sellers rarely pay one price forever. Suppose you receive 100 units at $4.00 and later 50 units at $4.60. Weighted average cost blends them: total cost $400 + $230 = $630, across 150 units, giving a WAC of $4.20. Every outflow — a sale, a transfer, an expired case — is then priced at $4.20, and the average updates whenever a new receipt lands at a different price. For inventory where individual units are interchangeable within a SKU but arrive in differently priced batches, WAC keeps the math honest without pretending you can trace a dollar to a single unit.
Valuation as of a date
Your month-end inventory figure is a position, not a running total: everything received up to that date, minus everything that flowed out by that date, priced. If the receipts carry costs and the outflows are dated, the closing valuation falls out mechanically — including for months already past. This is also where undated or uncosted records bite: a receipt with no cost either drops out of the valuation or gets valued at zero, and both quietly misstate your closing stock.
JURISDICTION MATTERS — ASK YOUR ACCOUNTANT
How and when you may deduct written-off inventory, what disposal documentation tax authorities expect, and whether a provision or a direct write-off is appropriate all vary by country and by your accounting standards. Treat this guide as the operational layer; have your accountant confirm the treatment.
Get these numbers from the ledger you already keep
TraceLot’s COGS and landed cost reports price every receipt, derive weighted average cost, and value stock as of any date — from the same batch ledger that runs your traceability.
See COGS & landed cost in TraceLotKeep COGS and write-off expense separate
The tempting shortcut is to let expired stock disappear into cost of goods sold — the totals still balance, after all. But mixing them hides the waste problem from the P&L: your gross margin looks worse and nobody can say why, because the cost of stock that expired unsold is dressed up as the cost of stock that earned revenue. Kept separate, the write-off line becomes a management signal — if it grows month over month, that is an ordering or rotation problem you can act on with expiry-risk forecasting and stricter FEFO allocation, not an accounting artifact.
| Event | Inventory account effect | Where the cost shows |
|---|---|---|
| Batch received (with landed costs) | Increases — units added at their receipt cost | Nowhere yet — it is an asset until it leaves |
| Unit sold | Decreases at WAC | Cost of goods sold, matched against the sale’s revenue |
| Batch expires and is disposed of | Decreases at WAC | Write-off / inventory loss expense — its own P&L line |
| Stock transferred between warehouses | Net zero — value moves location, not off the books | No expense; the transfer is tracked but not costed to P&L |
From batch ledger to journal entry
Everything above assumes records that most spreadsheets do not keep: per-receipt costs, dated outflows tagged by type, lot-level disposal events. That is precisely what TraceLot’s COGS & landed cost reports produce from the batch ledger — a valuation as of your closing date, and a period COGS report that splits sales, write-offs, and transfers into separate figures with unit costs shown. Your accountant gets numbers that reconcile; you get a P&L where the waste line tells the truth.
How is weighted average cost calculated for batch inventory?
Total cost of all receipts divided by total units received. For example, 100 units at $4.00 plus 50 units at $4.60 is $630 across 150 units — a weighted average cost of $4.20 per unit. The average updates each time a new receipt arrives at a different price.
Does expired inventory count as cost of goods sold?
It is better treated as a separate write-off or inventory loss expense. Both reduce profit, but folding expired stock into COGS distorts gross margin and hides the size of your waste problem. Confirm the exact treatment with your accountant, as rules vary by jurisdiction.
What records do I need to support an inventory write-off?
At minimum: the quantity disposed of, the cost those units carried (ideally their receipt cost or weighted average cost), the disposal date, and the reason. Batch-level records strengthen this by tying the write-off to a specific lot and its documented receipt.
How do I value inventory as of a past date, like month-end?
Take all receipts up to that date, subtract all outflows (sales, write-offs, transfers out) up to that date, and price the remaining units — typically at weighted average cost. This requires dated, costed records for every movement, which is what a priced batch ledger provides.
Never ship expired stock again.
TraceLot adds batch tracking, FEFO allocation, and audit-ready records to Veeqo and Shopify. First month free.