Skip to content

Stock, deliveries and losses

You never type a stock level over the old one. Stock is a ledger: every delivery adds a signed entry, every loss subtracts one, and today’s level is the running total. That design is what lets BatchDash tell you what your stock is worth and prove where the number came from. The ledger’s running total is the on hand figure; what you can still promise from it is availability, shown right beside it.

An ingredient page with the movements ledger

On the ingredient page, click Log delivery:

  1. Enter the Quantity Received and the Date.
  2. Pick a Link to Vendor Offer if one matches. The offer’s pack price gives the delivery its cost.
  3. Add a Lot code and Expiry date if you track lots, and a note (“Invoice #123”).

A delivery without a cost still raises the level, but the ingredient then shows an “Uncosted stock” warning: that quantity cannot be valued. Deliveries created by receiving a purchase order carry the exact amount you paid, delivery fees included, so prefer them for real purchases. With more than one location, the dialog also asks which location the delivery went to, preset to your default.

A vendor who invoices in another currency changes two things. The price is typed in their currency, and the delivery is always recorded as a one-line purchase order booked at the reference rate for the delivery’s date, so its cost reaches your stock in your base currency. Stock only, no order is not offered for them. For a delivery dated today the dialog names the rate under the price; for another day it names the day, and the order shows the figure afterwards. A date with no rate on file on or before it is refused under the date: use a later one, or create the order and type its rate. A vendor name that is new to you gets a Currency field under it, and the price box follows what you pick.

The quantity carries a unit, so you can type what the invoice says rather than converting in your head: 4250 g of something you stock in kilos, or 25 lb of something you stock in grams.

With a purchase order to receive against, the paperwork reader is the faster way in: it takes the note or the invoice and proposes every line at once.

An ingredient stocked in Units / Pieces with a Piece weight (Ingredients you count covers that field) takes the invoice’s weight and then asks the only question that matters:

Quantity received 4.2 kg That is about 49.4 pieces. How many were there? [ 50 ]

The count is what goes into stock, onto the purchase line and onto the price snapshot: 50 lemons for the money you paid, so the price per piece follows what you actually got. The weight is not lost. It rides along on the price snapshot, which is why the offers section can still read “4.2 kg @ €13.44 · €3.200/kg · €0.269 / piece”. On an ingredient that comes in fixed pieces, the count box steps by the smallest amount you said it can be used in.

When the weight and the count disagree with your stored piece weight by more than 2%, one line appears with the arithmetic and a single action:

4.2 kg over 53 pieces is 79.245 g each. Your piece weight says 85 g. Update it

Pressing it writes the new piece weight through the ingredient itself. The delivery dialog stays open, the count you typed stays as typed, and the page behind it catches up. Nothing happens without the press: a crate of unusually small lemons should not quietly reprice every recipe that uses them. Under 2% the line does not appear at all, because being 1% out is not a question worth asking.

When your plan includes ingredient variants, a count you corrected past that 2% is also kept as a weighing of what one piece weighs, and the confirmation says “Recorded as a weighing.” If the piece weight follows your weighings, there is no button to press: the line says so, and saving moves the piece weight. The confirmation then gives the new figure.

Click Log loss / adjustment and keep the type on Loss / Waste / Spoilage. Enter the quantity, the date, and pick a Reason: Spoilage, Breakage, Expiry, Theft, Sampling, or Correction. Reasons cost two seconds to record and pay off later, when you want to know how much habanero went to mold versus the floor. With locations, the loss is recorded at a location, preset to your default.

The same dialog, with the type set to Manual Correction, records a signed correction: choose Subtract from stock or Add to stock, then the quantity. Use it when a physical count disagrees with the ledger and you want the ledger to match the shelf. For a whole shelf, run a stocktake instead: its commit books one Count variance adjustment per difference, and the row’s Source names the stocktake it came from.

The quickest correction is the pencil beside the stock figure at the top of the page: type what the shelf holds and confirm. Beside the number sits a Reason, preset to Correction, so the two-tap path stays two taps. Change it when you know better: a jar that broke is Breakage, stock that walked is Theft. That is the difference between real shrink and a bookkeeping fix, and it is the split the shrink figures are built on.

Count variance is not on any of those lists. Only a stocktake commit books it, so a variance figure always means a real count stood behind it.

On an ingredient with a Smallest amount you can use, every quantity you type here steps by it: a delivery, a loss, an adjustment, a stock level set by hand, a transfer, a stocktake count, and the amount you capture on a batch. Anything between two steps is refused with “Count this in whole pieces.” or “Count this in halves.”, and the inputs step by the amount you chose, so a phone opens on digits for something whole. Choosing does not rewrite a balance that is already between steps: the page says “Stock is 6.47, between two amounts you can use. Count it to correct the balance.” until a count resolves it.

The Stock movements table lists every entry with its Date, Type, signed Quantity, running Balance, Source, and By. The types are Delivery, Loss, Adjustment, Used in production (a run consumed it), and Made in-house (a run produced it). With ingredient variants, a transformation adds two more: Transformed on the variant it used and Made by transformation on the one it made, each carrying the transformation’s reference; clicking the reference opens the transformation. Each row’s balance is the previous balance plus its quantity, so when a number looks wrong, the ledger shows exactly which entry to blame. With locations, every row shows the place it happened at, and a transfer shows as two linked rows, out and in, with no cost figure.

By names the person whose action booked the row: a two-letter chip, and the full name with the time it was recorded on hover or tap. The name is kept as it was at that moment, so a row still reads after the person leaves your team. A row the system booked on its own, like a sale pulled in from a connected shop, shows Auto instead. Rows from before this existed show a dash and stay that way: BatchDash does not invent history it never recorded. The column is hidden on a phone.

You logged the delivery and forgot to write the lot code, or you read the expiry off the wrong line. The movement’s Correct action edits three things and only three: the lot code, the expiry date, and the note.

Quantity and cost are not on that list, and that is deliberate. They are what your stock level and your weighted average cost are built on, and both already have an honest path: revert the receipt and log it again. Letting them be typed over would turn a ledger into a document.

Every correction is kept and shown under the movement: what the field was, what it became, who changed it and when. A record you tidied stays visibly a record you tidied, which is the point of keeping one.

Adding a lot code after the fact is worth doing. It is what turns that delivery into something the trace can find.

The same Correct action sits on made stock too, on the product and made component pages. A hand-typed entry owns its paperwork: an opening balance’s lot code, expiry date and note can all be fixed, and fixing the lot code renames that batch everywhere it appears, the trace included. Rows a batch produced are different. The sealed batch record owns their lot and expiry, so the dialog shows those locked and points you at the run sheet. The note stays editable everywhere.

Level and cost move separately. Costed deliveries feed the weighted average cost: each arrival blends its price into the average. Losses, consumption, and adjustments change the level but leave the unit cost alone, which is why an ingredient can lose half its stock and keep the same WAC. Vendor offers never touch it either; see Vendor offers and price history for what offers are for.