AI in Food Service: A Four-Week Menu Cycle With Costs and Allergens

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for AI in Food Service: A Four-Week Menu Cycle With Costs and Allergens.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for AI in Food Service: A Four-Week Menu Cycle With Costs and Allergens.

A canteen or caterer can give the AI the site's rules (covers, budget, equipment, diets) and ask for a 20-day cycle table. Cost each dish per cover in a spreadsheet from your supplier prices, and build the allergen matrix from supplier specification sheets. The AI drafts the menu and the sheet logic; prices and allergens come from your documents.

The allergen column is where this goes wrong. Asked cold, an AI will name the obvious allergens in a dish and miss the ones inside the stock cube, the spice paste or the gravy granules, and it can't see which product your supplier really delivers. So the matrix is built from specification sheets, a blank cell means "declared free on the spec", and anything unverified shows CHECK until a person has read the sheet.

Follow me on Instagram@sagnikteaches

The brief that turns a vague request into a usable cycle

A cycle menu is a fixed set of weeks that repeats, and the repeat is what makes it cheap to run: the same recipes, the same supplier orders, a kitchen that gets quicker each time round. The draft is only as good as the rules you give it. The illustrative site here is a staff canteen serving 140 lunches a day from Monday to Friday. Four weeks is 20 service days and 2,800 covers a cycle. Each day offers a hot meat or fish main, a vegetarian main, a side and a dessert or fruit. The contract sets a food-cost ceiling of $2.80 a cover, the kitchen has two combi ovens and one tilting pan, and the site is nut-free.

Connect on LinkedInSagnik Bhattacharya

Write those facts down as rules the AI can't misread:

Subscribe on YouTube@sagnikteaches
  • Protein rotation: chicken, beef, fish and pork once a week each, plus one other (lamb, turkey or egg).
  • A vegetarian main every day and a vegan option at least twice a week.
  • No main repeats within ten service days.
  • Equipment: no more than two oven dishes at one service and one tilting-pan dish a day.
  • The site's exclusions, stated as a hard rule: no nuts or nut-based products anywhere.

Paste your supplier list underneath (ingredient, pack size, price per kilo) so the AI only plans with products you can buy. One instruction matters more than the rest: tell it not to give prices or allergens. You will add both from your own sheets. It may still offer them, as the next section shows, but the instruction makes them easy to spot and ignore.

Draft a four-week cycle menu (20 service days, Monday to Friday) for a staff canteen serving 140 lunches a day.
Each day: one hot meat or fish main, one vegetarian main, one side or vegetable, one dessert or fruit option.
Rules: chicken, beef, fish and pork once a week each, plus one other main (lamb, turkey or egg).
A vegetarian main every day, with a vegan option at least twice a week. No main repeats within 10 service days.
At most two oven dishes at the same service and at most one tilting-pan dish a day.
The site is nut-free: no nuts or nut-based products anywhere in the menu.
Use only ingredients from the supplier list below. Do NOT give prices or allergens; I add those later from my own sheets.
Output a table with columns: week, day, hot main, vegetarian main, side, dessert, cooking method, equipment.

A first draft for week 1 and the three things to fix

This is the week-1 table an assistant produced from that brief (illustrative, trimmed to the columns that matter here).

DayHot mainVegetarian mainDessert
MonChicken and chickpea tagine with couscousSpinach and ricotta cannelloniFruit salad and yoghurt
TueBeef and vegetable stew with dumplingsSweet potato and black bean chilli with riceRice pudding
WedChicken katsu curry with riceMushroom and lentil shepherd's pieBaked apple with custard
ThuBaked salmon with lemon potatoesCauliflower and chickpea bakePecan and maple sponge
FriLamb keema with ricePaneer and pea curryBanana cake

It looks plausible, and a slow read finds three problems.

  1. Two chicken mains. The tagine on Monday and the katsu curry on Wednesday break the once-a-week rule. Swap Wednesday for pork meatballs in tomato sauce with pasta.
  2. A nut on a nut-free site. The pecan sponge on Thursday. Replace it with a fruit-based dessert. Later the specification sheets must confirm that nothing else on the menu carries nuts either.
  3. A price from memory. Despite the instruction, the AI added a cost note for the Thursday salmon: $1.54 a portion, from an assumed $11 a kilo. The supplier list says $15.80 a kilo, so a 140 g portion costs $2.21 for the fish alone. Ignore every price the AI offers.

