Bella Pizza —
always-on voice ordering agent
A Vapi-powered voice agent that picks up the phone at a small pizza chain, takes the customer's order, reads it back, and sends a structured ticket straight to the kitchen — even when the line cooks can't pick up.
01The problem
Bella Pizza is a small regional chain. The phone rings hardest exactly when the kitchen is at its busiest — Friday and Saturday nights, family-meal rush, big-game evenings. Calls were getting missed, customers were hanging up, and the team had no clean way to recover those orders the next day.
Hiring a dedicated phone person per location wasn't worth it for the volume. What they needed was something that could pick up every call, take a clean order, and never get flustered when six people called at once.
02What I built
A Vapi voice agent with an ElevenLabs voice, hooked up to the chain's existing phone number through Twilio. When the line is busy or after hours, the call is routed to the agent.
The agent greets the caller, takes the order item by item, confirms the total, captures the delivery address or pickup time, reads the order back, and ends the call. A structured ticket lands in the kitchen display and a copy goes to the store's Slack so the manager can see every order as it comes in.
03The conversation
Voice ordering looks easy from the outside and is full of small traps in practice. The flow was built to handle the messiness of real callers without sounding stiff.
- Greeting — short, warm, branded. "Hey, this is Bella Pizza — are you ordering for pickup or delivery?"
- Item capture — pizzas one at a time, with size and any modifications. The agent re-asks if a topping isn't on the menu.
- Upsell, lightly — drink and side suggestions, but only once. No nagging.
- Address or pickup time — captured as structured fields, not free text.
- Read-back — the agent reads the full order and total before ending the call.
- Handoff — anything outside the menu (catering, complaints, large parties) goes straight to a human.
04Menu grounding — no invented pizzas
The most important rule: the agent can only sell things that are actually on the menu. That sounds obvious and is the part that goes wrong the most with a naive prompt.
- The full menu — items, sizes, prices, allowed toppings — is loaded as structured tool data, not stuffed into the prompt.
- The model can only fill an order through a single
add_itemtool that validates against the live menu. - Unknown items get a polite refusal and a suggestion, not a guess.
- Prices and totals are computed by code, never by the LLM.
05From call to kitchen
The valuable moment isn't the conversation — it's the structured ticket that lands in the kitchen at the end of it.
06Stack
07Outcome
The phone gets answered every time now, even at peak hours. Orders the chain used to lose — missed calls during rush, after-close callers — are still captured and either taken live or scheduled for the next open window.
The same agent is now being adapted for a sister cafe under the same group with almost no engineering work — change the menu, change the voice, ship.