The problem
The client is a regional restaurant group with a phone ordering assistant already taking a share of off-premise orders. When the kitchen ran out of a dish, the line marked it 86'd on a board. The ordering assistant kept offering it until someone updated a spreadsheet the menu was built from, which during a Friday service was after the complaints.
Guests ordered, the store called back to remake the order, and the average ticket took a hit the group could see in voids. The ask was not a new voice. It was that the voice stop selling what the kitchen had already flagged.
Why the flag is the menu
A language model that 'usually knows' the specials will also usually sell the dish you just ran out of. The menu the assistant can offer has to be the menu the kitchen flag allows, at the store that is taking the order. A dish flagged at one store stays available at another.
Architecture
The 86 flag is a field, not a sentence
The kitchen display already had a way to mark an item unavailable. We subscribe to that mark. The ordering flow subtracts the item before it composes an offer. There is no step where the model is asked whether the dish is probably still in stock.
Per store, not per brand
Availability is the store's. A sold-out entree downtown does not remove it in the suburbs. The lookup is the store id on the call.
The guest hears a substitute the store allowed
If the item is gone, the assistant says so and may offer a substitute from a list the menu team maintains. It does not invent a pairing. If the list is empty, it asks what else the guest wants from the items still open.
The spreadsheet path is closed
The old menu spreadsheet is no longer what the phone reads. Leaving it in place would have recreated the lag the project existed to remove.
Challenges and tradeoffs
- Flags were not fired until the board was updated in batch. Some stores marked 86 on paper and keyed the board at the end of the rush. The two-minute figure is from the key, not from the moment the pan was empty. We added a one-tap control on the board the stores already use, and the pilot stores agreed to key it when they call the item.
- Modifiers outlived the parent item. A sold-out protein was still orderable as a modifier on another dish. The flag now removes the item and the modifiers that require it, using the recipe link the menu system already had.
- A stale cache on the telephony side served the old menu. The first production day sold a flagged dish because the session cached the menu at call start and the flag landed mid-call. The offer list is read when the guest asks for a category, not only at the start of the call.
Results
At the pilot stores, a flagged dish was off the phone menu within two minutes of the key, and review of those orders found none of the flagged dishes still offered after that window. Remakes the stores tagged as 'we are out of that' fell 38% against the prior four weekends.
The voice did not get better at upselling. It stopped taking orders the kitchen had already refused.
What we'd do differently
We would have sat a Friday service before designing the tap. The batch update at the end of the rush was the real process, and the board's existing 86 control was a step the line would not add until it was one tap.