Skip to content

Recipes — how the kitchen turns ingredients into a costed output

A recipe is the kitchen’s contract with the system. It says: take these ingredients in these quantities, you’ll end up with this much of this thing, and it costs this much to make. Every dish the customer orders, every sauce the line plates from, every prep batch the morning shift makes — there’s a recipe behind it.

This page is for two readers. If you’re the owner, the section below “Why this page exists” is for you — start there. If you’re the head chef, jump to “What a recipe captures” and skim down.

Why this page exists

The owner reads numbers. The chef reads the kitchen. The recipe is the place where the two meet. When the chef edits the recipe — adjusts the ragù to one less onion, raises the pasta portion from 90g to 100g — the cost of that dish moves in the owner’s dashboard, the food-cost percentage on the menu shifts, the inventory the kitchen needs for tomorrow updates. One edit, four places reconcile automatically. Without recipes the kitchen runs on memory and the owner runs on guesswork.

The other reason recipes exist is sourcing. The same dish can have a 30% cost swing depending on which supplier the pancetta came from this week. Locking an ingredient to a specific supplier product inside the recipe means the cost rollup follows reality — not an average pretending to be reality.

The rule

A recipe always produces an inventory item. The dish you sell isn’t the recipe; the recipe is what makes the dish. Carbonara the menu item points to “Carbonara” the inventory item, which is produced by “Carbonara” the recipe. Three names, three rows, one chain — and that chain is what carries the cost from the pancetta to the receipt.

What a recipe captures

  • Name and category. Ragù di Vitello, in Sauces. Categories group recipes for sidebar filtering and reporting.
  • Yield — the quantity and the unit the recipe produces. 3.2 kg of ragù. 1 portion of cacio e pepe. See Recipe yield unit for the conversion rules.
  • Batched or à la minute? A toggle that’s the most important choice in the whole form.
    • Batched means the kitchen makes the output ahead of service, weighs it, stocks it. The output appears on the inventory list, the Prep board, and the daily prep checklist. Ragù, stock, dough, sauces, fillings — anything you make in advance and store.
    • À la minute means the recipe runs once per order. The output exists in the system (so the till knows what to deduct) but never sits on a shelf. Cacio e pepe, scaloppine, simple pastas plated to order.
  • Ingredients — each one is an inventory item plus a quantity in that item’s unit, plus an optional override for yield percentage (the fraction of the ingredient that ends up in the output — 60g of trim off a 1kg beef shoulder is a 94% yield) and an optional supplier lock that pins the ingredient to a specific supplier’s product for cost purposes.
  • CosttotalCost for the full yield, costPerUnit for one unit of yield. Both are recomputed every time the recipe is saved and every time an ingredient’s price changes. Never hand-typed.
  • Selling price — optional. When set, the recipe shows a margin percentage in the list. When the recipe powers a POS menu item, the till uses the recipe’s cost-per-unit to compute the dish’s food-cost percentage automatically.
  • Allergens, difficulty, prep time, cook time, steps with photos — soft fields for the line, the menu engine, and the AI. Allergens drive the customer-facing allergen badge. Steps drive the prep checklist instructions.

What happens behind the scenes

The first time you save a recipe, the system makes sure there’s an inventory item to represent its output. If you didn’t already pick one in the Output item field of the editor, it auto-creates one — same name as the recipe, in a default Kitchen production category, at L2 (sub-assembly) for batched recipes or L3 (finished dish) for à la minute. That output item from now on is the thing every other part of the system points at when it says “the ragù”: the menu, the POS, the prep batches, the stock count, the till receipt all hang off it.

Every save also recomputes the cost. The system walks the ingredient list, looks up each item’s current cost-per-unit, multiplies by the quantity and the yield factor, sums, divides by the yield, and writes back two numbers — on the recipe itself and on the output item. If next week the pomodoro supplier raises the price 30%, the next ingredient update cascades down: every recipe that uses pomodoro recomputes, every menu item using those recipes shows a fresh margin, and the dashboard reflects the new food cost — without anyone editing the recipes.

Worked example — Mezze Maniche Cacio e Pepe

Marco is opening dinner service. The cacio e pepe is on the menu at €18. He hasn’t built the recipe yet. He goes to /admin/recipes, taps + New Recipe, and types:

  • Name: Mezze Maniche Cacio e Pepe
  • Category: Pasta
  • Yield: 1, portion
  • Batched: off (it’s plated to order)
  • Ingredients: he picks them from the inventory:
    • Pasta Mezze Maniche No. 136 — 100 g
    • Pecorino Romano DOP — 40 g
    • Black Pepper, whole peppercorns — 2 g
  • Selling price: €18

While he types, the right sidebar updates live. Pasta: €0.50. Pecorino: €0.80. Pepper: €0.03. Total: €1.33 per portion. Margin against the €18 menu price: 92.6%.

He saves. Three things happen at once:

  1. A new inventory item Mezze Maniche Cacio e Pepe appears in the L3 Kitchen production category. It’s marked à la minute — so it doesn’t show on the inventory list under stock (no shelf life, no physical count), but it exists so the till can deduct it.
  2. The POS menu item already named Cacio e Pepe (which Marco set up last month) is now linkable to the recipe output. He goes to the POS menu, opens Cacio e Pepe, sets Linked inventory item = Mezze Maniche Cacio e Pepe. Now the till knows that selling one cacio e pepe deducts the recipe — which in turn deducts 100g pasta, 40g pecorino, 2g pepper from raw stock.
  3. The cost dashboard shows €1.33 cost / €18 sell on the cacio e pepe row. When the cheese supplier raises the pecorino price two months from now, this row updates itself.

If instead Marco had set Batched: on, the flow would change in one way: every morning the prep board would offer “Cacio e Pepe” as a recipe a prep cook could batch (1× = makes one portion of the mix). But cacio e pepe is the textbook à la minute dish, so batched off is right.