Reports
COGS
Cost of goods sold over a date range, alongside write-offs, transfers, and adjustments, at purchase and landed cost.
Updated 2026-09-03
The COGS & Write-offs report calculates cost of goods sold for a date range, plus write-offs from expiry, transfers out, and manual adjustments — each priced at cost so you can see the dollar impact of every kind of stock movement, not just sales.
What it shows
One row per batch with any qualifying activity in the date range, with columns Product Name, SKU, Batch Code, Expiry Date, Purchase Unit Cost, Landed Unit Cost, Units Sold, COGS, LCOGS, Write-offs, Write-offs (Landed), Transfers Out, Adjustments, Currency, Costed, Note, and Batch ID. Unit costs are printed at full precision, not rounded to cents, so Units Sold × Purchase Unit Cost reconciles exactly against COGS.
A footer totals TOTAL COGS, TOTAL LCOGS, TOTAL Write-offs, and TOTAL Write-offs (Landed) across every costed batch, and reports how many batches were costed versus excluded for lacking a cost.
What counts as sold
Only units that left a batch through an order count toward COGS. COGS is units sold × purchase unit cost; LCOGS (landed COGS) is the same units × landed unit cost. Expired stock is never counted as sold — it appears separately under Write-offs (at purchase cost) and Write-offs (Landed), priced at expired units × purchase or landed unit cost, so shrinkage from expiry is visible on its own line rather than buried in your cost of sales. Units moved out by transfer appear under Transfers Out, and manual quantity corrections appear under Adjustments — neither counts as sold either.
Returns
Units sold is net of returns: order outflows minus returns for the batch in the period. When returns in a period exceed orders, Units Sold and COGS go negative — an accounting-correct credit to cost of sales, not a bug — and the row's Note column reads Negative: returns exceeded orders in this period so it doesn't read as an error when you open the file.
As with Valuation, a batch with no cost recorded shows blank money columns rather than zeros, its Costed column reads no, and it's excluded from the totals footer — its exclusion is called out in a Uncosted batches excluded from totals line.