Skip to content

Importing deliveries

You have a season of delivery notes in a spreadsheet and want stock levels and costs to reflect them. The deliveries import posts each row as a real delivery, dated and costed. The shared upload-map-check flow is described in CSV imports.

Field Required What goes in it
Ingredient Yes Matched by name against your inventory; where your workspace buys products, a product line too
Kind No ingredient, packaging, supply or product. Blank lets the name decide
Quantity Yes How much arrived
Unit No The unit of the quantity, if not the ingredient’s own
Unit cost No Cost per unit, in the same unit the row uses
Date No The delivery date; blank means today
Lot code No The lot printed on the goods
Expiry date No Best-before or expiry date
Notes No Anything worth keeping, like a delivery note number
Currency No Read only to refuse a cost in another currency than your base one

Each committed row goes through the same stock ledger as a delivery you type on the ingredient’s card. Stock rises by the quantity; the cost folds into the weighted average cost. 20 kg of habaneros at 8.40 per kg behaves identically whether imported or entered by hand, and the movement shows up in the ingredient’s stock history like any other.

Quantities in another unit convert on the way in. A row of 25 lb with a cost per lb is restated in kg for an ingredient kept in kg: both the quantity and the per-unit cost, so the math stays right.

The cost is in your base currency. A file exported from purchase orders prints a foreign order’s cost in that order’s currency, so a row whose Currency names another one is flagged “Priced in another currency than your base currency. Convert the price, or clear the currency.” rather than booked at the wrong value.

Where your workspace buys products ready-made, a row can be the delivery of a product: one bought ready-made, or one a co-packer makes for you and a vendor quotes today. The first column then reads Ingredient or product. The row finds its product as in the offers import: by SKU, then by name, with Kind settling a name an ingredient and a product share. It is counted in the product’s own unit: jar, jars or nothing in Unit for a product counted in jars.

A committed row books a Delivery on the product: a lot the product page lists with its code and best-before, at your default place, costed at the row’s unit cost, or uncosted when the cell is blank. A blank best-before is worked out from the product’s shelf life when it has one. No purchase order and no vendor stand behind it; a delivery you want on an order goes through receiving, or Log delivery on the product page.

A product you make that no vendor quotes is flagged “You make this product and no vendor quotes it. Add its vendor price first.” A pack never arrives by delivery: “A pack is filled from other products. It cannot be bought.” Naming a product takes the right to manage products, as in the offers import.

The date column becomes the movement’s date, so backfilled history sorts correctly in the ledger. Write dates as 2026-07-16, or day-first as 16/07/2026; the import never assumes month-first. A date it cannot read flags the row instead of guessing.

Lot code and expiry date are carried onto the delivery, so imported stock keeps its traceability.

Two boundaries to know. The ingredient must already exist; unknown names are flagged and you map them to a record (import ingredients first if the list is long). And deliveries you receive against a purchase order inside BatchDash are posted for you when you receive the order; the import is for stock that arrives outside that flow, or arrived before you started.