Returnable containers live in their own small ledger beside the stock one: what you are holding of each supplier's crates, what the deposits are worth, and which way the money points.
Why a crate is not an item
A crate is bought with the beer in it, handed back empty, and never consumed. Put it in the item master and three things go wrong at once: it enters valuation, where it would carry a weighted-average cost for something that is worth a deposit rather than a price; it enters the variance equation, as usage that never happens; and every movement of it needs an item id for something that is not an item.
Put it on the goods receipt as a column instead and you lose the visit that has no delivery, the driver who calls on a Tuesday and collects thirty empties.
So containers get the shape the stock ledger already proved: an append-only movement table with a balance derived from it, smaller, with a supplier instead of a shelf and a deposit instead of a cost. Nothing in it ever touches stock, valuation or the Variance report.
The catalogue, on the supplier
Containers are set up per supplier, from the supplier's own page, in the Returnable containers card. Managing them needs manage_suppliers.
Each container has a name ("EABL crate 25 x 500 ml", "50 L keg"), a deposit per container in KES, and deposit terms, which is the field that decides what every balance means afterwards:
- Prepaid: you paid a deposit on each container, and they owe it back when the container goes back.
- On account: no deposit was paid, and you owe them for every container you have not returned.
A container can also be shared, meaning no single distributor owns it. Shared containers can be used with any supplier, and their balances are still kept per supplier. They are edited from any supplier's page, and editing one there changes the row that appears on every other supplier's page, which the card says on screen because nothing else would tell you.
A deposit is not a price. It never reaches valuation and never becomes usage. What a container costs is money on loan, in one direction or the other, and the balance report is the thing that says which.
Crates on a delivery
A delivery of beer arrives in crates and the lorry leaves with the empties, and the delivery note lists both. The receive form, on the web and on the phone, gains a Crates and returnables section with a received and a returned box per container.
The section appears only when the supplier has containers in the catalogue. A crate question asked of somebody receiving tomatoes is a question they learn to skip, and then skip on the delivery where it mattered.
Each container posts two rows in the container ledger, +received and -returned, never one net row. Netting 10 in and 8 out to a single +2 would record the arithmetic and lose the exchange, and the exchange is what somebody reconciling against a distributor's crate statement is actually comparing. Both rows are shown on the goods receipt afterwards, under Crates and returnables, with their movement ids. Reversing a delivery reverses its container rows with it.
A collection with no delivery
For the Tuesday visit there is a document of its own: Empties returns under Procurement, and Record a collection on it (needs receive_goods). It takes the outlet, the supplier, the driver's name from the collection note, an optional photo, a note, and the lines: which container, how many went back. Quantities are typed positive, and the ledger carries the minus sign.
The driver's name is plain text and always will be. They work for the distributor, they will never have an account here, and that name is the only handle the venue has when the statement disagrees.
A collection can be reversed by anyone holding receive_goods, which posts opposing rows rather than deleting anything, exactly as a delivery reversal does.
On the phone the same thing is the Return Empties screen under More. The count exists once, in the yard, at the moment the lorry is loaded. Nobody reconstructs it at a desk afterwards, they guess at it, and a guessed figure is worse than no figure because it looks like a measurement.
The balance report
Container balances under Procurement (needs view_procurement) shows what you are holding, grouped by supplier: the container, how many are held, the deposit each, and a column headed Where the money stands.
That last column is a sentence, never a bare signed number, because the same positive figure means opposite things under the two terms:
| Terms | Held | What it says |
|---|---|---|
| Prepaid | positive | "The supplier owes us KES 4,500.00 on return." |
| Prepaid | negative | "We owe the supplier KES 900.00, more has gone back than was ever taken." |
| On account | positive | "We owe the supplier KES 4,500.00 for containers not returned." |
| On account | negative | "The supplier owes us KES 900.00, more has gone back than was ever taken." |
A zero balance is square either way and says so, rather than printing a nil amount beside a direction that would be a guess.
A negative balance is legal, and usually true. A venue that has been trading for years starts using this system holding crates nobody entered. The first time it hands thirty of them back the balance goes to minus thirty, and the supplier's own statement will show the same. Refusing to go negative would force somebody to invent an opening balance they do not know, which is a worse number than a negative one.
Click a row for the movements behind it, each with the document it came from. Export produces the file you put beside a distributor's crate statement: outlet, supplier, container, held, deposit, terms, amount, the direction in words, and the signed figure.
Counting the yard
Count containers on the balances page (needs receive_goods) takes an outlet, a supplier, a container and what you actually counted, and posts the difference with a reason, which is required: "A container count must say why the figure differs."
There is no approval ladder, and that is a deliberate difference from a stocktake. The number at risk is a deposit rather than the stock the business is sold on, and the real control is the supplier's own crate statement, which this report is built to be compared against.
A count that finds no difference posts nothing at all. There is no row to write, and writing a zero would fill the movement history with evidence that nothing happened.
Who can do what
| Grant | What it allows | Seeded to |
|---|---|---|
manage_suppliers | Add and edit containers in the catalogue | Procurement Officer, Admin |
receive_goods | Container lines on a delivery, record and reverse a collection, count containers | Storekeeper, Bar Manager, Outlet Manager, Admin |
view_procurement | Read the balances, the movements and the collection documents | Storekeeper, Bar Manager, Outlet Manager, Chef / Kitchen Lead, Finance / Accounts, Procurement Officer, Auditor, Admin |
Recording a collection is the same act at the same bay as booking a delivery in, with the lorry pointing the other way, which is why it is the same grant. Reading a balance is deliberately not a licence to move one. See Roles & Permissions.
FAQ
Our crates never show up in stock on hand. Is that a bug? No, it is the design. A crate is not stock: it is not consumed, it has a deposit rather than a cost, and putting it in the ledger would make it usage that never happens. Everything about containers lives on the balances page.
The distributor says we hold 240 crates and we say 232. That is the conversation this report exists for. Walk the yard, use Count containers, and post the difference with a reason ("six broken in the store, two never came back from the Friday delivery"). The movement history then shows exactly where the two records parted company.
We got a delivery and gave back empties in the same visit. Do I record two documents? No. Put both figures on the receive form, in the received and returned boxes of the crates section. The standalone collection document is only for the driver who came for empties alone.
A supplier's balance is negative. Have we broken something? Probably not. It usually means you handed back crates that were never entered into the system, which is what happens in the first months. Leave it if the supplier's statement agrees; count and post the difference with a reason if it does not.
Can I put the deposit on the supplier invoice instead? Not today. A deposit is not spend, and treating it as an invoice line would pollute purchases by supplier and the three-way match. It stays in the container ledger, where it is money on loan rather than money gone.