On this page
For chefs, sous-chefs, store managers, managers and accountants. Screens: Recipes & costing in the sidebar → Recipes · Ingredients.
Recipes tell the kitchen how a dish is made and tell the business what it costs. A recipe links a menu item to ingredients (and other recipes), and JupitaPOS computes the batch cost, the portion cost and the gross margin against the selling price — and keeps them up to date when an ingredient price changes.
Who can do what
| Task | Permission | Default roles |
|---|---|---|
| See recipes and ingredients (no costs) | menu.view |
everyone who serves or manages |
| Create/edit ingredients, recipes, versions; activate versions | menu.recipes (sensitive) |
owner, director, general/branch/restaurant manager, chef, sous chef, store manager |
| See ingredient costs, recipe costs, margins, the cost API | menu.costs |
managers, chef, store manager, accountant, auditor |
Without menu.costs the screens still work but every cost column shows
“—”.
1. Ingredients
Recipes & costing → Ingredients → New ingredient.
| Field | Meaning |
|---|---|
| SKU, name, category | produce, meat, poultry, fish, dairy, bakery, dry, beverage, alcohol, packaging, cleaning, other |
| Stock / recipe unit | the unit recipes use (g, kg, ml, l, each…) |
| Cost per unit | what one stock unit costs you (UGX 4,500 per kg of flour). menu.costs needed to change it |
| Purchase unit + units per pack | how you buy it (a 25 kg bag) — same dimension as the stock unit |
| Trimming yield % | usable share after peeling, trimming, boning: 80 % beef means 1 kg bought gives 800 g usable |
| Allergens | carried into recipes and items |
| Track stock, active, notes | |
| Café role, standard dose | what the ingredient is to the café (coffee beans, milk, alternative milk, cup, lid…) and one serving — 18 g of beans a shot, entered in g / ml; the café yield report turns stock into cups with it (1 kg ÷ 18 g ≈ 55 cups) |
Changing a cost, a yield or the unit re-costs every active recipe using
the ingredient (and the recipes that use those as sub-recipes) in the
background (recipe-costing queue) and updates the linked menu items’ cost
and margin.
Ingredients used in recipes cannot be archived — remove them from the recipes first.
2. Recipes and sub-recipes
Recipes & costing → Recipes → New recipe.
- Recipe — makes a menu item (Beef burger). Link the item; its portion cost and margin are written onto the item when a version is activated.
- Sub-recipe — a batch used by other recipes (chapati dough, patty mix, g-nut sauce, pilau spice mix). Costed per yield unit.
Header: code, name, kind, menu item, yield (quantity + unit: 1 kg, 12 ea, 2 l), portions per batch, optional portion size and unit, prep and cooking time.
Every recipe has versions. Version 1 is created as a draft with the recipe; you add lines to the draft, then activate it. Activation:
- freezes the version (lines can no longer be edited),
- archives the previously active version,
- costs it and writes the portion cost and margin onto the menu item,
- is audited (
recipes.version_activated).
To change an active recipe, press New version: the active lines are copied into a new draft (only one draft at a time), you edit and activate. Older versions stay for history and comparison.
3. Lines
In a draft version, add Ingredient or Sub-recipe lines:
| Field | Meaning |
|---|---|
| Quantity + unit | the net quantity that ends up in the batch; units must match the ingredient’s dimension (g for a kg ingredient is fine — conversions are automatic) |
| Waste % | line-level waste on top of the ingredient’s trimming yield |
| Optional | garnish and extras that are not costed into the batch (shown separately) |
| Used for | every sale, in-house only, or take-away only — a take-away cup, lid and sleeve come out of stock only when the drink is taken away |
| Preparation | diced, sliced, blanched… (kitchen card) |
| Substitutions | alternative ingredient + quantity for when the main one is out (kitchen card and, later, purchasing) |
The version also carries prep loss % and cooking loss % (batch-level shrinkage), the method (one step per line; shown as a numbered list on the recipe card) and a change note.
4. How costing works
gross quantity = net quantity ÷ trimming yield ÷ (1 − line waste)
line cost = gross quantity (in the ingredient's unit) × cost per unit
sub-recipe cost = quantity × (sub-recipe batch cost ÷ its net yield)
batch cost = Σ line costs (optional lines excluded)
net yield = yield × (1 − prep loss) × (1 − cooking loss)
cost per yield unit = batch cost ÷ net yield
portion cost = batch cost ÷ portions
gross margin = (price − portion cost) ÷ price
food cost % = portion cost ÷ price
Worked example (demo data): patty mix — 1,000 g beef mince at UGX 28,000/kg with 80 % trimming yield → 1.25 kg gross → 35,000 per batch; 5 % prep loss → net yield 0.95 kg → 36,842/kg. A burger uses 125 g of it (4,605) + a bun (800) = 5,405 portion cost; sold at 25,000 → 78.4 % gross margin, 21.6 % food cost.
Sub-recipes are costed recursively (a sauce inside a stew inside a platter), with a depth limit against cycles. A sub-recipe without an active version costs 0 and is flagged “not costed” in the line picker.
Recipe page: Batch cost, Portion cost, Gross margin, Food
cost % cards; the active version’s table shows per line the net quantity,
gross quantity, unit cost and cost. GET /api/recipes/:uuid/cost (and
…/versions/:version/cost) returns the same breakdown for reports.
5. Variants, modifiers and combos
- A variant’s recipe factor scales the portion cost (large tilapia 1.4×) — used by order costing and stock deduction.
- A modifier option with an ingredient and quantity adds that ingredient’s cost when chosen.
- Combos are costed from their components’ recipes.
6. Everyday tasks
- New dish → create the ingredients you are missing → New recipe (link the item) → add lines → Save draft → Activate v1 → check the margin on the recipe page and the item list.
- Supplier price went up → edit the ingredient’s cost; recipes and margins update by themselves; review the Recipes list sorted by margin.
- Kitchen changed the method → New version → edit → Activate.
- Margin too low → change the price (
menu.pricing) or the recipe; the item list shows price, cost and margin side by side.
Quick answers
- Costs show “—” → you lack
menu.costs. - Cannot edit lines → the version is active or archived; create a new version.
- Cannot activate → the draft has no lines, or you have unsaved changes.
- Cannot archive a sub-recipe → other recipes use it.