Voice agents
Voice agent voor tandartspraktijk: case study uit Eindhoven
Een tandartsgroep met 22 stoelen in Eindhoven verving zijn maandagochtend no-show-rij door een Nederlandse voice agent die boekt, verzet en binnen 90 seconden overdraagt.

De eerste oproep van de week bij de tandartsgroep die we Tandheelkundig Centrum Strijp zullen noemen (de praktijknaam is een pseudoniem, de cijfers niet) komt binnen om 07:51. Om 08:14 zijn drie van de vijf receptiemedewerkers in gesprek, staan er twee lijnen in de wacht en is een vierde oproep doorgeschoven naar voicemail. De praktijk opent om 08:00. Er staat al een patiënt aan de balie. De mondhygiëniste op stoel vier piept de receptie om te vragen of haar afspraak van 08:30 gisteravond bevestigd is of niet.
Dit is geen verhaal over onderbezetting. Het receptierooster is volledig bemand, op tijd en bekwaam. Het is een verhaal over wat receptiemedewerkers gedwongen worden tegelijkertijd te doen, elke maandag, terwijl een rij patiënten toekijkt.
De rekensom van een vijfpersoonsteam
De groep draait twaalf stoelen in Eindhoven en tien in Veldhoven, met één gedeelde agenda voor beide gebouwen. De receptie bedient beide locaties via één telefoonsysteem. Voordat wij erbij betrokken raakten, registreerde de praktijk gemiddeld zo'n 1.100 inkomende oproepen per week. Ongeveer 60% daarvan was kort en procedureel: een afspraak bevestigen, een afspraak een dag verzetten, vragen hoe laat een controle van een kind was, vragen of de praktijk een bepaalde verzekeraar accepteerde. De overige 40% had een mens aan de andere kant nodig: triagevragen, prijsvragen over implantaten, klachten, facturatie.
De piek op maandag was zwaar. Patiënten die in het weekend over hun gebit hadden nagedacht, belden allemaal tussen 08:00 en 10:00. De receptie spendeerde de eerste twee uur van de week aan het volstapelen van de agenda en daarna twee uur aan het uitpakken ervan, omdat de werkelijke capaciteit van de tandartsen die week niet overeenkwam met wat de receptie had toegezegd.
Het no-showpercentage zat tussen de 7% en 9%, afhankelijk van de maand. Dat is niet ongebruikelijk voor Nederlandse tandartspraktijken. De KNMT publiceert al jaren richtlijnen over no-show-tarieven en herinneringen, en de meeste praktijken zijn overgegaan op sms-herinneringen. Sms-herinneringen helpen. Ze lossen het probleem niet op, want een patiënt die om 18:00 de avond ervoor een herinnering krijgt, moet 's ochtends nog steeds de praktijk bellen om te verzetten, en tegen die tijd zit de receptie vol.
Wat we daadwerkelijk hebben gebouwd
We hebben een Nederlandstalige voice agent uitgerold die elke inkomende oproep op het hoofdnummer van de praktijk beantwoordt. Hij begroet de beller, vraagt in gewoon Nederlands waarvoor die belt en routeert van daaruit. Voor de vier intents met het hoogste volume (bevestigen, verzetten, annuleren, openingstijden opvragen) handelt hij het gesprek volledig zelf af en schrijft hij terug naar het praktijkmanagementsysteem. Voor al het andere noteert hij de naam van de beller, de geboortedatum van de patiënt en een samenvatting van één zin over de reden van bellen, en draagt hij binnen 90 seconden over aan een mens.
De telefonielaag is een SIP-trunk die wijst naar een Twilio Programmable Voice endpoint. We gebruiken Twilio's Media Streams om ruwe audio door te sturen naar een server die we draaien in eu-central-1. De speech-to-text is een Whisper-variant die op het Nederlands is getuned, draaiend op een GPU die we warm houden. De intent-laag en dialog manager zijn een kleine custom state machine, geen LLM in het belpad. We hebben op de harde manier geleerd dat je geen modelroundtrip van 1,2 seconden wilt tussen ik wil een afspraak verzetten en naar welke dag?.
De text-to-speech is een Nederlandse stem die we, met toestemming van de praktijkmanager, hebben gekloond op basis van haar eigen stem, met een schriftelijk toestemmingsformulier opgeslagen in onze AVG-administratie. De stem klinkt als de praktijk. Dat is belangrijker dan het onderliggende model: bellers die een generieke Nederlandse TTS-stem horen, hangen ongeveer twee keer zo vaak op als bellers die een vertrouwde stem horen.
De terugschrijving gaat naar Exquise, het praktijkmanagementsysteem dat de groep gebruikt. Er is geen publieke API. We hebben een dunne adapter geschreven die dezelfde databaseverbinding gebruikt als Exquise, in een read-mostly, write-narrow patroon, met een feature flag waarmee de receptie in één klik de schrijfrechten van de agent kan uitschakelen als er iets misgaat. In de eerste week is die flag twee keer omgezet. Na de derde week werd hij niet meer omgezet.
De overdracht van 90 seconden
Het belangrijkste getal in dit project was 90 seconden. Dat is de maximumtijd die de voice agent met een beller mag doorbrengen voordat hij óf het gesprek oplost, óf overdraagt aan een mens met genoeg context dat die mens niet opnieuw hoeft te beginnen.
De overdracht is niet 'momentje, ik verbind je door'. Een overdracht zoals die kost de beller 45 seconden extra om zichzelf te herhalen, en kost de receptie een koude start. Onze overdracht is een samenvatting van één regel, in het Nederlands, geschreven als een geeltje op het scherm van de receptionist voordat het gesprek doorklinkt. De payload ziet er zo uit:
{
"patient": "Anneke de Wit",
"geboortedatum": "1978-03-14",
"intent": "klacht_over_kroon",
"summary": "Kroon links onder, geplaatst 12 mei, schuurt langs tong sinds gisteren.",
"agent_attempted": ["bevestigen", "verzetten"],
"attempted_outcome": "niet_van_toepassing",
"ringing_to": "reception_eindhoven",
"elapsed_seconds": 47
}
De receptionist neemt op met de wetenschap wie er aan de lijn is, waarvoor die belt en wat de agent al heeft geprobeerd. Het 'hallo' wordt 'Hallo Anneke, vervelend dat je kroon schuurt. Ik zie dat hij op 12 mei geplaatst is. Klopt dat?' in plaats van 'Tandheelkundig Centrum Strijp, met wie spreek ik?'
Een voice agent verdient zijn geld op de overdracht, niet op de deflectie. Hoeveel gesprekken hij volledig zelf oplost telt minder dan hoe warm hij het gesprek achterlaat wanneer dat niet lukt.
Nederlands is geen Engels met extra letters
Het moeilijkste deel van de bouw was niet het ontwerp van de agent. Het was het Nederlands.
De accuratesse van Nederlandse speech-to-text in de praktijk, op een ruisende telefoonlijn, met een beller van 67 uit Brabant, is niet wat de publieke Whisper-benchmarks suggereren. Hoe dichter je bij een regionaal accent komt, hoe meer het model afdrijft. Ik wou even bellen wordt getranscribeerd als ik kou even bellen of ik vouw even bellen. Dat maakt niet uit voor proza-achtige transcriptie. Het maakt allemaal uit wanneer de volgende stap een state machine is die verwacht dat bellen een werkwoord is.
We hebben dit op drie plekken opgelost. Eerst hebben we het taalmodel aangescherpt met een woordenlijst van elke tandartsnaam in de praktijk, elke gangbare Nederlandse tandheelkundige term (kroon, vulling, brug, wortelkanaal, gebitsreiniging, mondhygiëniste) en de namen van elke straat binnen vijf kilometer van de twee gebouwen. Daarna hebben we de intent-classifier bevooroordeeld richting de vier intents met hoog volume en hem laten vragen 'Bedoel je X of Y?' zodra de zekerheid onder 0,7 zakte. Tot slot hebben we de overdrachtsdrempel agressief gemaakt. Begrijpt de agent een beller twee keer achter elkaar niet, dan draagt hij over. Geen derde poging.
De agressie op overdracht is wat het langst duurde om goed te krijgen. De eerste versie van de agent was te geduldig. Hij vroeg een verwarde beller drie of vier keer om zichzelf te herhalen. Bellers haatten dit meer dan elke andere foutmodus. De tweede versie droeg te snel over, en de receptie klaagde dat de agent gesprekken doorzette die hij had moeten oplossen. De derde versie, die nu in productie staat, draagt over na twee mislukte beurten. We monitoren het overdrachtspercentage per intent elke week en stellen bij.
AVG, opnames en de tandartsstoel
Nederlandse tandartspraktijken vallen zowel onder de AVG als onder de medische-gegevensregels die daarbovenop liggen. Gespreksopnames tellen als medische gegevens vanaf het moment dat een patiënt een symptoom beschrijft. We nemen gesprekken standaard niet op. We bewaren het transcript, gehasht tegen het patiëntnummer, gedurende veertien dagen. We bewaren de gestructureerde uitkomst (geboekt, verzet, overgedragen, met intent-label) onbepaald, want zodra het patiëntnummer is gestript, is het geen persoonsgegeven meer.
De Autoriteit Persoonsgegevens is duidelijk geweest over toestemming voor stemklonen en AI-verwerking in zorgcontexten. Wij behandelen dat als een harde randvoorwaarde. De gekloonde stem heeft schriftelijke toestemming. De agent identificeert zichzelf in de eerste zin van elk gesprek als AI, in het Nederlands: 'Hallo, je spreekt met de digitale assistent van de praktijk.' Bellers die liever met een mens spreken, kunnen mens of medewerker zeggen, of op 0 drukken, en de agent verbindt onmiddellijk door zonder te proberen het gesprek op te lossen.
Ongeveer 4% van de bellers doet dit. We houden dat getal in de gaten. Als het stijgt, is er iets mis met de agent dat het dashboard ons niet vertelt.
Bouw je een voice agent voor een zorgpraktijk in Nederland, sla het toestemmingsscript dan niet over en sla het opt-out-woord niet over. Het is niet optioneel, en het is niet alleen beleefd. De AP heeft praktijken beboet voor minder.
Wat er na acht weken was veranderd
We hebben de agent de eerste twee weken in shadow-modus laten draaien. Hij beantwoordde, transcribeerde en stelde acties voor, maar een mens drukte op de knop om iets in de agenda vast te leggen. Daarna lieten we hem schrijven naar de agenda voor alleen de vier intents met hoog volume. Daarna verbreedden we naar zeven intents.
Na acht weken in volledige productie was het volume inkomende oproepen voor het receptieteam gedaald van ongeveer 1.100 per week naar zo'n 430 per week. De andere 670 worden volledig afgehandeld door de agent of opgelost in een selfservice-flow ('onze openingstijden zijn 08:00 tot 17:30, maandag tot en met vrijdag, wil je nu een afspraak plannen?'). De receptie raakt op maandag niet meer overbelast tussen 08:00 en 10:00. Het eerste bakje koffie wordt warm opgedronken.
No-shows daalden van de 7-9%-bandbreedte naar tussen de 4% en 5%. Het meeste van die winst is niet de hoofdtruc van de voice agent. Het komt van verzettingen die de avond voor de afspraak gebeuren, door patiënten die anders de volgende ochtend zouden hebben gebeld, de lijn bezet zouden hebben gevonden en het zouden hebben laten zitten. De agent neemt op om 21:34. Hij boekt de vervangende plek. De oorspronkelijke plek staat weer in de agenda voordat de receptie inlogt.
Het 90-secondendoel op overdrachten wordt gehaald bij ongeveer 94% van de overgedragen gesprekken. De 6% die overschrijdt zijn vooral gesprekken waarbij de patiënt lang deed over het vinden van zijn geboortedatum, die we nu later in de flow vragen in plaats van eerder.
De overdracht-taxonomie die we nu hergebruiken
Elke voice agent die we sinds dit project hebben gebouwd, gebruikt dezelfde vijfbakken-overdrachtsclassificatie. Er zijn vijf legitieme redenen voor een voice agent om over te dragen: de beller vroeg om een mens; de intent van de beller komt niet overeen met een oplosbare intent; de intent komt wel overeen maar een randvoorwaarde faalde (de agenda is vol, de patiënt staat niet in het systeem, de plek is gereserveerd voor een tandarts die op vakantie is); de agent begreep de beller twee keer achter elkaar niet; of het gesprek heeft de 90-secondengrens gepasseerd.
Elke reden levert een ander geeltje op. 'Vroeg om een mens' krijgt een beleefde, beknopte notitie. 'Intent komt niet overeen' krijgt een langere samenvatting, want de receptionist zal moeten graven. 'Randvoorwaarde faalde' vertelt de receptionist precies welke randvoorwaarde, zodat de mens weet waar de workaround zit. Die taxonomie bleek waardevoller dan welke afzonderlijke modelfinetuning dan ook.
Toen we de voice agent voor de Eindhovense groep bouwden, was wat het langst duurde niet de spraakherkenning of de dialog state machine. Het was de overdracht goed krijgen, in het Nederlands, voor een gebouw vol receptionisten die alle reden hadden om sceptisch te zijn. De snelste manier die we hebben gevonden om dat op latere projecten te doen, is de overdracht uitrollen voordat je de deflectie uitrolt.
Run je een praktijk op meerdere locaties en wil je weten of jouw eigen receptiebelasting eruitziet zoals die van hen, trek dan het belregister van afgelopen maandag tussen 08:00 en 10:00 erbij, tel de oproepen die één van je vier vragen met hoog volume stelden, en deel door het totaal. Dat getal is het plafond op wat een voice agent deze week van je receptieteam zou kunnen tillen.
Kern
Een voice agent verdient zijn geld op de overdracht, niet op de deflectie. Rol de warme overdracht uit voordat je je eerste gedeflecteerde intent uitrolt.
FAQ
Waarom niet gewoon sms-herinneringen gebruiken?
Sms-herinneringen verminderen sommige no-shows, maar kunnen de verzetting zelf niet aannemen. De patiënt moet de praktijk de volgende ochtend nog steeds bellen, wanneer de receptie het drukst is. Een voice agent vangt de verzetting dezelfde avond op.
Kan de voice agent overweg met Nederlandse dialecten?
Met tuning, ja. We voegen een woordenlijst toe met tandheelkundige termen, lokale straatnamen en tandartsnamen, en we dragen over na twee mislukte beurten in plaats van een verwarde beller een derde keer om herhaling te vragen.
Is het compliant met de AVG en medische-gegevensregels?
Ja, als je het bewust aanpakt. We nemen gesprekken standaard niet op, bewaren transcripten veertien dagen gehasht tegen patiëntnummer, en de agent identificeert zichzelf als AI in de eerste zin van elk gesprek.
Hoe lang duurt een bouw als deze?
Van ondertekende offerte tot shadow-modus-in-productie was ongeveer zes weken. Volledige productie met schrijfrechten op de agenda duurde tien. Het trage stuk is het overdrachtsontwerp, niet de AI.