Then run an audit. In a fresh chat, paste the full 20-day table with the rules and ask the AI to check each rule in turn and list every breach with the day and the dish. A second pass over a finished table tends to catch what a first pass over twelve rules at once misses, and it costs a minute. Repeat until the list is empty, then move on to the sums.

Costing a dish per cover: raw weights, trim loss and a hand check

Cost per cover is the weight of each ingredient that goes into one portion, multiplied by its price, with trim loss allowed for. Two details trip people up. Recipe weights should be the usable amounts that go in the pot, and the yield column then lifts the price to cover what you trim away, so an onion that is 90% usable costs more per usable kilo than its invoice price. And everything is costed raw, never from the cooked weight on the plate. The table works one dish through with invented prices.

IngredientGrams per coverPrice per kg as boughtYieldCost per cover
Chicken thigh, boneless and skinless130$7.20100%$0.936
Chickpeas, tinned, drained50$2.40100%$0.120
Onion45$1.1090%$0.055
Chopped tomatoes, tinned60$1.60100%$0.096
Spice paste12$11.00100%$0.132
Couscous, dry55$2.30100%$0.127
Rapeseed oil5$3.20100%$0.016
Chicken and chickpea tagine357$1.48

The spreadsheet does that arithmetic for every dish, from three small sheets. These formulas work in current versions of Excel and Google Sheets.

Ingredients sheet: A ingredient | B supplier code | C price per kg as bought | D yield (0.9 = 90%) | E usable price per kg
  E2:  =C2/D2

RecipeLines sheet: A dish | B ingredient | C grams per cover | D usable price per kg | E cost per cover
  D2:  =XLOOKUP(B2, Ingredients!A:A, Ingredients!E:E, "NO PRICE")
  E2:  =IF(ISNUMBER(D2), C2/1000*D2, "NO PRICE")

Dishes sheet: A dish | B cost per cover
  B2:  =IF(COUNTIFS(RecipeLines!A:A, A2, RecipeLines!E:E, "NO PRICE")>0, "INCOMPLETE", SUMIFS(RecipeLines!E:E, RecipeLines!A:A, A2))

The last formula earns its length. Without the INCOMPLETE test, a missing price is silently skipped by the sum and the dish looks cheaper than it is, which is exactly the error you would not notice until the invoices arrive. Ask the AI to write these for your own column layout, and to add a check column that lists any recipe line whose ingredient isn't in the price sheet. The sums stay in the sheet. Models slip on long arithmetic, as the tutorial on why AI is bad at maths explains, and a spreadsheet doesn't.

Two habits keep the numbers honest. Measure yields yourself for your ten costliest trimmed ingredients, weighing the raw item and then the usable part, and don't accept a typical figure from the AI; your knives and your supplier's product decide the real one. And cost three dishes by hand with a calculator, one meat, one vegetarian and one with a long ingredient list. If the sheet disagrees by more than a cent or two a cover, find the broken lookup before you trust the rest. The tutorial on building a recipe costing spreadsheet with ChatGPT goes deeper on the layout if you are starting from nothing.

Now scale up. Each day has two mains, so the cost per cover has to be blended by how many people pick each. The week-1 table below assumes 60% take the hot meat or fish main and 40% the vegetarian one. That split is a guess, so replace it with your own servery tally after the first cycle. The side and dessert come to $1.20 a cover every day in this example.

DayHot main (cost)Vegetarian main (cost)Blended mainSide and dessertPlate cost
MonChicken and chickpea tagine ($1.48)Spinach and ricotta cannelloni ($1.12)$1.34$1.20$2.54
TueBeef and vegetable stew ($1.95)Sweet potato and black bean chilli ($0.98)$1.56$1.20$2.76
WedPork meatballs with pasta ($1.35)Mushroom and lentil shepherd's pie ($1.05)$1.23$1.20$2.43
ThuBaked salmon, lemon potatoes ($2.49)Cauliflower and chickpea bake ($1.10)$1.93$1.20$3.13
FriLamb keema with rice ($2.20)Paneer and pea curry ($1.25)$1.82$1.20$3.02

Monday's blended main is 0.6 × $1.48 + 0.4 × $1.12 = $1.34, and the plate cost adds the $1.20 side and dessert. The week averages $2.78 a cover, which is under the $2.80 ceiling, but Thursday at $3.13 and Friday at $3.02 are over it. This contract applies the ceiling to the cycle average, not to each day, so one dear day is fine when cheaper days pay for it. Even so, Thursday's salmon is worth a second look. Baked pollock at $9.40 a kilo brings that dish to $1.60, Thursday to $2.60 and the week to $2.67. Ask the AI for three cheaper alternatives to the salmon from your supplier list, then cost each one in the sheet. The AI proposes and the sheet prices.

