Weighted average costing, and the day it disagrees with you
Moving-average cost is the friendliest of the costing methods right up until someone posts a receipt behind an issuance that has already been costed. At that point the stock card and the general ledger stop agreeing, and no amount of staring at the current balance explains why.
Why it happens
Weighted average is a running figure: each receipt re-weights the average, and each issuance takes the average as it stood at that moment. Insert a receipt into the middle of that sequence and every issuance after it was costed at a number that is now wrong.
The three honest options
- Refuse the backdate. Simplest, and genuinely correct if the period is closed — that is what a closed period means.
- Recost forward. Replay every movement after the insertion point and post the difference as a costing adjustment. This is what most mid-market ERPs do.
- Absorb it in the current period. Cheapest, and defensible when the variance is immaterial — but say so out loud in the design, because it means the stock card will never tie back exactly.
What is not an option is silently letting the numbers drift apart. A stock card that does not reconcile to inventory on the balance sheet is a finding, and it is always found at the worst possible time.
A check worth scheduling
-- Stock card value vs the inventory control account.
SELECT i.item_code,
SUM(sc.qty_in - sc.qty_out) AS qty_on_hand,
SUM(sc.value_in - sc.value_out) AS card_value
FROM stock_cards sc
JOIN items i ON i.id = sc.item_id
GROUP BY i.item_code
HAVING SUM(sc.qty_in - sc.qty_out) < 0;Negative quantity on hand is the cheapest early warning there is. If that query ever returns a row, the costing behind it is already wrong.