---
title: The stock ledger
summary: >
  Every stock movement writes one permanent line in a ledger: the product, the
  location, how many units, why, and who did it. The quantity you see on a
  product is the running total of those lines, not a figure anyone types in.
  Corrections are written as new lines rather than edits, so any number can be
  traced back to the event that produced it.
type: concept
group: store
step: 3
permission: null
prerequisites: []
related:
  - /help/store/what-each-location-type-can-do
  - /help/fulfil/when-stock-actually-moves
  - /help/receive/receive-a-delivery
last_updated: 2026-08-07
---

**A bank does not keep your balance in a box. It keeps every transaction, and
the balance is what they add up to.**

Ask why your bank balance is what it is, and the answer is a list: this went in,
that came out, on these dates. The balance is a convenience. The transactions
are the truth.

Stock in Mossery works the same way. The ledger is the list. Every quantity you
see anywhere in the app is those entries added up.

This page covers:

- [What the ledger records](#what-the-ledger-records)
- [The stock figure is a running total](#the-stock-figure-is-a-running-total)
- [Nothing is ever edited or deleted](#nothing-is-ever-edited-or-deleted)
- [The movements you will see](#the-movements-you-will-see)
- [Reading the history when a number looks wrong](#reading-the-history-when-a-number-looks-wrong)

## What the ledger records

One entry per movement. Never a batch, never a summary.

Each entry carries six things:

- **The product.** One product code, for example `SKU-001`.
- **The location.** Stock is never just "in the business" — it is at one place.
- **The change**, as a signed number. A delivery of 40 is `+40`. A fulfilled order for 3 is `−3`.
- **The movement type.** Received, order fulfilled, transfer out, write-off, and so on.
- **The reference.** The delivery, order, count or transfer that caused it, so you can click through to the paperwork.
- **Who and when.** A person and a timestamp.

That is enough to answer any question about a number without asking anybody.
The entry is not a note about what happened. It *is* what happened, in the only
place the app treats as authoritative.

## The stock figure is a running total

There are two numbers, and knowing which is which explains most of the app.

- **The ledger** is the full list of entries, from the opening count to this morning.
- **The stock level** is one running total per product, per location. It is what the products list, the storefront push and the stock matrix all read.

The level exists only because adding up years of entries on every page load
would be slow. It is a cached answer, and it is always derivable from the list
that produced it. If it were ever lost, it could be rebuilt entry by entry.

So the order of writing matters, and it is fixed: **the entry is written first,
then the total is updated, both in the same single step.** Never the total on
its own. A total written without an entry behind it is a number with no
explanation, and once you have one of those you can never fully trust any of
them again.

Two extra figures sit alongside the on-hand total at each location — units
**allocated** to orders that are not yet shipped, and units **on order** from
suppliers. Neither is stock you hold, so neither writes a ledger entry. They
change what you can promise, not what you own.

## Nothing is ever edited or deleted

A wrong entry is corrected by adding another one, exactly as a bank issues a
reversal rather than rewriting last month's statement.

Reverse a delivery that was recorded wrongly and the original entry stays
exactly where it was. A second, mirror-image entry appears next to it, labelled
as a reversal, with the reason you typed and your name on it. The total comes
back to where it should be, and the history now says what actually happened:
goods were booked in, and then that booking was undone on this date, by this
person, for this reason.

This is why the app will sometimes refuse a reversal. If the units have already
been sold or transferred away, undoing the original entry would drive that
location below zero and invent stock movement that never occurred. It is more
honest to write off or adjust the difference, and leave both real events on the
record.

The same principle rules out the shortcut everyone eventually asks for: there
is no screen anywhere that lets you simply type a new stock figure over the old
one. The closest thing is a count, and a count is itself an entry — it records
the difference it found, at a location, on a date, approved by someone.

## The movements you will see

Every entry has a type, and the type tells you which part of the business
caused it.

| Movement | Direction | Caused by |
| --- | --- | --- |
| Stock received | Up | A delivery recorded against a purchase order |
| Receiving reversed | Down | An admin undoing a delivery that was wrong |
| Order fulfilled | Down | An order shipped from a storefront |
| Opening count | Either | A physical count, including the first one you ever do |
| Adjustment | Either | An approved variance from a stock count |
| Transfer out / Transfer in | Down, then up | One move between two locations, two entries, same day |
| Assembly consumed / Assembly completed | Down, then up | Components turned into finished units |
| Components consumed / Produced | Down, then up | A production run |
| Consignment sent / Consignment returned | Down, then up | Material sent to an outside partner and what came back |
| Write-off | Down | Damaged, lost or expired |

A transfer is worth looking at closely, because it shows the model working. One
physical event — a box moving between two places — produces two entries, one
negative and one positive, at two different locations. Your company-wide total
is unchanged, which is correct, because nothing was created or destroyed. What
changed is where the stock can be sold from.

Negative totals are allowed, and are not always a fault. A product made to
order can legitimately sell before its stock is booked in. A persistent
negative at a location usually means an event was recorded against the wrong
place, and the ledger is where you find which one.

## Reading the history when a number looks wrong

Open the product, then open its movements.

You get one row per entry, newest first, filterable by movement type, location
and date. Read it from the top and stop at the first row that surprises you.
That row is the answer.

The useful question is never "what is the number". The number is not in dispute
— it is the sum of the rows in front of you. The question is always **which
event last changed it, and was that event real**. Three things are usually
enough to settle it:

- A movement you do not recognise, which points at paperwork you can open.
- A movement at a location you did not expect, which is usually a receiving or transfer booked to the wrong place.
- No movement at all since a date when you know something happened, which means the event was never recorded rather than recorded wrongly.

Because entries are never removed, this works just as well for something that
happened eight months ago as for something that happened this morning. That is
the entire point of keeping the list.

## Explore

**What each location type can do.** Every entry names a location, and the
location's type decides what that stock is allowed to do next.
[Learn more →](/help/store/what-each-location-type-can-do)

**When stock actually moves.** Only fulfilment writes a negative entry for a
sale — picking and packing write nothing at all.
[Learn more →](/help/fulfil/when-stock-actually-moves)

**Recording a delivery.** The most common way a positive entry gets written.
[Learn more →](/help/receive/receive-a-delivery)