Roll the four weeks together and the cycle tells its own story. The week figures below come from the same sheet.

WeekDraft after rule fixes, average per coverAfter cost swaps, average per cover
1$2.78$2.67
2$2.91$2.76
3$2.84$2.74
4$2.95$2.80
Cycle average$2.87$2.74
Cost of 2,800 covers$8,036$7,679
Against the $7,840 ceiling$196 over$161 under

Left alone, the rule-corrected draft would have broken the contract by $196 a cycle, and you would have found out from the month-end invoices. A handful of sensible swaps turns that into $161 of headroom. The weakest assumption in the whole sheet is still the 60/40 split. If 75% had chosen the salmon on Thursday instead of 60%, that day's blended main would have risen from $1.93 to $2.14, about $29 more across 140 covers. One cycle of real tallies from the servery replaces the guess.

Rolling allergens up from supplier specs, not the AI's memory

Use the allergen list your own food rules require. Many frameworks name 14: cereals containing gluten, crustaceans, eggs, fish, peanuts, soybeans, milk, tree nuts, celery, mustard, sesame, sulphur dioxide and sulphites, lupin and molluscs. Others are shorter, and one major list has nine, so trim or extend the columns to match yours. The method is the same either way and it rests on one rule: an allergen flag enters the sheet only from the supplier's specification sheet for the exact product you buy.

