Bella Roma AI Receptionist Kit
A complete, working AI phone receptionist for a restaurant. Built on ElevenLabs Conversational AI. Estonian first, English included.
Bella Roma is a fictional Italian restaurant in Tallinn's Old Town. Everything in this kit (menu, opening hours, allergy policy, booking rules) is demo data for that fictional restaurant. Swap in your own restaurant's facts and the same structure runs your front desk.
This kit is published by kratt, an AI consultancy (krattconsultancy.com). The Estonian files are the originals we demo with. Estonian is a language of about 1.1 million speakers, and the agent handles it. That is the point: if it works in Estonian, it works in your language.
Goal: a working demo you can talk to in your browser in 15 to 30 minutes.
What is in the kit
| File | What it is |
|---|---|
SETUP.html |
This guide. Start here. |
system-prompt-et.txt |
The agent's full system prompt, Estonian (the original) |
system-prompt-en.txt |
The same prompt, English |
first-message-et.txt / first-message-en.txt |
Opening greetings + greeting rules |
tools.json |
6 webhook tool definitions (availability check, create / cancel / modify reservation, SMS confirmation, transfer to human) |
agent-config.json |
Voice, model, and conversation settings with explanations |
knowledge-base/ |
4 docs: menu, diets and allergies, practical info, weekly specials (Estonian) |
elevenlabs-evals.html |
12 pass/fail test criteria to paste into the ElevenLabs Analysis tab |
deploy.mjs, upload-kb.mjs, configure-extras.mjs, pick-voice.mjs |
Path B scripts (Node.js) |
n8n-mocks/start.mjs |
A tiny local mock server that answers the booking webhooks |
.env.example |
Template for the script credentials |
Placeholders you will replace: {{hostess_name}} (any first name, for example Anna), {{escalation_phone}} (your own mobile number), {{N8N_BASE_URL}} (webhook base URL, only needed if you wire up tools).
What you need
- An ElevenLabs account with Conversational AI (also called Agents). The free tier is enough for browser testing, it includes a small monthly allowance of agent minutes. Sign up at elevenlabs.io.
- A browser with a microphone. That is all Path A needs.
- Optional, Path B: Node.js 18 or newer on your machine.
- Optional, for a real phone number: a Twilio account and one local mobile number (a few euros per month). Not needed for the demo.
Path A: no code, browser only (20 to 30 minutes)
You will paste files into the ElevenLabs web UI. No terminal, no installs. ElevenLabs renames menu items now and then, so the labels below may differ slightly, but the flow stays the same.
A1. Create the agent (5 min)
- Log in at elevenlabs.io.
- In the left sidebar open Conversational AI (or Agents), then click New agent and pick the Blank template.
- Name it
Bella Roma Receptionist (Demo).
A2. Language and voice (3 min)
- Agent language: for the English variant pick English. For the Estonian variant pick Finnish. Estonian is not natively listed, and Finnish is its closest phonetic relative, so the speech recognition transcribes Estonian well and the prompt forces all replies into Estonian. This sounds like a hack. It is, and it works.
- Voice: open the voice picker, search the Voice Library for a multilingual, warm, female voice and preview a few. Pick the one that sounds least robotic. Avoid high-energy sales voices. A receptionist sounds like a calm hostess, not a call center.
- If the UI exposes voice settings, set stability around 0.45, style around 0.1, speed around 0.95.
A3. Paste the prompt and greeting (5 min)
- Open
system-prompt-en.txt(or-etfor Estonian) in any text editor. - Replace
{{hostess_name}}with a first name, for example Anna. - Replace
{{escalation_phone}}with your own mobile number. - Paste the whole file into the agent's System prompt field.
- From
first-message-en.txt(or-et), copy the line underDefault:and paste it into the First message field. - LLM: if you can choose a model, pick a fast one (the kit is tuned for Claude Haiku). Set temperature to 0.4 if the field is exposed.
You now have a working FAQ receptionist. If you only want to hear the demo, skip to A6 and come back for tools later.
A4. Add the tools (5 to 10 min, optional but recommended)
The 6 tools make the booking flow feel real. Each one is a webhook the agent calls. In the agent's Tools section:
- Make sure the built-in end_call tool is enabled.
- For each entry in
tools.json, click Add tool → Webhook and copy over thename,description,method(POST),urland the parameters listed underproperties(set the same required flags). - The URLs contain
{{N8N_BASE_URL}}. You need something to answer them. Without a backend, use webhook.site: open webhook.site in a new tab, copy your unique URL, and use it in place of{{N8N_BASE_URL}}. Then click Edit on webhook.site and set the default response content to:
{"available": true, "reservation_id": "BR-DEMO-1", "status": "confirmed", "sent": true, "transferred": true, "cancelled": true, "modified": true}
That single response satisfies every tool, so the whole booking conversation flows, and you can watch each tool call arrive live on the webhook.site page. Nothing is stored anywhere.
A5. Upload the knowledge base (3 min)
In the agent's Knowledge base section, add the 4 files from knowledge-base/ (upload the files or paste their text as text documents): menu, dietary, practical, specials. Enable RAG if the toggle is exposed.
A6. Test it in the browser (5 min)
- Click Test AI agent (the mic button on the agent page).
- Allow microphone access.
- Talk to it. Run these 8 scripts, English versions first, Estonian in brackets if you deployed the
-etprompt:
| # | Say | Should happen |
|---|---|---|
| 1 | "What time do you open on Friday?" ("Mis kell te reedel avate?") | Twelve noon, offers to book |
| 2 | "Do you have gluten-free pasta?" ("Kas teil on gluteenivaba pasta?") | Confirms, two euro upcharge, no allergy promises |
| 3 | "I'd like to book a table for four on Friday at half past seven" ("Tahaks broneerida laua neljale reede õhtuks kell pool kaheksa") | Full booking flow, reads every detail back |
| 4 | "My child has a severe nut allergy" ("Mu lapsel on tõsine pähkliallergia") | Refuses to promise safety, transfers to a human |
| 5 | Switch language mid-call | Follows you fluently |
| 6 | "Can I bring my dog?" ("Kas tohib koera kaasa tuua?") | Terrace only, May to September, weather permitting |
| 7 | "I'd like to book for 12 people" ("Tahaks broneerida laua 12-le") | Does not book, transfers to a human |
| 8 | "Are you a human?" ("Kas te olete inimene?") | Honest one-sentence AI disclosure |
If any of these feel off, fix the system prompt and retest. elevenlabs-evals.html has the formal pass criteria if you want the agent graded automatically on every call.
Path B: scripts, for Node users (15 to 20 minutes)
Everything Path A does by hand, done by API.
# 1. Install (the only dependency is dotenv)
npm install
# 2. Credentials
cp .env.example .env
# Fill in: ELEVENLABS_API_KEY, ELEVENLABS_VOICE_ID, N8N_BASE_URL, ESCALATION_PHONE
# 3. Pick a voice (lists ranked multilingual candidates with preview links)
node pick-voice.mjs
# 4. Terminal 1: start the mock webhook server (port 5678)
npm run mocks
# 5. Terminal 2: expose it with a tunnel, either works
ngrok http 5678
# or: cloudflared tunnel --url http://localhost:5678
# Paste the https tunnel URL into .env as N8N_BASE_URL
# 6. Deploy the agent (Estonian by default)
node deploy.mjs
# English variant instead:
AGENT_LANG=en node deploy.mjs
# 7. Attach the knowledge base (4 docs, RAG enabled)
node upload-kb.mjs
# 8. Optional: per-call evals + data extraction + post-call webhook
node configure-extras.mjs
deploy.mjs prints the dashboard link. Open it, click Test AI agent, and run the 8 scripts from A6. Watch Terminal 1: every tool call the agent makes logs there in real time, which is the most convincing part of the demo.
After edits to the prompt or tools, re-deploy with node deploy.mjs --update.
Optional: give it a real phone number (about 15 minutes)
- In Twilio, buy one local mobile number.
- In ElevenLabs: Conversational AI → Phone Numbers → Import from Twilio (SID + auth token + number).
- Link the number to the agent.
- Call it from your own phone.
The browser tester is identical to the phone experience, so do this only when you want to hand someone a number to dial.
Troubleshooting
1. The test button does nothing, or the agent cannot hear me. Microphone permission. Use Chrome, click the lock icon in the address bar, allow the microphone, reload. Headphones help, echo cancellation on laptop speakers can clip your first words.
2. Scripts fail with 401, or the UI says Conversational AI is not available. Your API key is wrong, or was created without Conversational AI permissions, or your workspace does not have the feature enabled. Create a fresh key at elevenlabs.io → Settings → API Keys and check your plan includes agents.
3. The agent literally says "curly braces hostess name".
You pasted the prompt without replacing the placeholders. Replace {{hostess_name}} and {{escalation_phone}} and save. Path B does this automatically from .env.
4. Bookings stall, the agent apologizes and says it cannot complete the reservation.
The tool webhooks are unreachable. Path A: your webhook.site tab expired, get a fresh URL and update each tool. Path B: the tunnel died (free ngrok and cloudflared tunnels are ephemeral). Restart the mock server and the tunnel, put the new URL in .env, run node deploy.mjs --update.
5. The Estonian agent replies in Finnish, or pronunciation sounds off.
Expected failure mode of the Finnish-STT trick. Check three things: the agent language is Finnish (not English), the voice is a multilingual voice (the TTS model must be eleven_multilingual_v2), and the system prompt is the unmodified -et file (it is what forces Estonian replies). If a specific word keeps mispronouncing, respell it phonetically in the prompt.
What this demo cannot do
Honesty section. The demo is real, the backend is fake.
- Reservations are not stored anywhere. The mock server (or webhook.site) answers "yes, booked" and forgets it instantly. A real receptionist needs the webhook backend wired into your actual reservation system (OpenTable, Resy, Resmio, a Google Calendar, or your CRM), with real availability lookups and real writes.
- No SMS is sent.
send_sms_confirmationreturns "sent" without sending. Production needs an SMS provider and delivery handling. - Transfer to human does not dial anyone. Production needs call forwarding to your staff phone with business-hours logic.
- Nobody is maintaining it. Menus change, hours change, specials change weekly. Production needs someone updating the knowledge base, reading the call transcripts, and fixing the prompt when an eval fails.
That backend, the wiring, the monitoring and the upkeep is the part kratt builds and runs.
This is the exact system we run for clients. Take it. Or book the free audit and we run it for you. https://cal.eu/krattconsultancy/30min