Hotel Breakfast Food Waste: Predict Buffet Demand With AI

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Hotel Breakfast Food Waste: Predict Buffet Demand With AI.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Hotel Breakfast Food Waste: Predict Buffet Demand With AI.

Forecast tomorrow's breakfast covers by multiplying the rooms occupied tonight by the covers-per-occupied-room ratio for tomorrow's weekday, calculated from eight to twelve weeks of your own records, then adjust for groups and events. Prepare to that number, replenish by rules, weigh what is left, and let AI do the arithmetic and the logging.

Buffet waste comes from three places: food made and never taken (which a forecast can fix), food taken and not eaten (portion size and what is on offer), and food that spoils before use (ordering). A 2018 review of 42 hotels by Champions 12.3 called buffets one of the largest sources of food waste in hotels, and found the average hotel saved $7 for every $1 invested in reducing kitchen food waste. That is an average across the hotels it studied, not a promise for yours. Vendors such as Winnow and Leanpath sell AI-assisted tracking and quote savings on their own pages, and neither page shows a price. For a single buffet, a spreadsheet, a set of scales and an assistant for the arithmetic do the forecasting job.

Follow me on Instagram@sagnikteaches

Step 1: export eight weeks and build one ratio per weekday

Occupancy alone misleads. With the ratios below, 60 occupied rooms mean about 63 covers on a Tuesday and about 88 on a Saturday. What stays stable is the ratio between the two numbers: breakfast covers divided by rooms occupied the night before. The ratio folds guests per room and take-up into one number per weekday, and it can be built from two exports.

Connect on LinkedInSagnik Bhattacharya
  • From the property management system: date, rooms occupied that night, whether each room was on a rate with breakfast included, and a flag for group nights.
  • From the till or breakfast count: date and total covers, with non-resident covers shown separately if you take them.

Export counts and dates only. Guest names are not needed and should not go near an AI chat. Tag group nights and leave them out of the ratio, because a coach party distorts it; you will add groups back later as known numbers. Here are eight Tuesdays of breakfast, with the rooms occupied the night before (illustrative figures).

Subscribe on YouTube@sagnikteaches
WeekRooms occupied the night beforeBreakfast coversCovers per room
144471.07
252611.17
338360.95
449491.00
541451.10
650571.14
736330.92
847531.13

The ratio is total covers divided by total rooms, not the average of the weekly ratios, so busy nights count for more. Using weeks 1 to 4: 193 covers divided by 183 rooms gives 1.05. Repeat for every weekday. A finished ratio sheet looks like this (illustrative).

MonTueWedThuFriSatSun
0.961.051.081.101.141.461.38

The weekend numbers are higher because leisure rooms hold two guests and midweek business rooms usually hold one. An assistant can build the sheet from your two exports in a minute, but check its sums by hand for one weekday, and use a plain formula in the spreadsheet for the long run: total covers for that weekday divided by total rooms for that weekday. If you are new to uploading a spreadsheet to an assistant, this guide to using ChatGPT with Excel covers the mechanics.

Here is a CSV with columns date, weekday, rooms_occupied_night_before, breakfast_covers, group_night (yes/no). Ignore rows where group_night is yes. For each weekday, give total covers, total rooms and covers divided by rooms to two decimals. Then list any date where covers per room is below 0.7 or above 1.8, so I can check for data errors. Do not smooth, estimate or fill any value.

Step 2: test the ratio on weeks it has not seen

Never trust a forecast you have not tested. Build the ratio from the first four weeks, forecast weeks 5 to 8 with it, and compare with what really happened. Add a rival that costs nothing: the average of the previous four same-weekday figures, which is what many kitchens do in their heads.

WeekRoomsForecast (rooms x 1.05)ActualErrorFour-week averageError
5414345-248+3
6505357-448-9
7363833+547+14
8474953-446-7

Errors here are forecast minus actual. Ignoring the signs, the ratio method is out by 2, 4, 5 and 4 covers, an average of 3.75, which is 8% of the 47 covers a Tuesday averaged in those weeks. The four-week average is out by 3, 9, 14 and 7, an average of 8.25, or about 18%. The occupancy-driven forecast has less than half the error, and the gap would widen if your occupancy swings more than this.

The test also teaches something. The ratio under-forecast the two busiest weeks and over-forecast the quiet one, which suggests that fuller nights hold more guests per room. That is a hint to split the forecast by rate plan or guest type, as in the next step. As a working threshold, I would act on the forecast once its average error is under about a tenth of your covers over four test weeks, and keep a record of it forever. Your own threshold may differ; what matters is that you write it down before you look at the results.

