How a call becomes a booking
Every call follows the same path, on a phone line or in the browser demo. The language model writes Juno's replies. The platform checks the tables, reads the booking back and writes it after the guest says yes.
From the first ring to the staff panel
The yes gate sits between the read-back and the booking. A confirmation whose details differ from what was read back is rejected.
Eight steps, from the first ring to the call ledger
Taken from the product's own documentation of the call flow.
- Step 1The call arrives
A Twilio webhook, or the browser demo driving the same handlers, routes the call to the restaurant that owns the dialled number.
- Step 2Juno greets the guest
With the restaurant's published greeting, in the restaurant's language.
- Step 3Each turn goes to the model
Together with the restaurant's published profile and approved facts. The model returns the intent, the reply and the booking details it heard.
- Step 4Questions are answered from facts
Anything the facts do not cover is offered as a callback.
- Step 5The platform checks availability
Against the restaurant's tables, opening hours and party-size rules.
- Step 6Juno reads the booking back
With the date resolved, for example “Saturday, October 10 at 7:30 PM”, once the slot is free and the name and phone are known.
- Step 7A later “yes” writes the bookingThe gate
A fingerprint check rejects a confirmation whose details differ from the read-back, and a Postgres constraint makes double-booking one table impossible.
- Step 8The call lands in the ledger
Transcript, outcome and usage (minutes and model tokens) go to the call ledger and the admin.
What is real in the demo, and what is simulated
The browser demo runs the production call path. Only the phone line and the speech engine are swapped for browser equivalents.
- ConversationAnswers, availability, read-back, bookingReal
The production code path.
- AdminCall ledger, transcripts, usage, admin panelReal
The same admin a restaurant uses.
- Phone lineBrowser call in place of a phone numberSimulated
The page builds the payloads Twilio would send and drives the same handlers. The Twilio path is real in the code; the public demo has no carrier number yet, and the 555 number on its screen is fictional.
- SpeechYour browser's speech recognition and voiceBrowser
On a phone line, Twilio speech recognition and Amazon Polly voices do this. Juno is the on-screen host of the demo and the admin; on a phone line guests hear your greeting in an Amazon Polly voice.
- RestaurantBella Vista is fictionalDemo data
A seeded demo restaurant in Ottawa, with its own menu facts and tables.
- ConfirmationsSMS and email to the guestOff in the demo
Built in, using the platform's Twilio and email settings. The demo has none configured, and web callers get fictional 555 numbers, so nothing is texted or dialled.
Call Bella Vista
- Open airest.mmix.biz in Chrome or Edge, press Call and allow the microphone. Any browser works with the typed input under the transcript.
- Ask “Do you have vegetarian dishes?” or “Where can I park?”
- Say “A table for four this Saturday at 7:30, please,” with a name and a phone number, then “Yes, please book it.”
- Watch the booking land on the Schedule under the call.
See the staff side
Sign in to the admin from the demo page with the read-only login. It shows the dashboard, calls with transcripts and the booking ledger; every change is refused.
- judge@airest.store
- Password
- BellaVista-demo-2026
The demo shares one language-model quota with every visitor. If Juno goes quiet, the quota may be used up for now: try again later, or watch the recorded call.
The stack
One multi-tenant deployment serves many restaurants, each with its own published profile, phone numbers and usage limits.
- API
Node.js 20, TypeScript, NestJS
- Data
PostgreSQL 16 with Prisma and checked-in migrations; Redis for conversation sessions, booking gates, rate limits and usage counters
- Telephony
Twilio Voice and SMS: signed webhooks that fail closed in production, number provisioning from the admin
- Model
Any OpenAI-compatible chat endpoint, or Ollama; the model answers in JSON with intent, reply, booking details and action, across 18 intents
- Admin
Next.js 14 and Tailwind CSS
- Automation
Seven n8n webhook events, including call completed, reservation created and callback requested
- Tests
1,304 Jest unit tests and 20 integration tests on real Postgres, run in CI on the main branch
- Deploy
Docker and Docker Compose
