Catering Menu Planning: Scale Recipes and Shopping Lists With AI

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Catering Menu Planning: Scale Recipes and Shopping Lists With AI.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Catering Menu Planning: Scale Recipes and Shopping Lists With AI.

Give the AI each recipe as a weighed sheet with yield percentages, plus headcount as portions per dish. Ask it to multiply, convert prepared weight to as-bought weight, merge duplicate ingredients and round up to supplier pack sizes. Then recheck three lines by hand, because a chatbot can skip a step and will guess any missing yield or pack size.

The arithmetic is the easy part. What decides whether the order is right is whether your recipes are written in weights, whether the loss from peeling, trimming and cooking is recorded, and whether the AI has the pack sizes your suppliers really sell. Build those sheets once and every later event, from 40 guests to 400, starts from a new headcount instead of a blank page.

Follow me on Instagram@sagnikteaches

Why multiplying by 12.6 still gives the wrong order

The standard method is a conversion factor: the portions you need divided by the portions the recipe makes. A recipe for 10 portions scaled to 126 portions has a factor of 12.6, and every ingredient is multiplied by it. That works for the chicken and for the oil in the pan. It fails in four places, and each one costs either money or service time.

Connect on LinkedInSagnik Bhattacharya
  • Prepared weight is not bought weight. A recipe that needs 25.2 kg of peeled potato means buying 31.5 kg of potatoes once peeling losses are counted.
  • Seasoning and raising agents do not scale in a straight line. MarketMan's recipe-scaling guide says spices, seasonings and alcohol "don't scale well", and advises adding a little at a time and recording what you used. It also warns that doubling the baking soda in a bread dough will not work.
  • Suppliers sell packs, not exact weights. Nobody sells 22.8 kg of chicken thighs. You order five 5 kg bags.
  • Kitchens have fixed capacity. A bigger batch means more trays and more oven loads, not a bigger tray. The same guide makes this point about pans: bake in more than one pan rather than one oversized one.

The working order below deals with all four, and the sections that follow apply it step by step to one 120-guest menu.

Subscribe on YouTube@sagnikteaches
  1. Turn the headcount into portions per dish, with a buffer.
  2. Divide by each recipe's base yield to get a factor per dish.
  3. Multiply every prepared quantity by that factor, applying the scale rule on seasoning lines.
  4. Divide by the yield percentage to get the quantity to buy.
  5. Combine identical ingredients across dishes into single lines.
  6. Round up to supplier pack sizes and flag the surplus.
  7. Split the result into one order per supplier and delivery day.

An AI will carry out those steps down a long list in seconds. What it cannot do is supply the facts that feed them, so two sheets come first: a recipe sheet for each dish and a pack-size sheet for each supplier.

Build a recipe sheet the AI can multiply without guessing

One sheet per dish, one row per ingredient. Each sheet states the base yield (how many portions the recipe makes) and the portion size. Each row carries the prepared quantity, the yield percentage and a scale rule. This is the lemon-herb chicken thigh sheet from the 120-guest menu, written for a base batch of 10 portions at 200 g of trimmed raw thigh a portion. Every figure is illustrative; yours come from weighing.

IngredientPrepared quantityYieldAs boughtScale rule
Chicken thighs, boneless, skinless, trimmed2,000 g92%2,174 gLinear
Lemons, juice and zest4 each100%4 eachLinear (juice per lemon varies)
Garlic, peeled cloves40 g85%47 gLinear
Thyme leaves15 g60%25 gLinear
Olive oil120 ml100%120 mlLinear
Salt25 gn/a25 gTaste: start at 75%
Smoked paprika12 gn/a12 gTaste: start at 75%

Three habits make a sheet that an AI can combine reliably.

  • Weights and volumes only. A cup of flour and a cup of grated cheese weigh different amounts, and an AI that converts cups silently is guessing. Weigh once and write grams.
  • Identical ingredient names everywhere. If the chicken sheet says "Garlic, peeled cloves" and the curry sheet says "Garlic", the AI lists two lines and you round up twice.
  • The state of the ingredient in the name. "Onions, peeled and diced" and "onions, as bought" are different weights, and only one of them goes through a yield.

