Skip to content

Importing ingredients

The ingredients import turns a stock spreadsheet into ingredient records in one pass. It is usually the first import you run. The upload, mapping and per-row checks work the same for every import kind; see CSV imports for that flow.

Field Required What goes in it
Name Yes The ingredient’s name, e.g. “Habanero, fresh”
Unit Yes The unit it is measured in: g, kg, ml, L, units
Density No Grams per milliliter, for volume-to-mass conversions
Piece weight No What one piece weighs, for an ingredient counted in units: 60 for an egg
Piece weight unit No g or ml. Grams when blank
Smallest amount you can use No For a counted ingredient: 1 for a whole piece, 2 for halves, 4 for quarters. Blank means any amount
Category No The name of one of your categories
Opening stock No Quantity on hand, in the ingredient’s own unit
Unit cost No What one unit costs, used to seed the average cost

Common header names map on their own, accents included: “uom” and “Unité” both find Unit, “famille” finds Category. Anything else you match by hand under Column mapping.

With ingredient variants on your plan, the same file carries an ingredient’s variants and what they are made from (one ingredient, several variants). The ingredients export writes these eleven columns in this order, so a file exported from one workspace comes back into another as the same groups and links.

Field What goes in it
variant_of The ingredient this row is a variant of: “Cherries” on the row named “Cherries · Pitted”
variant The variant’s label: “Pitted”. Blank on the ingredient’s own row
made_from The label of the variant this one is made from. Blank means the ingredient itself
gives_per_100 Grams of this variant that 100 g of the source gives: 88
gives_low, gives_high The range a lot falls in, both or neither: 85 and 92
operation What the making is called: “Pitting”
setup_minutes Minutes to set up, whatever the quantity
minutes_per_unit Minutes per unit of the source: 0.008 per gram is 8 minutes per kilo
interchangeable yes or no: whether a batch may take this variant when a sibling is short
sourcing bought or made: which price and which first move a batch reads

Name is still the full name, “Cherries · Pitted”. A row with a label joins the ingredient variant_of names, wherever that ingredient is: already in your inventory, earlier in the file, or later in it. A variant_of nothing is called yet creates that plain ingredient first, in the row’s unit and category, and the row joins it. The link is written last, once every variant of the ingredient is in, so made_from can name a sibling further down the file.

A label without variant_of, a yield that is not a number above zero, or a sourcing word other than bought or made holds the row back. What cannot be settled after the ingredient is created (a label already taken, a source that names no variant, a range that does not sit around its figure) does not: the ingredient imports, and the row says what was left for you to finish on its page.

Without ingredient variants on your plan, the eleven columns are read past. Each row that carried one imports as a plain ingredient and says so.

The category cell is matched by name against your categories, whatever the case. A name with no category yet is created with the import, and every later row that names it lands in the same one. The preview marks each row whose category is new. Creating categories takes the right to manage them: for someone without it, the row imports uncategorized and says so.

Compliance details (allergens, INCI fields, shelf life) and category custom fields are not import columns. Fill them in on each ingredient’s card afterwards, or let AI enrichment suggest the compliance values.

Tick Also set opening stock and the quantity column is posted as each new ingredient’s opening balance, in its own unit. Provide a unit cost too and it seeds the weighted average cost, so recipes cost correctly from day one. A hot-sauce row might read: name “Habanero, fresh”, unit kg, category “Chilis”, opening stock 12, unit cost 8.40.

Opening stock only posts for ingredients the import creates, and reads as Opening stock in each one’s stock history. Re-running the same file never double-counts stock.

Stock you hold in several lots, with their codes, best-before dates or places, comes in better through the opening stock import: one row per lot, once the ingredients exist. Leave Also set opening stock unticked here if you plan to use it.

Ingredient names are unique, so a row naming an ingredient already in your inventory never creates a second one. It can update the one you have instead. Open Fix on the row to see what it would change, the current value beside the file’s, and tick what to take: category, density, piece weight, or the smallest amount you can use. Everything you leave unticked stays as it is, and so does a value the file leaves blank. With a long file, the button above the rows, Mark 12 existing ingredients to update (with your own count), ticks every change on every such row at once.

A row that changes nothing on its ingredient is skipped and says so. A file never changes an ingredient’s name or unit, and never posts opening stock onto one you already have: change the unit on the ingredient’s card, where its stock is restated with it.

Rows that repeat inside the file are flagged as duplicates, so a messy export cannot import the same line twice.