Step 3: split the forecast when the errors line up with occupancy

Take a Saturday with 54 rooms occupied the night before. Your system shows 40 of them on a rate with breakfast included and 14 room-only. History says Saturday rooms hold 1.9 guests on average, that 88% of guests on included rates take breakfast, and that 22% of guests on room-only rates do. The till also shows six pre-booked non-resident tables (illustrative).

Part of the forecastRoomsGuests per roomTake-upCovers
Rate with breakfast included401.988%66.9
Room-only rate141.922%5.9
Non-resident bookings6.0
Forecast78.8, so 79

Compare the single-ratio version: 54 rooms times 1.46 gives 79 as well, so on a normal Saturday the simple method is enough. The split earns its keep on unusual nights. Change the mix and the gap shows: if the same 54 rooms were 30 on included rates and 24 room-only, perhaps because of an event, the split gives 50.2 + 10.0 + 6 = about 66 covers, against 79 from the single ratio, a gap of 13 covers of food nobody would eat.

Now add the known numbers the history cannot see. A Wednesday has 60 rooms occupied, but 12 of them are a coach party of 24 on packed breakfasts, leaving at 06:15. Take the group out before applying the ratio: (60 minus 12) times 1.08 is 51.84, so about 52 buffet covers, plus 24 packed breakfasts prepared separately. Applying the ratio to all 60 rooms would have said 65 covers and left the kitchen with a buffet for 13 people who left before it opened. The front desk or sales team owns group information, so agree who sends it to the kitchen and by what time the day before.

History also cannot know about a conference, a wedding party or a festival unless you tell it. Add an event tag to those dates in your data. After three or four tagged nights you can calculate an event ratio beside the normal one, perhaps 1.22 covers per room for a conference weekend against 1.05 for an ordinary Tuesday (illustrative). Until then, treat event nights as manual overrides: ask whoever took the booking when the guests are due at breakfast and whether anything is packed, and write the answer in the notes on the prep sheet. Skip weather and similar extras until the basic forecast is working; they are easy to add later and hard to justify before.

Step 4: turn covers into a prep sheet and replenishment rules

A cover forecast only reduces waste once it changes what is cooked and when. Two numbers per item do the work. Usage per cover is how much of the item is taken per guest: prepared minus left over, divided by covers, from your own log. The arrival curve is the share of guests who come in each half hour, from till timestamps or a week of tally marks by a member of staff. Here is an illustrative curve for a 06:30 to 10:00 weekday breakfast.

Half hour06:3007:0007:3008:0008:3009:0009:30
Share of covers12%24%28%18%10%6%2%
Of 52 covers612159531

The curve says 64% of guests have arrived by 08:00 and 92% by 09:00. That is why a fresh full tray of everything at 09:30 is a classic source of waste: after 09:00 the buffet serves about four guests in total, against trays built for thirty. Turn it into rules for 52 covers, using usage figures that are illustrative.

ItemUsage per coverDay total at 52 coversOpening loadRestock rule
Scrambled egg0.55 portions29 portions12 portionsBatches of 6 when the tray falls to a third; last batch at 08:45 (3 portions); cook to order after 09:15
Bacon1.2 rashers62 rashers25 rashersBatches of 12 until 08:30; nothing new after 09:00 unless asked
Pastries0.8 each4221Second tray at 07:30; final tray of 6 at 08:30
Fruit salad0.35 bowls18 bowls9 bowlsOne refill at 08:00; none after 09:00
Yoghurt pots0.5 each2615Top up to 8 at 08:00; to 4 at 09:00

Notice the principle: the opening load is roughly 40 to 60% of the day total, because the curve is front-loaded, and restocks shrink as the morning ends. Keep a reserve of about 10% of each item as raw or unopened stock that you cook or open only if the buffet runs short, so the forecast error is carried in the fridge and not on the display. The size follows from your test: an average miss of 8% on a forecast of 50 covers is about four covers either way, so a reserve of around 10% covers an ordinary miss without any cooked food standing behind it. If your test shows 15% error, look for what the ratio is missing before you pay for extra stock. Whatever your food-safety plan says about holding times and about food that has been on display applies without change; this method cuts waste by making less, not by reusing what has been out.