Keep the sheets in a spreadsheet with one tab per dish, so a person can edit them and you can paste a tab, or upload the file, into ChatGPT, Claude or Gemini. Allow a few hours for your first ten dishes. They are reused at every event after that.

A chef's voice note, turned into a sheet row

Most recipes do not begin as sheets. They live in a notebook, a head or a voice note. AI can convert them, but only if you forbid it from filling gaps with confident guesses. Ask it to flag every vague quantity instead.

Turn the notes below into a recipe sheet with these columns: ingredient, state (raw, peeled, cooked), quantity per batch in grams, millilitres or count, notes.
Do not estimate any quantity. If the notes give a vague amount (a glug, a handful, two big bags, to taste), write NEEDS WEIGHING in the quantity column and add it to a list of questions at the end. Only state how many portions the batch makes if the notes say so; otherwise ask.

Notes:
Roast potatoes. Big pan of spuds, peeled, say two big bags for a hundred or so. Glug of oil, handful of rosemary, salt to taste. Hot oven, a tray each side, till done.

Illustrative output:

| Ingredient | State  | Quantity       | Notes                                                    |
| Potatoes   | peeled | NEEDS WEIGHING | "two big bags": weight of a bag? peeled or as bought?    |
| Oil        |        | NEEDS WEIGHING | "glug": how many millilitres per tray?                   |
| Rosemary   |        | NEEDS WEIGHING | "handful": leaves or whole sprigs?                       |
| Salt       |        | NEEDS WEIGHING | "to taste": record the amount used at the next batch     |

Questions:
1. Does "a hundred or so" mean 100, 110 or 120 portions?
2. What does "a tray each side" mean: how many trays, what size, how much potato per tray?
3. What oven temperature, and for how long?

That reply is worth more than a tidy table of invented numbers, because it tells you what to weigh at the next batch. Cook the dish once with a scale and a measuring jug beside you, paste the numbers back, and the before and after look like this.

In the noteOn the sheet (per 10 portions)
Two big bags of spuds, peeledPotatoes, peeled and cut: 2,000 g
A glug of oilOil: 150 ml
A handful of rosemaryRosemary leaves: 10 g
Salt to tasteSalt: 20 g, taste rule (start at 75%)

Four rows is all it takes. The effort is the weighing, not the AI.

Measure your own yield factors in one afternoon

Published yield tables exist, but they average across suppliers, grades and cutting styles. Your own sample is better and quick to take. Weigh the ingredient as it arrives, prepare it exactly the way your recipe says (peeled, trimmed, stripped from the stalk), weigh the usable part, and divide the usable weight by the weight you bought. Do it across three deliveries, because seasons and suppliers vary.

These are three deliveries of maincrop potatoes, peeled and cut for roasting (illustrative figures).

DeliveryAs boughtPeeled and cutYield
110.0 kg8.0 kg80.0%
212.5 kg10.1 kg80.8%
312.5 kg9.9 kg79.2%
Average80.0%

The average is 80%, which goes on the sheet. If the three results are more than a few points apart, record the lowest, because buying a little too much costs less than running short on the day. Do the same for the ingredients that lose the most: herbs (a 100 g pack of thyme that gives 62, 58 and 60 g of leaves is a 60% yield), garlic, spinach, onions and trimmed meat. You can paste the weights into a chat and ask for each yield, the average, and any delivery more than three points away from the others. That is a sensible use of AI because the check is plain division.

Cooking loss is a second, separate yield. If 2.0 kg of raw thigh weighs 1.5 kg once cooked, the cooked yield is 75%. The chicken sheet above sidesteps it by stating the portion as trimmed raw weight. A sheet that specifies a 150 g cooked portion needs the cooked yield: 150 g divided by 0.75 is 200 g raw. Remeasure whenever you change supplier or the season turns.

The 120-guest menu: from headcount to portions

The menu is a private-party buffet for 120 guests. The client has confirmed 100 guests for the chicken and 20 for a vegan chickpea and spinach curry. Both mains come with roast potatoes and a green salad for everyone. The first job is to convert guests into portions per dish, with a buffer.

