A voicebot for the calls the centre can't pick up.

A diagnostic imaging centre was missing one call in four. Now every unanswered call becomes a callback request, with name, reason and preferred time.

Sector
Healthcare
Practice
AI and automation
Year
2025-2026
How it works
Caller
Patientphone
After hoursphone
Phone system
Line busyforward
Centre closedforward
Voicebot
Voice bridge and realtime model
Local numberWebSocketFormal ItalianData recapNo audio storedPrivacy notice
Front office
Front-desk emailper request
Live dashboardto call back
Transcripttext
In brief

We built an AI phone assistant that answers when the front desk is busy or the centre is closed. It gives the centre's information in formal Italian, collects callback details and hands them to the front desk by email and on a live dashboard. Call audio is not stored.

3,489
business-hours calls in eight weeks, before the project
24%
of calls missed in the same period
38.7%
of calls missed in August
0
audio recordings kept

Context

The centre handles around a hundred patient check-ins a day, with four people rotating on the front desk. The phone system is a carrier-hosted VoIP switchboard: call logs can be exported, but caller numbers come truncated by their last four digits, so they can't be used for callbacks.

The problem

We analysed calls from 7 August to 30 September 2025, weekdays from 8am to 7pm: 3,489 calls, 836 missed. Losses cluster on Monday mornings and around 10am, when the front desk is busy with patients at the counter. The count includes people who hang up in the first seconds, but the signal is clear: every missed call is a booking that may go elsewhere.

What we did

  1. 01

    Data before ideas

    A map of calls by day and hour, with the loss rate per hour. It told us when the voicebot should step in, and it explained the project to management.

  2. 02

    A bridge between telephony and the model

    The switchboard forwards calls to the voicebot when the line is busy, when nobody answers and when the centre is closed. A Node.js service connects the audio stream to the realtime model over WebSocket; Laravel handles calls, data and notifications.

  3. 03

    A conversation with strict rules

    It uses the formal register, speaks first, answers on services, opening hours and report pickup. It collects name, phone, reason and time slot one step at a time, then reads the details back and asks for confirmation before closing. The privacy notice is mentioned at the start.

  4. 04

    The front desk stays in charge

    Each request reaches the front desk by email and appears on a self-updating dashboard with a To call back filter and the transcript. Whoever calls back marks the request as handled.

  5. 05

    An Italian number, not a toll-free one

    Italian switchboards can't forward to toll-free numbers. We moved telephony to a local Italian number, so the centre uses standard call forwarding without changing its phone system.

How it went

The service is live at the first centre and being extended to a second site of the same group. It became Dianix, our voicebot for medical centres, clinics, labs and care homes: each facility gets its own subdomain, each site its own number, greeting and notification email.

Tools

LaravelNode.jsWebSocketOpenAI Realtime APITelnyxAWS SESMariaDBLaravel Forge

FAQ

Does the voicebot book appointments directly?

No. It collects the request and passes it to the front desk, which confirms the appointment in its own system. The calendar stays with the centre.

Do we need a new phone system?

No. You set call forwarding to the dedicated number for busy, no answer and after hours. Nothing else changes.

What data does it keep?

The request details and the transcript, on servers in Italy. Audio is not stored. The centre remains the data controller and Cloudfactory acts as data processor.

Contact

Facing something similar?

Tell us what you run today and what isn't working. We'll reply within one business day with a first technical read.

Email
hello@cloudfactory.it
Address
Viale di Trastevere 114, 00153 Rome, Italy