Now in open beta — close the books in 2 days, not 2 weeks.Read the case study →
Retail & POS · March 19, 2026 · 10 min read

POS COGS calculation: WAC vs FIFO explained

Your accountant says your gross margin is 38%. Your gut says it is closer to 32%. One of you is wrong, and odds are it is the accountant — because the COGS your POS posts is probably wrong by 4-6 percentage points. Cost-of-goods-sold is the most under-audited number in retail.

WAC vs FIFO in plain terms.

Weighted-average cost (WAC) treats every unit of a SKU as having the same average cost, recalculated every time you receive new stock. FIFO assumes you sell the oldest unit first and tracks costs per batch. LIFO is allowed in the US under GAAP but disallowed under IFRS, so it is unavailable in most of the world.

For most retail, WAC is the right choice. It is simpler, it smooths out price volatility, and it works with multi-branch transfers without losing your mind. FIFO is more accurate during inflation but requires batch-level tracking, which most POS systems either do badly or do not support at all.

WACOne blended cost per SKURecalculates on every receiveEasy on multi-branch transfersSmooths inflation volatilityBest fit for general retailFIFOBatch-level cost lotsOldest unit sold firstMore accurate under inflationNeeds strict batch trackingRequired for perishables / pharma
WAC is the right default for retail; FIFO is the right answer for expiry-driven categories. Pick deliberately.

What WAC actually does on a purchase.

You have 100 units at $8 WAC (total inventory value $800). You buy 50 more at $8.50. New WAC = ((100 × 8) + (50 × 8.50)) / 150 = $8.17. The new units do not stay at $8.50, they blend with the old units to a single new average.

Every sale from now until the next purchase posts COGS at $8.17 per unit. The next purchase rolls the average again. As long as the system does this on every receive, your COGS is mathematically correct. As long as it does not, your COGS drifts.

Start100 × $8 = $800+ Receive50 × $8.50 = $425Re-blend(800 + 425) / 150 = $8.17Next saleCOGS posts at $8.17
Every receive triggers a re-blend. The new units do not stay at $8.50 — they merge to one new average for every subsequent sale.

The most common bug: stale WAC.

Cheap POS systems compute WAC on a schedule (nightly job) instead of on every receive. If you sell 30 units between the receive and the nightly job, those 30 sales post COGS at the old WAC of $8, not the new $8.17. Multiply by 5,000 SKUs and 30 days and you have a 1-3% margin error.

In Nonari, WAC is recomputed transactionally on every receive and every transfer. The COGS for any sale uses the WAC at the moment of sale, not at the end of the day. This is invisible when it works and a nightmare when it does not — most retailers never check.

Branch-level vs global WAC.

If your branches share a single inventory pool with central pricing, global WAC is fine. If branches buy independently or transfer between each other, you need per-branch WAC. The reason: a transfer at $8 from Manchester (branch WAC $8) to Birmingham (branch WAC $8.50) needs to land at $8 in Birmingham, not magically inherit Birmingham's higher average.

Per-branch WAC is more accurate but more complex. The correct architecture is master Product (one per organization) plus BranchInventory (one per branch per product) holding the per-branch quantity and WAC. Sales debit the branch inventory at the branch WAC.

Returns and the cost basis problem.

A unit comes back through a return six months after sale. The WAC has moved. What cost do you record on the return-to-inventory? Original cost ($8) or current WAC ($9.20)? Always original cost — that is what came out, that is what goes back.

Most cheap POS systems return at the current WAC, which is wrong. The result: every return inflates inventory value (WAC went up) and understates the cost of the next sale. Compounded over a year, this is a meaningful margin distortion. Audit your return logic specifically.

Damage, shrinkage, and write-offs.

Damaged inventory and theft (shrinkage) reduce inventory at WAC and post to a Shrinkage expense account. The journal entry: DR Shrinkage Expense at WAC, CR Inventory at WAC. Do not write off at retail price — that overstates the loss. The retail price is opportunity cost, not actual cost.

A 1-2% shrinkage rate is normal for retail. Anything over 3% is a process problem. Track shrinkage per branch and per category — categories like cosmetics and small electronics are notorious. Most retailers under-report shrinkage because they are afraid of what the number says about them.

  • Damage write-off: DR Shrinkage at WAC, CR Inventory
  • Theft write-off: same entry, often categorized as Loss Prevention
  • Expired stock: DR Expired Stock Expense at WAC, CR Inventory
  • Use a separate account per type — expired vs damaged vs theft

How to audit your COGS once a quarter.

Pick five SKUs at random — high-volume, mid-volume, slow-moving, multi-branch transferred, recently returned. For each, manually compute the WAC trajectory over the last 90 days using purchase records and sales records. Compare to what the POS posted as COGS on each sale.

If the POS matches your manual calculation within rounding, your system is healthy. If there is a 1%+ difference on any of the five, you have a systemic bug and your gross margin reports are unreliable. This audit takes a half-day per quarter and saves you from making decisions on bad numbers.

When FIFO is actually worth it.

FIFO is worth the complexity in two cases: high-value items where each unit's cost matters individually (jewelry, watches, premium electronics), and businesses with strict inventory aging rules (pharmaceuticals, certain food categories). Otherwise WAC is the right tradeoff.

If you are debating WAC vs FIFO for a fast-moving general retail SKU mix, just pick WAC. The implementation simplicity is worth the small accuracy gap. Spend the saved engineering effort on per-branch tracking, which actually does affect your reports.

Frequently asked

Common questions.

Can I switch from WAC to FIFO mid-year?

Technically yes, but most tax authorities require consistency in cost methodology unless you can justify the change. The IRS, HMRC, the CRA, and the ATO all expect a disclosed change in method, often requiring an amended return or a one-time adjustment. Talk to your accountant first. Most chain retailers stay on WAC permanently for this reason.

Why does my POS show different COGS than my accounting software?

Either the POS is exporting summaries to the accounting system without per-transaction detail, or your accountant is recomputing COGS with different assumptions. Pull a per-SKU COGS report from the POS and compare line by line with the accounting trial balance. The variance is always traceable.

How does WAC handle bundles and combos?

A bundled SKU has its own WAC computed from the WAC of its components. If the bundle is "shirt + tie", WAC of the bundle = WAC of the shirt + WAC of the tie at the moment of sale. When the bundle sells, components are deducted from inventory at their individual WACs.

Should the cost include freight and import duty?

Yes. The full landed cost is cost. Freight, import duty, customs clearance, and inspection fees are all part of the cost basis. Many retailers exclude freight and end up with overstated margins. Include everything that gets the product to your branch and your COGS will be honest.

Try nonari

Put your books on autopilot.

Free to start. No credit card. Bring your books, kick the tires, export everything if you decide to leave.