The same covers forecast also drives staffing. If you are building a rota around it, this tutorial on hotel staff scheduling with AI shows how breakfast hours fit with the front desk and housekeeping.

Step 5: a waste log that takes five minutes a day

At close, weigh or count what is left on the buffet, item by item, before anything is binned. Put it in a sheet with six columns: date, covers, item, prepared, left at close and a reason code (over-prepared, spoiled, never displayed). Prepared comes from the prep sheet, left at close from the scales. Keep plate waste out of this log; it measures overproduction, and mixing the two hides which one you are fixing. Three illustrative rows:

DateCoversItemPreparedLeft at closeReason
Tue49Scrambled egg3.4 kg0.6 kgOver-prepared after 09:00
Tue49Pastries409Opening tray too large
Tue49Fruit salad4.0 kg0.2 kgNone

To put a price on it, value the leftovers at your average purchase cost per kilogram. A baseline week of 336 covers with 41.2 kg left works out at 123 g per cover. At an average of $6.50 a kilogram that is $267.80, or 80 cents a cover. After four weeks of prepping to the forecast and following the rules, the week has 352 covers and 30.5 kg left: 87 g per cover, $198.25, 56 cents a cover. The saving is about 23 cents a cover. At 340 covers a week that is roughly $4,100 a year, on leftovers valued at cost and before any labour. These figures are invented to show the arithmetic; yours will be different, and the first weeks are usually the noisiest.

An assistant is useful for the weekly summary, as long as it only summarises.

Here are four weeks of my buffet waste log with columns date, covers, item, prepared, left_at_close, reason. For each item give leftover per cover (left divided by covers, summed over the weeks), and rank the items from highest to lowest. Say which reason code appears most for each of the top three items. Do not recommend new quantities; I will decide those.

The ranking is what you want. If scrambled egg and pastries account for most of the leftover per cover, those are the two rules to tighten this week. The decisions on quantities stay with the chef, who knows which dishes are quick to recook and which are not.

A prompt that writes tomorrow's prep sheet

Once the ratios, usage figures and curve exist, the daily job is a form to fill in. Give the assistant the inputs and forbid it from changing them.

Create tomorrow's breakfast prep sheet. Show your arithmetic.
Inputs:
- Weekday: Wednesday
- Rooms occupied tonight (on the books at 15:00): 60, of which 12 are a coach group on packed breakfasts (24 guests) leaving at 06:15
- Covers-per-room ratio for Wednesday: 1.08
- Usage per cover: scrambled egg 0.55 portions; bacon 1.2 rashers; pastries 0.8; fruit salad 0.35 bowls; yoghurt 0.5 pots
- Opening load as a share of the day total: egg 40%, bacon 40%, pastries 50%, fruit 50%, yoghurt 58%
Rules: buffet covers = (rooms minus group rooms) x ratio, rounded. List packed breakfasts separately. Hold a 10% reserve of each item as unopened or uncooked stock and show it separately. Do not change any number I gave you. If an input is missing, say so instead of guessing.

A run might return (illustrative) 52 buffet covers and 24 packed breakfasts; day totals of 29 egg portions, 62 rashers, 42 pastries, 18 fruit bowls and 26 yoghurt pots; opening loads of 12, 25, 21, 9 and 15; and reserves of 3, 6, 4, 2 and 3. Two slips turn up on early runs, and both start with a missing input. If you leave the group out of the prompt, the assistant applies the ratio to 60 rooms and gives 65 covers. If you leave out the arrival curve, it will invent one without saying so, which is why the last rule exists. Check the arithmetic against your own calculator for one item each morning until you trust it, then once a week.

The daily routine: ten minutes at three o'clock

Keep the prompt saved in a Project in your assistant, as both ChatGPT and Claude offer, so that its rules do not drift from one day to the next. Then the routine is short.

  1. Pull tomorrow's numbers: rooms expected tonight, how many are on rates with breakfast included, group notes and any event tag. This takes about two minutes.
  2. Paste them into the saved prompt and ask for the prep sheet. Two minutes.
  3. Check the arithmetic for one item, and compare the covers figure with the same weekday last week. If they differ by more than a fifth, ask why before printing. Three minutes.
  4. Print the sheet for the kitchen and send the packed-breakfast count to whoever prepares it. One minute.
  5. At close, whoever finishes the breakfast shift weighs the leftovers and fills in the log. Five minutes, outside the ten.