DishGuestsWith 5% bufferBase batchFactor
Lemon-herb chicken thighs10010510 portions10.5
Chickpea and spinach curry202110 portions2.1
Roast potatoes with rosemary12012610 portions12.6
Green salad with lemon dressing12012610 portions12.6

The buffer covers seconds, dropped portions and a headcount that is rarely exact on the day. Five per cent is a starting point, not a rule: use whatever you have found works for that kind of event, and keep it in a visible cell so the AI uses the same number every time. Apply it to the portions first, before any other step, so that pack rounding later works on the real need and is not padded a second time. The factor column is the only thing that changes when the headcount does.

Dietary counts and allergens: what goes in the prompt

Give the AI counts, not guests. "16 vegan, 4 nut allergy" is enough to size the dishes, and the names or health details of individual guests do not need to go into a chat at all. An AI also cannot know what is inside your branded stock, spice blend or sauce, so allergen information has to come from the supplier's specification sheet. Add an allergen column to the pack-size sheet, tell the AI to flag blanks instead of filling them, and treat anything it says about a dish's allergens as a draft to check against those sheets. The allergen matrix tutorial builds that cross-check from the recipes themselves.

The scaling prompt and the table it sends back

With the four sheets and the factors ready, one prompt carries all the rules, so you do not re-explain them at every event. Paste the sheets after it, or attach the spreadsheet.

You are scaling recipes for one catering event. Below are four recipe sheets (CSV): lemon-herb chicken thighs, chickpea and spinach curry, roast potatoes, green salad. Each sheet's base batch makes 10 portions.

Portions needed: chicken thighs 105, chickpea and spinach curry 21, roast potatoes 126, green salad 126.

Do these steps in order:
1. Factor per dish = portions needed / base portions.
2. Multiply every prepared quantity by the factor. Where the scale rule says Taste, show the straight multiple and a START amount at 75% of it.
3. As-bought quantity = prepared quantity / yield. Show the yield you used on every row.
4. Merge rows with identical ingredient names across dishes into one line and list the dishes it came from.
5. Do not round to packs yet.
6. If a row has no yield, unit or scale rule, list it under MISSING instead of guessing.

Use grams and millilitres. Show the working as columns: factor, prepared, yield, as bought. End with a list of every assumption you made.

[paste the four sheets here]

This is what came back for the chicken sheet in one illustrative run. The other three sheets arrive in the same layout.

IngredientFactorPreparedYieldAs bought
Chicken thighs, trimmed10.521,000 g92%22,826 g
Lemons, juice and zest10.542100%42
Garlic, peeled cloves10.5420 g85%420 g
Thyme leaves10.5157.5 g60%262.5 g
Olive oil10.51,260 ml100%1,260 ml
Salt10.5262.5 g straightn/aSTART 197 g
Smoked paprika10.5126 g straightn/aSTART 95 g

One line is wrong. The garlic row shows an 85% yield but an as-bought figure equal to the prepared weight, so the yield was displayed and never applied. The right figure is 420 divided by 0.85, which is 494 g. This is why the prompt insists on showing the working: a row where the yield is below 100% and the as-bought number has not moved is easy to spot by eye, and it is one of the more common slips down a long list.

The second thing to adjust is not an error. The salt and paprika start amounts are 75% of the straight multiple, which is deliberately cautious, because you can add salt on the day but cannot take it out. After the first big batch, write what you really used back into the sheet; the last section below covers how.

Seasoning, raising agents and trays do not follow the multiplier

The scale rule column exists because a handful of ingredient types break the straight multiple. This is the rule set I would put on the sheet, with the AI told to apply it.

ItemWhat goes wrongScale rule
Salt and strong spicesOver-season when multiplied straight; MarketMan says spices and seasonings "don't scale well"Start at about 75% of the straight multiple, taste, record the final amount
Raising agents: baking powder, bicarbonate, yeastSimply doubling can ruin a dough or spongeMake several batches at recipe size instead of one huge batch
Liquid in sauces, braises and soupsA larger pot usually loses a smaller share of its liquid to evaporationHold back about a fifth of the straight multiple and add if needed
Oil for roastingDepends on the surface of the trays, not the weight of the foodFixed millilitres per tray multiplied by the number of trays
Cooking timeDoes not multiply: more food means more trays and more oven loadsPlan by oven loads, not by batch size

