- Home
- Case studies
- An AI receptionist that answers calls people miss
An AI receptionist that answers calls people miss
A bot takes missed calls and checks the CRM to see who is calling. The team gets a ready-to-read summary instead of just a number on a list.
4 min read
- Client
- Service company (in-house product)
- Industry
- Customer service / AI telephony
- Scope
- AI voice agents and telephony
Who the client was and what was getting in the way
A service company where the phone is the main way new enquiries come in. Someone calls, gets a busy signal or rings an hour after the office closes, hangs up, and calls the next company on the list. There is no complaint, no record in the system, not even a sign that anyone tried to get in touch. All that remains is a missed-call entry, which does not tell the team whether it was an existing customer with an urgent issue or a sales representative offering printer toner.
That was the concrete problem: a missed call costs money, but no one could say how much because no one knew what the call was about. Blindly calling back every missed number takes half a day and usually leads nowhere.
There was also a requirement that raised the bar. The bot was not just supposed to answer; it needed to know who was calling before it spoke. The company had a CRM with contact history, so the information that a caller was a customer with an open issue was readily available. But this kind of personalization creates the opposite risk: if the bot confuses phone numbers, greets someone by another customerβs name, or refers to the wrong issue, that is worse than knowing nothing. The final requirement was the handoff. A bot conversation needed to end with something a person could read in fifteen seconds and immediately know whether to call back now or tomorrow.
What we built
We started with conditional call forwarding in the phone system. The bot does not answer every call; it steps in only if no one picks up, the line is busy, or the phone is unavailable. It receives the callerβs number, which is the key to everything that follows.
Just before the conversation, a pre-call webhook queries the CRM for the name, company, and open issue associated with that number. Matching is exact and uses the full number. We deliberately avoided fuzzy matching because the cost of a mistake is higher than the benefit of recognizing a few more callers. If a number is not in the CRM, the bot simply handles the conversation without personalization, which is fine.
The conversation itself takes place in Polish using ElevenLabs Conversational AI over a SIP connection. The bot has a defined list of details to collect, follows it during the call, and ends the call once it has everything. After the caller hangs up, a post-call webhook sends a summary and transcript to the team as a notification and task, so no one needs to check elsewhere to learn that a call came in. We sign webhooks in both directions with HMAC and run the intermediary logic on Supabase Edge.
How it works today
A customer calls and no one answers. A moment later, the bot picks up. If the number is recognized, it greets the caller by name and refers to the open issue. If not, it asks for the basics and collects them from scratch. In either case, the teamβs inbox gets a short summary with a transcript and the specific issue β not just a phone number.
We rolled this out in stages, starting outside office hours, when the risk was lowest, and only then covering daytime peaks. The bot runs continuously, so a call on Saturday evening leaves a record too.
The outcome
The number of missed calls that go nowhere has fallen to zero: every call now creates a record the team can act on. The bot recognizes callers by phone number using the CRM, so the conversation does not start by asking customers for information the company already has. The line is available 24/7. A call summary reaches the team automatically, without anyone transcribing it by hand.
What we would do differently
We underestimated how much inconsistent phone numbers in the CRM could undermine personalization. Numbers saved in different formats, with old prefixes and spaces in random places, meant exact matching simply failed. We normalized phone numbers during implementation, but that should have been the first step, before connecting the phone system.
The second lesson concerns summaries. The first version was too long, and the team did not read it anyway. In the next implementation, we will set a limit immediately and require one sentence stating the issue at the top, with the transcript below for anyone who wants more detail.
Related projects
A voicebot that answers routine appointment calls
A bot connected to the medical system handles confirmations, cancellations, and questions about appointment times. The line stays free for patients who need a person.
One place where customers can book their own appointments
We brought scattered appointment booking into one platform: calendars for each location, a service menu, and automatic reminders.