Skip to main content

How COGS works

When stock is sold and leaves, two things need recording: the revenue coming in, and the cost of what went out. The second is cost of goods sold.

Both belong in the same period. Revenue in one month and its cost in the next makes both months wrong, which is why COGS is booked from the movement rather than left for someone to work out later.

What the cost is​

The weighted average cost of the stock that moved, at the point it moved.

Because it is weighted average, it reflects what you actually paid across the receipts that made up that stock — not the latest price, and not a standard cost someone set once.

An entry per movement​

COGS follows stock movements, not orders. An order dispatched from two sites produces the cost of each part where it happened, which keeps site-level figures meaningful.

When the account is decided​

This is the part that surprises people.

A COGS entry is recorded when the stock moves, but the account it posts to is not always resolved at that moment. If the configuration it needs is not in place, the entry is kept as a subledger record and its account is resolved later.

The entry is never lost. It waits, in the same hold-don't-drop way as other entries that cannot yet be built, and surfaces in Issues until the configuration exists. See hold, don't drop.

Why it works that way​

Stock has to move when the warehouse says it moved. Blocking a dispatch because an account is unmapped would be the wrong trade — the goods have physically gone, and refusing to record that does not un-send them.

So the movement is recorded truthfully and the accounting catches up. The alternative — dropping the entry — is what the hold mechanism exists to prevent.

Seeing them​

COGS entries can be reviewed together, including any waiting on configuration. A steady number waiting usually means one account is unmapped rather than many separate problems. See review COGS postings.

Count variances are handled the same way — recorded as a subledger entry, resolved when the configuration allows, and surfaced in the same queue.