The percentages in the right-hand column are cautious starting points of my own, not published constants. Test them on a trial batch before the event and write the result back to the sheet.

Trays are where scaled plans break most often. Say your potato pieces fill a tray at about 3 kg. Then 25.2 kg of prepared potato is nine trays, and if your oven takes six trays at a time that is two loads. The nine trays also give you a check on the oil: the sheet's 1,890 ml for 126 portions is 210 ml a tray, which you can compare with what a tray really takes. The chicken, at about 2 kg a tray, needs 21 kg divided by 2, so 11 trays and two more loads. Four loads at 45 minutes each is three hours of oven time before the curry is touched. Give the AI your real tray and oven capacities and it will do the sum. If you do not, it assumes some, and the assumption stays invisible unless you ask for the list of assumptions.

A realistic mistake: a plan scales the quantities correctly but keeps the cooking time and the single oven load from the 10-portion recipe. The ingredients arrive in the right amounts and the potatoes still come out 70 minutes late, because nobody counted trays. The fix is to add "trays needed" and "oven loads" to the output table and carry both into your timings; building the run sheet from the same brief covers that side.

Round up to pack sizes after combining, not before

The pack-size sheet is the second sheet the AI needs. For every as-bought ingredient it lists the supplier, the unit you can actually order, and whether the surplus keeps. This is part of one, again illustrative.

ItemSupplierOrder unitSurplus keeps?
Potatoes, maincropGreengrocer12.5 kg bagYes, for days
OnionsGreengrocer5 kg bagYes, for weeks
GarlicGreengrocer250 g netYes, for weeks
LemonsGreengrocerCarton of 30Yes, for days
Mixed leaves, washedGreengrocer500 g bagNo
Chicken thighs, bonelessButcher5 kg bagFreeze it
Chopped tomatoesDry goods2.5 kg tinYes, unopened

Never let the AI invent a pack size. Without the sheet it fills the gap with a typical pack, which may be true somewhere and is not your supplier's. If an ingredient has no entry, the prompt should make it say so.

Then combine first, round second. Take lemons. The chicken needs 42 and the salad dressing needs 12.6. Rounded separately against a carton of 30, that is two cartons for the chicken and one for the salad: 90 lemons for a need of about 55. Combined, the need is 54.6, which rounds up to 55, and two cartons (60) cover it. The same logic applies to garlic, olive oil, salt and every other ingredient that appears in more than one dish.

After rounding, the AI should show the spare quantity on each line and flag two cases.

  • A large spare quantity on something that does not keep. Spare mixed leaves are binned; spare onions are not. The keeps column tells the AI which lines matter.
  • A very small spare quantity on anything fresh. The yield behind the number is an estimate, so under 5% spare is inside the margin of error. One more pack is cheap insurance.

One order per supplier and delivery day

This is the consolidated result for the 120-guest menu. Need is the as-bought quantity after combining dishes, and the order is whole packs. If you want to compare what two suppliers would charge for the same list, comparing supplier prices and drafting orders picks up from here.

Supplier and deliveryItemNeedOrderSpare
Greengrocer, two days beforePotatoes31.5 kg3 × 12.5 kg6.0 kg
Greengrocer, two days beforeOnions1.43 kg1 × 5 kg3.57 kg
Greengrocer, two days beforeGarlic568 g3 × 250 g182 g
Greengrocer, two days beforeLemons552 × 305
Greengrocer, morning beforeMixed leaves, washed7.56 kg16 × 500 g440 g
Greengrocer, morning beforeCherry tomatoes3.86 kg8 × 500 g143 g
Greengrocer, morning beforeSpinach1.24 kg3 × 500 g265 g
Greengrocer, morning beforeThyme263 g3 × 100 g38 g
Greengrocer, morning beforeRosemary180 g2 × 100 g20 g
Butcher, morning beforeChicken thighs, boneless22.83 kg5 × 5 kg2.17 kg
Dry goods, collectChickpeas, tinned2,520 g drained1 case of 12 tins360 g drained
Dry goods, collectChopped tomatoes1.68 kg1 × 2.5 kg tin0.82 kg
Dry goods, collectCoconut milk1,680 ml1 case of 6 × 400 ml720 ml

