kratt Get your free AI audit →

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


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)

  1. Log in at elevenlabs.io.
  2. In the left sidebar open Conversational AI (or Agents), then click New agent and pick the Blank template.
  3. Name it Bella Roma Receptionist (Demo).

A2. Language and voice (3 min)

  1. 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.
  2. 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.
  3. 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)

  1. Open system-prompt-en.txt (or -et for Estonian) in any text editor.
  2. Replace {{hostess_name}} with a first name, for example Anna.
  3. Replace {{escalation_phone}} with your own mobile number.
  4. Paste the whole file into the agent's System prompt field.
  5. From first-message-en.txt (or -et), copy the line under Default: and paste it into the First message field.
  6. 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:

  1. Make sure the built-in end_call tool is enabled.
  2. For each entry in tools.json, click Add toolWebhook and copy over the name, description, method (POST), url and the parameters listed under properties (set the same required flags).
  3. 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)

  1. Click Test AI agent (the mic button on the agent page).
  2. Allow microphone access.
  3. Talk to it. Run these 8 scripts, English versions first, Estonian in brackets if you deployed the -et prompt:
# 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)

  1. In Twilio, buy one local mobile number.
  2. In ElevenLabs: Conversational AI → Phone Numbers → Import from Twilio (SID + auth token + number).
  3. Link the number to the agent.
  4. 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.

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