Three sheets carry it. The first two you already have from costing.

  • Ingredients: one row per product you buy, with supplier code, price and yield, a "spec verified on" date, and one column per allergen holding Y (the spec says the product contains it) or N (the spec says it doesn't). A blank cell means nobody has answered yet.
  • RecipeLines: the same dish-and-ingredient lines used for costing, each pulling that ingredient's flags through a lookup.
  • Matrix: one row per dish and one column per allergen, showing Y, blank (declared free on every spec) or CHECK.

Anything that isn't exactly Y or N becomes CHECK, including a product that isn't in the Ingredients sheet at all, and a dish shows CHECK in an allergen column if any of its ingredients does. Missing data can never look like a free-from dish.

The AI's useful job is the typing between the PDF and the sheet. Attach the specification sheet and use a prompt that forbids outside knowledge and demands a quotation for every positive.

Read the attached supplier specification sheet and fill one row: product name, supplier code, then for each allergen below write
Y if the sheet says the product contains it, N if the sheet lists it as not present, UNCLEAR if the sheet does not say.
Quote the exact sentence from the sheet for every Y and every UNCLEAR. Use only the sheet. Do not use what such a product usually contains.
Allergens: cereals containing gluten, crustaceans, eggs, fish, peanuts, soybeans, milk, tree nuts, celery, mustard, sesame,
sulphur dioxide and sulphites, lupin, molluscs.
Finally list every "may contain" or "traces of" statement separately.

Here is an illustrative reply for the spice paste in the tagine.

Product: Tagine spice paste, 1 kg tub (code TP-140)
Celery: Y        "Contains: celery, mustard."
Mustard: Y       "Contains: celery, mustard."
Sesame: UNCLEAR  "May contain traces of sesame."
Cereals containing gluten, crustaceans, eggs, fish, peanuts, soybeans, milk, tree nuts,
sulphur dioxide and sulphites, lupin, molluscs: N
May contain: sesame

A person then reads the specification sheet beside that row. Every Y and every UNCLEAR is checked against its quotation, and until you trust the extraction, every N is checked too. Only then are the Y and N values typed into the Ingredients sheet. How you treat "may contain" statements is a policy decision for the kitchen and its food-safety adviser, and the tutorial on building an allergen matrix from recipes and verifying it goes into the cross-contact side. The AI saves the typing. It doesn't save the reading.

With every line verified, a dish rolls up by itself. This is the tagine again, with specification data invented for the illustration.

IngredientWhat the spec saysFlags entered
Chicken thighNo declared allergensNone
Chickpeas, tinnedNo declared allergensNone
OnionNo declared allergensNone
Chopped tomatoes, tinnedNo declared allergensNone
Spice paste (TP-140)Contains celery and mustard; may contain traces of sesameCelery Y, mustard Y; note: may contain sesame
Couscous, dryContains: wheat (cereals containing gluten)Cereals containing gluten Y
Rapeseed oilNo declared allergensNone
Dish resultRolled up from the seven lines aboveCelery, cereals containing gluten, mustard; may contain sesame; every other column blank, no CHECK

Set that beside what a cold question produces. Ask an assistant which allergens are in a chicken and chickpea tagine with couscous and a typical reply is "cereals containing gluten, from the couscous". That is correct and incomplete, because the assistant can't know the paste you buy carries celery and mustard. Only the sheet for that product knows. Illustrative again: the cold reply is typical, and the specification data are invented, so yours must come from your own sheets.

The lookups behind the matrix are short. Put the allergens in alphabetical order and celery comes first: column G on the Ingredients sheet (after the cost columns and the verification date in column F) and column F on RecipeLines. Every other allergen column copies across from it.

RecipeLines, celery column (F2), copy across for the other allergens:
  =IF(XLOOKUP($B2, Ingredients!$A:$A, Ingredients!G:G, "")="Y", "Y", IF(XLOOKUP($B2, Ingredients!$A:$A, Ingredients!G:G, "")="N", "N", "CHECK"))

Matrix, celery column (B2), copy across:
  =IF(COUNTIFS(RecipeLines!$A:$A, $A2, RecipeLines!F:F, "CHECK")>0, "CHECK", IF(COUNTIFS(RecipeLines!$A:$A, $A2, RecipeLines!F:F, "Y")>0, "Y", ""))

Some products deserve a second read before anything is typed: stock cubes and bouillons, curry and spice pastes, sauces and dressings, gravy granules, breadcrumbs, batters and pastry. Allergens commonly sit in them under names that don't look like allergens, so the spec for each is worth reading twice, and an ingredient that isn't named on the recipe at all (a "seasoning mix") needs its own line. Where the specification sheet is unclear, the answer is a phone call or an email to the supplier, never a guess.

The split between what the AI may do and what it may not is worth printing for the kitchen office.

JobThe AI mayThe AI may not
Capturing spec dataPropose a row from the PDF with a quoted sentence for every Y and UNCLEARPut anything into the sheet unchecked
Rolling upWrite and explain the formulasDeclare a dish free from anything
Finding gapsList ingredients with blank cells or no specFill a gap with what such a product usually contains
PrintingFormat the sheet into a clean tableRe-type the allergen cells
QuestionsDraft the staff briefingAnswer a diner's allergen question

When a supplier swaps a product, the matrix goes stale

A matrix is true on the day it is signed and drifts after that. The usual cause is a substitution: the product you ordered is out of stock, the driver brings a near match, and the delivery note carries a different description or code. If Tuesday's stock cubes are a different brand from the ones in your Ingredients sheet, the sheet is now wrong for every dish that uses them, and nothing on the menu says so.

Three habits close the gap.

  1. The cook who receives the delivery compares the code and description on the delivery note with the Ingredients sheet for the higher-risk products listed above. On any mismatch they clear that product's Y and N cells straight away, which turns every dish using it to CHECK until the new specification has been read.
  2. Once a week, paste the week's delivery or invoice lines next to the Ingredients list and ask the AI to list every line whose code or description isn't in the list or differs from the stored one. That is a matching job, which assistants usually do well, and the output is a short list to read.
  3. The new specification sheet is read and entered before the product is used. A dish that shows CHECK isn't served unlabelled, whatever the clock says.

An illustrative line from the weekly matching output:

Delivery note: "Vegetable bouillon powder 1 kg (substituted)", code VB-22. The Ingredients sheet holds VB-10 "Vegetable stock cubes". Different code and different description. Not matched.

Nothing in that line says the new product contains a new allergen, and the AI shouldn't say so either. It says the sheet can no longer be trusted for that ingredient, which is the whole job. The tutorial on spotting supplier specification changes that break labels covers the same discipline for a producer.

Printing the matrix: the AI formats, a person signs

Print the matrix from the sheet. The AI may format the table, but it must never retype it. A model that rewrites a table can quietly drop or change a cell, and the page will still look right. The guard is a count: for each allergen column, count the Y cells on the sheet and on the printed page. If any pair differs, nothing goes on the wall.

Each printed version carries a date, a version number and the name of the person who checked it against the sheet, usually the head chef or food-safety lead. Add the standing line your own rules require telling diners to ask a member of staff about allergens, and keep the signed copy in the same folder as the specification sheets it came from. When a dish changes mid-cycle, the cost and the allergen row are both re-run before the new dish is served, and the version number moves on.

Don't point a chatbot at this sheet to answer diners' questions. The tutorial on whether an AI chatbot should answer allergen questions explains why a wrong answer costs far more than a slow one.

From the cycle to the weekly order

Once the cycle exists, the order sheet is multiplication. For each ingredient in a week: covers, times the share choosing that dish, times the usable grams per cover, divided by the yield for anything you trim, rounded up to the supplier's pack, then grouped by supplier and order cut-off. Ask the AI to build that sheet structure from your cycle table, then check the five lines worth the most money by hand.

Monday of week 1 shows the sum. A hundred and forty covers at a 60% share is 84 hot-main portions, and 84 portions at 130 g of chicken is 10.92 kg. If the supplier sells 2.5 kg bags, 10.92 divided by 2.5 is 4.37, so you order five bags, 12.5 kg, and 1.58 kg is left over, about $11.38 at $7.20 a kilo. Surplus like that is where a planned leftover earns its place (the spare chicken going into Wednesday's soup), or where a different pack size is worth raising with the supplier. For onions the same sum runs on the as-bought weight: 45 g usable at a 90% yield means 50 g to buy per cover.

Add the practical limits the AI can't know unless you say so: delivery days (a Monday dish must be ordered before Thursday's cut-off), minimum order values, shelf life and freezer space. Put them in the prompt for the order sheet.

What to check after the first full cycle

After four weeks you have 20 days of real data to set against the sheet. Five checks tell you whether to trust it.

  • Plate weight against recipe weight. Weigh five portions of each of your three costliest dishes. If plates run 10% heavy, the sheet understates the cost by about the same amount.
  • Real uptake. Replace the 60/40 guess with the servery tally and re-run the cycle cost. Note which dishes sold out and which were left.
  • Waste per cover. Weigh what comes back for a week. The cheapest dish on paper is the one people eat.
  • Open CHECK flags. The count should fall to zero before the cycle repeats. A dish served with a CHECK showing is a process failure, not a rounding issue.
  • Mid-cycle changes. Count the unplanned swaps. Each should have a cost and an allergen re-run on record.

Then go round again: replace the weakest few dishes by uptake and waste, re-run the audit prompt, refresh prices from the latest invoices, and re-verify any specification that is older than your own policy allows before the cycle starts over.

Allergens are not the only dietary rule. If the site also feeds residents or patients who need texture-modified, diabetic or fortified menus, the cycle needs a wider rule set and a dietitian's sign-off. The tutorial on a care home four-week menu planner with dietary checks shows how that layer is built in.

A spreadsheet carries one site well. It strains when several sites share recipes, when specifications change weekly or when more than two people edit the same file. Dedicated recipe tools exist for that stage. Apicbase describes a menu-planning add-on for planning menu cycles with visibility of cost, stock and production, and Nutritics describes recipe management, meal planning and cost and margin setting on one platform, with allergen information published from the same recipes. Neither shows prices on its site, so you ask for a quote or a demo. Whatever you choose, put two questions to the vendor: how does supplier allergen data get in, and who is responsible for verifying it? Software only stores what somebody typed.

Questions caterers ask about AI menu cycles

Can I ask ChatGPT which allergens are in my recipes?

You can ask it where to look, but not what is true. It will list the obvious ingredients and miss the ones hiding in stock, pastes, sauces and spice mixes, and it can't see which product your supplier actually delivers. Allergen flags must come from the specification sheet for the exact product you buy, checked by a person.

How many weeks should a menu cycle run before it repeats?

Four weeks suits many staff canteens because it gives 20 service days of variety without an unmanageable recipe list. There is no rule. Choose the length from how many days a week people eat with you and how quickly they tire of dishes, then review uptake and waste after each cycle and replace the weakest few dishes before it repeats.

What if a supplier won't give me a specification sheet?

Treat the product as unverified. Mark it CHECK in every allergen column, keep it off any menu that lists allergens, and ask for the allergen statement in writing or switch to a product that comes with one. Never fill the gap from an AI's memory of what the product usually contains.

Do I need recipe software instead of a spreadsheet?

A spreadsheet is enough for one site with a modest recipe list. Dedicated tools such as Apicbase and Nutritics hold recipes, costs and allergens in one system, and neither publishes prices, so you ask for a quote. Whatever you use, ask who verifies the supplier allergen data, because software only stores what someone typed in.

Further reads

Sources: published allergen guidance naming 14 allergens in one framework and nine in another; Apicbase and Nutritics product pages (all checked October 2026). Prices, weights, specification data and menu figures in the examples are invented for illustration.

Want the menu cycle and allergen sheet running properly?

On a 1:1 call we'll look at how your menus, recipes and supplier specifications are kept today, pick the step worth automating first, and decide whether a spreadsheet or dedicated software suits your kitchen.

Book a 1:1 call with me