Some lines deserve a second look. The cherry tomatoes have only 143 g spare, 3.7% of the need, so a ninth punnet is cheap insurance if the delivery looks poor. The onions leave 3.57 kg of a 5 kg bag spare, which is fine because they keep and every kitchen uses onions. The tinned tomatoes and coconut milk leave about a third of what you buy unused, but unopened tins keep, so that is stock, not waste. Potatoes leave 6 kg, which is simply what a 12.5 kg bag forces.

Five items are deliberately missing because they are store-cupboard stock rather than an order: olive oil (1.76 litres), vegetable oil (2.0 litres), salt (start amounts total 438 g), smoked paprika (95 g) and curry spice blend (63 g). The AI prints them as a check-your-stock list. The prepared column doubles as tomorrow's prep list: peel and cut 25.2 kg of potatoes, juice and zest 55 lemons.

Splitting by supplier and delivery day is the last step, and the one that depends most on how you work. Hardy items that keep for days arrive two days before; leaves, tomatoes and herbs arrive the morning before; the meat arrives the morning before too, because that is when this kitchen's cold store has room. Once the order is split, ask the AI to draft each supplier's message from its own rows only.

Subject: Order for [event date], delivery [day] before 10:00

Hello [first name],

Please deliver the following on [day], before 10:00:
- Mixed leaves, washed, 500 g bags: 16
- Cherry tomatoes, 500 g punnets: 8
- Spinach, 500 g bags: 3
- Thyme, 100 g packs: 3
- Rosemary, 100 g packs: 2

Please confirm availability, and call me before substituting anything. If any line is short, tell me by [time] so I can change the menu or source it elsewhere.

Thanks,
[your name]

Three checks before the order goes out

None of these takes more than a few minutes, and between them they catch most arithmetic slips.

  1. Recompute your heaviest line by hand. Chicken: 105 portions at 200 g is 21.0 kg trimmed, divided by 0.92 is 22.8 kg to buy, and five 5 kg bags is 25 kg. It matches the table.
  2. Divide the order by the portions and compare with a similar past event. Potatoes: 37.5 kg divided by 126 portions is about 298 g a portion bought, against 250 g on the sheet. The 48 g gap is the 19% round-up, so the number is believable. A figure of 150 g or 600 g would not be.
  3. Run it backwards. Can the order produce the portions? 25 kg of chicken at a 92% yield is 23 kg trimmed, and 23 kg divided by 0.2 kg is 115 portions, against 105 needed. Yes.

Once the numbers are right, stop asking the AI to do the arithmetic. Have it write the formulas into your sheet, so the next event recalculates itself and the AI is only needed when you add a new dish. With columns A to K holding item, dish, prepared quantity, yield, as bought, pack size, packs, order quantity, spare, keeps and flag, the core formulas for row 2 are below. If you want help writing them, the Google Sheets AI prompts tutorial has ready-made prompts for formulas.

E2: =C2/D2
G2: =ROUNDUP(E2/F2,0)
H2: =G2*F2
I2: =(H2-E2)/E2
K2: =IF(OR(I2<0.05,AND(J2="No",I2>0.25)),"CHECK","")

Column I is the spare quantity as a share of the need. The flag fires when it is under 5% on any line, or over 25% on a line whose surplus does not keep. Those are the two rules from the pack-size section, written once so nobody has to remember them.

When the client changes the headcount on Thursday

This is where the sheets pay for themselves. Suppose the client drops to 104 guests, 16 of them vegan. That is 88 for the chicken and 16 for the curry. With the same 5% buffer, the portions become 93 chicken, 17 curry and 110 for the sides. The prompt needs only the new numbers.