Tonight's figure at three o'clock is not final. Late bookings, walk-ins and no-shows move it, and that drift adds to the forecast's own error. If the night-audit count differs from the 15:00 figure by more than about five rooms, the breakfast chef rescales the opening loads at the start of the shift using the same ratio; restocks already follow what guests actually take.

If your systems will not export, a printed in-house report each morning and a clicker count at the buffet door for four weeks gives you the same two columns by hand. Type them into the sheet on a Friday and build the ratios from there.

Four weekly numbers that show the forecast is working

Track four numbers each week in the same sheet: average forecast error in covers, the signed average (a positive figure means you over-forecast), leftover grams per cover, and the number of times an item ran out before 09:30. The last one is the check on the others. If waste falls and run-outs stay near zero, the rules are working. If both fall, you may be cutting too deep, and guests will notice before your waste figures do.

Review on the same day each month and change one thing at a time: the ratio for the weekday with the biggest error, the opening load of the item with the most leftover, or the restock cut-off. A forecast is a habit, not a product, and the first month is for calibrating it. For restaurants working from bookings rather than room counts, this tutorial on forecasting covers and cutting food waste shows the same idea, and the room-occupancy numbers themselves come from the same place as the reports in this tutorial on weekly revenue management reports for small hotels. For a simple seasonal forecast of anything with a sales history, see this one on ChatGPT demand forecasting.

Four ways the forecast goes wrong

Four patterns, none taken from a real hotel:

The group counted twice. Group rooms appear in the system's occupancy and again in a separate group sheet, and the kitchen adds both. The forecast is 24 covers too high, and for a week the buffet is full of food nobody takes. Decide that groups are removed from the ratio and added once, from one named source.

The till that counted charges, not people. A breakfast "cover" in the till is recorded per room charge, so a couple counts once. The ratio is built on those figures and the forecast is wrong in the opposite direction on weekends. Count covers as people, either at the door or by asking the till supplier what the field means.

The full tray at 09:30. The forecast is accurate and the waste does not fall, because the habit is to put out a fresh full tray "so the buffet looks good" until closing. The rules in step 4 carry cut-off times for exactly this reason, and the owner or manager has to back the chef when a tray is allowed to look sparse in the last half hour.

The extra cover nobody forecast. A day visitor arrangement starts, selling breakfast to non-residents. The ratio, built from residents, under-forecasts for three weeks until someone notices the till figures. Whenever the offer changes, rebuild the ratio, and keep non-resident covers in their own column.

What this does not fix

A covers forecast reduces overproduction and nothing else. Plate waste, which depends on portion sizes and what is on the buffet, needs menu and presentation changes, and spoilage needs ordering that follows the forecast. The method also covers breakfast only; dinner service, bar stock and event catering have their own demand patterns. Start with the buffet, because it is the one outlet where a simple ratio and a pair of scales get you most of the way.

Breakfast forecast questions from hotel managers

How many weeks of data do I need?

Eight to twelve weeks gives each weekday several observations, which is enough to start. If your mix changes sharply by season, such as business guests in winter and leisure guests in summer, build a separate ratio sheet per season. To see whether your data is good enough, build the ratio on four weeks and forecast the next four; an average miss under about a tenth of your covers is a workable start.

Do I need waste-tracking software such as Winnow or Leanpath?

Not to begin. Both describe AI-assisted tracking and quote savings on their own sites, but neither publishes a price list, and the savings figures are the vendors' own. For one buffet, a set of scales and a five-minute daily log capture the same core data. Consider software when several outlets or sites make manual weighing impractical, and ask for a trial and a written price.

What if guests pay for breakfast instead of it being included?

Take-up then depends on each guest's choice and swings more. Build separate ratios for rooms with breakfast included and room-only rooms, and add non-resident covers from your till. Expect larger errors for the room-only group, and keep more of your buffer as raw stock you only cook if it is needed.

Is it safe to give an AI assistant my occupancy data?

Counts of rooms and covers by date contain no guest names, so export only counts and dates. Remove names, room numbers linked to guests and any payment details before pasting anything into an assistant. If you later add group names or booking references, treat those as customer data and check your plan's privacy settings first.

Further reads

Sources: Champions 12.3, The Business Case for Reducing Food Loss and Waste: Hotels (April 2018); Winnow and Leanpath product pages (vendor claims, no prices shown).

Want your breakfast forecast built on your own records?

On a 1:1 call we can look at your system exports, work out the covers-per-room ratios, and set up the daily prep sheet and waste log so the kitchen can run it without me.

Book a 1:1 call with me