Headcount has changed. Same recipe sheets, same pack sizes, same 5% buffer.
New portions needed: chicken thighs 93, chickpea and spinach curry 17, roast potatoes 110, green salad 110.
Recalculate the full order, then show only (a) lines where the number of packs changed and (b) lines with under 5% spare. Show old and new side by side.

A 13% fall in headcount changes only four of the thirteen lines, because pack sizes absorb small differences.

LineBeforeAfterSpare after
Garlic3 × 250 g2 × 250 g2 g (0.5% of need)
Spinach3 × 500 g2 × 500 gNone
Mixed leaves16 × 500 g14 × 500 g400 g
Cherry tomatoes8 × 500 g7 × 500 g133 g (3.9% of need)

The same comparison shows the other side. Chicken stays at five bags, but the spare grows from 2.2 kg to 4.8 kg, and potatoes stay at three bags with 10 kg spare, so the tidy-looking drop saved almost nothing on the biggest lines. Three of the four changed lines now sit under the 5% flag. Garlic and spinach have no margin at all, so I would put a pack of each back rather than trust the yields; the cherry tomatoes are a closer call. That decision is yours. The AI only puts it in front of you.

Weigh what comes back and feed it into the sheet

After the event, record what was ordered, what was used and what came back. A short log is enough (illustrative figures).

ItemOrderedUsedLeftWhat to change
Potatoes37.5 kg31.8 kg5.7 kgNothing: forecast was 31.5 kg
Chicken thighs25.0 kg21.5 kg3.5 kgNothing yet: use was 94% of forecast
Mixed leaves8.0 kg5.3 kg2.7 kgCut the leaf portion from 60 g to 45 g

The leaves line is the useful one: 5.3 kg across 126 portions is about 42 g a portion, so a 60 g portion on the sheet was generous. Change a yield or a portion only after two events point the same way, because one data point can be a wet Tuesday lunch rather than a trend. Paste the log into a chat and ask for proposed changes, old and new values side by side, with a note against any row that has only one data point.

The salt gets the same treatment. The chicken started at 197 g and the cook finished at 230 g, which is 88% of the straight multiple of 262.5 g. Write "Taste: 88% at factor 10.5" on the sheet, and the next scale-up starts there instead of at 75%. After three or four events most of your taste rows hold real numbers, and the sheets stop needing rules of thumb. When the numbers are solid, move on to pricing them: the cost-per-person pricing sheet takes the same as-bought quantities and turns them into a price for the client.

Questions caterers ask before trusting AI with the order

Do I need a paid AI plan to scale recipes?

Not to start. Four recipe sheets and one prompt usually fit in a free chat, and the arithmetic is light. Paid individual plans list at about $20 a month (ChatGPT Plus, Claude Pro) and mainly raise usage limits and upload allowances. Free-tier limits change often, so test with a real menu first and upgrade only if you hit a cap.

Are my recipes safe to paste into a chatbot?

Recipes are your intellectual property, so check the plan first. Consumer ChatGPT and Claude plans let you switch off the use of your chats for model training in privacy settings, and business plans do not train on business content by default. Labels change, so look for the model-training switch yourself. Never paste guest names or medical details.

What if the headcount is still a range, say 100 to 130?

Agree a date for final numbers with the client and scale to the figure you hold on that date. Until then, plan to the lower number for fresh items you can top up and to the higher number for anything with a long lead time. Rerun the same sheets when the number firms up; the side-by-side difference shows exactly what changed.

How do I keep pack sizes current when a supplier changes them?

Treat the pack-size sheet as a living document with a review date. When a supplier sends a new price list, paste it next to your sheet and ask the AI to list every item whose pack, unit or availability changed, without editing anything. Update the sheet yourself, and recheck it before any large event, because one changed pack can move an order by a bag or a case.

Further reads

Sources: MarketMan's guide to scaling recipes (conversion factor, seasoning, raising agents and pan capacity); Anthropic and OpenAI plan pages for individual plan prices. Yield, pack-size and portion figures are illustrative; take yours from weighed samples and your own supplier lists.

Want your recipe sheets and orders set up properly?

On a 1:1 call we'll look at how you scale recipes and place orders today, pick the step where AI saves the most time, and set it up so your team can run it.

Book a 1:1 call with me