← Blog

Chat agents

Chat agents voor dierenklinieken: 1.920 herboekingen/week

1.920 inbox-threads per week, een 12 jaar oud Animana-systeem, en één regel die zwaarder woog dan de mediaan van 40 seconden: nooit automatisch antwoorden op een euthanasie-thread.

Jacob Molkenboer· Oprichter · A Brand New Company· 25 mei 2025· 10 min
Linnen agenda met groen lint, koperen bel, verzegelde kaart en leren halsband op ivoorkleurig papier.

Maandagochtend bij een Tilburgse dierenkliniek. Drie vestigingen, 33 mensen op de rooster, en de receptie heeft 312 e-mails liggen voordat het eerste consult van de dag begint. De meeste zijn dezelfde vraag op veertig manieren herhaald: kunnen we de vaccinatie van Floortje verzetten van donderdag naar vrijdag na vier, Bram heeft koorts kan ik vandaag nog terecht, mijn kat is doodziek graag vanavond inslapen. De senior assistente die de inbox triagde was in maart vertrokken. De interim ging in week twee kopje onder.

Zo zat het toen we begonnen. De opdracht: handel de herboekingsdrukte af zonder de Animana-agenda te breken, route de urgente gesprekken binnen twee minuten naar een echte persoon, en maak geen enkele fout op euthanasie-threads.

Het getal dat ertoe deed

1.920 binnenkomende threads per week, verdeeld over de drie locaties. Ruwweg 78% raakt op een of andere manier de agenda: herboeken, annuleren, bevestigen, vragen naar beschikbaarheid. De rest splitst zich tussen medicatievragen (route naar de dienstdoende dierenarts), facturatievragen (route naar de praktijkmanager), en rouwberichten van eigenaren die een zorgvuldig menselijk antwoord nodig hebben.

Voor de agent deed de receptie dit met een gedeelde Outlook-inbox en een afgedrukte kopie van het dagschema van elke vestiging. De interim assistente schatte dat ze 4,5 uur per dag in de inbox zat. Twee van die uren waren puur Animana openen, de patiënt vinden, naar de juiste agenda scrollen, en bevestigingstekst terug in Outlook plakken.

Waarom Animana dit lastiger maakte dan verwacht

Animana is het Nederlandse veterinaire praktijk-managementsysteem dat de meeste klinieken hier draaien. Het is inmiddels eigendom van IDEXX en draait al meer dan tien jaar in het veld. De klinische workflow is goed. De publieke API is dat niet. IDEXX publiceert nauwelijks iets over programmatic access voor derde partijen, en wat er bestaat zit achter een partnerprogramma dat gericht is op integrators van lab- en imaging-hardware.

Voor een kleine studio die een inbox-agent bouwt, bleven er twee opties over. Of de Animana-webclient screen-scrapen, wat broos is en bij elke release breekt. Of Animana behandelen als de source of truth en ernaar schrijven via een dunne RPA-laag, terwijl je een gesynchroniseerde read replica van de agenda in je eigen store houdt. Wij kozen het tweede.

We spraken tijdens scoping met twee andere Nederlandse klinieken. Beide hadden iets vergelijkbaars geprobeerd te bouwen en beide waren tegen dezelfde muur opgelopen: er is geen onderhouden Animana-SDK in welke taal dan ook, en het partner-API-pad vereist een gevestigde hardware-vendor-relatie met IDEXX die maanden kost om op te zetten. Voor een project dat in zes weken live moest, was geen van beide routes een echte optie. Dit van tevoren weten scheelde ons ongeveer twee weken aan valse starts.

Waarschuwing

Bouw je een agent tegen een legacy PMS, krijg dan eerst het read-pad goed voordat je het write-pad aanraakt. Wij zijn twee weken puur kwijt geweest aan calendar sync voordat de agent één enkele bevestiging terug kon schrijven. Die stap overslaan is precies hoe je eindigt met dubbel geboekte operatieplekken.

Hoe de agent een herboek-thread leest

Een herboek-thread komt meestal in een van drie vormen binnen. De heldere vraag: "Kan de afspraak van Bram dinsdag om 14:00 verzet worden naar woensdag?". De vage vraag: "Kunnen we even kijken voor volgende week?". De gemengde vraag: een herboekingsvraag met een klinische zorg eraan vast, en dat is de gevaarlijke.

De agent classificeert elk binnenkomend bericht in één van zeven intents voordat hij iets anders doet. Drie van die intents (rebook, confirm, cancel) zijn veilig om op te acteren. Twee (medication, invoicing) worden overgedragen aan de juiste menselijke wachtrij met een sjabloon-begeleidingsbericht. De laatste twee (clinical_urgent en bereavement_or_euthanasia) krijgen nooit een geautomatiseerd antwoord. Ze worden gemarkeerd, voorgelegd aan een senior assistente in dienst, en de eigenaar krijgt binnen vijftien minuten een korte, met de hand geschreven bevestiging van een mens.

Zodra de intent helder is, extraheert de agent entities: patiëntnaam, eigenaar, gevraagd tijdsvenster, vestiging indien genoemd. Daarna queryt hij de calendar replica naar slots die aansluiten bij de voorkeursregels van de praktijk. Die regels zijn niet glamoureus. Plan geen nagelknip in hetzelfde slot als een post-op controle. Boek een eerste puppy-prik niet op vrijdag om vijf, want de dierenarts die puppy's doet is er dan niet. Boek geen kattenconsult om 13:00 in vestiging Berkel-Enschot, want dat is de hondenmiddag.

Er zijn ook duurregels die de agent moet respecteren. Een vaccinatieconsult duurt 15 minuten; een gedragsconsult 45. Een eerste puppybezoek heeft een vol uur nodig omdat de eigenaar een vaccinatieplan, chip-papierwerk en een voedingsadvies meekrijgt. De agent codeert dit allemaal, zodat hij nooit een slot van 30 minuten voorstelt voor een consult dat eigenlijk een uur nodig heeft, en nooit een uur verspilt aan iets dat vijftien minuten vraagt.

De agent stelt vervolgens twee slots voor, schrijft in het Nederlands terug, en wacht. Bevestigt de eigenaar, dan schrijft de agent de afspraak via het RPA-pad in Animana, controleert hem dubbel door de agenda opnieuw te lezen, en sluit pas dan de thread.

De mediaan van 40 seconden, uitgesplitst

De mediaan tijd van binnenkomend bericht tot bevestigd slot is 40 seconden. De uitsplitsing is onromantisch.

  • Intent-classificatie en entity-extractie: 2 seconden.
  • Calendar query tegen de read replica: onder 1 seconde.
  • Slot-ranking tegen de praktijkregels: 1 seconde.
  • Antwoord opstellen in het Nederlands: 4 tot 7 seconden.
  • Wachten tot de eigenaar terugschrijft met een ja: 18 tot 30 seconden (de enige stap die echt varieert).
  • RPA-schrijf naar Animana en verificatie-lees: 6 seconden.

De mediaan van 40 seconden komt niet doordat de agent slim is. Hij komt doordat de agent niet langzaam is. De vorige setup zat op een mediaan van 14 minuten omdat een mens voor elk bericht moest schakelen tussen Outlook, Animana en het afgedrukte dagschema.

Routering van als euthanasie gemarkeerde gesprekken

Dit is het stuk waar we slecht van sliepen. Per week noemen ergens tussen de 11 en 14 berichten euthanasie, inslapen, of een zin als "we hebben besloten dat het tijd is". Elk daarvan heeft snel een mens nodig, en het verkeerde geautomatiseerde antwoord zou een merk-vernietigende fout zijn.

De flag is opzettelijk te gretig. We vangen de expliciete Nederlandse termen, de beleefde eufemismen, en de zachte signalen (een thread die een hond van 14 jaar noemt en het woord "lijden" in hetzelfde bericht). Vals-positieven gaan naar een senior assistente die ze in tien seconden kan wegklikken. Vals-negatieven zijn de faalmodus die we niet kunnen accepteren.

Als de flag afgaat, gebeuren er drie dingen tegelijk. Het gesprek wordt geblokkeerd voor elk geautomatiseerd antwoord. Er gaat een push-notificatie naar de senior assistente die op dat moment dienst heeft (het rooster staat in Google Calendar, dat is veel makkelijker af te lezen dan Animana). En binnen vijftien minuten gaat er een korte, handgeschreven aanvoelende Nederlandse bevestiging uit, opgesteld door de agent maar gelezen en verstuurd door de assistente. De KNMvD-richtlijn voor communicatie met eigenaren rond euthanasie is helder dat het eerste antwoord de toon zet voor de hele afspraak. We wilden dat eerste antwoord van een persoon laten komen die het bericht had gelezen.

Kernpunt

Een inbox-agent is alleen zo goed als de gesprekken die hij weet te vermijden. De euthanasie-thread correct flaggen is belangrijker dan snel antwoord geven op de vaccinatie-thread.

Wat er in de eerste twee weken brak

Vier dingen, ongeveer in de volgorde waarin ze pijn deden.

Het eerste was vestiging-ambiguïteit. De groep heeft drie locaties en eigenaren zeggen vaak niet welke ze normaal bezoeken. In het begin stelde de agent slots voor bij de locatie met de eerstvolgende opening, en zaten we met een handvol eigenaren die in Tilburg-Noord aankwamen terwijl hun patiëntdossier in Berkel-Enschot lag. We hebben dat gerepareerd door te joinen tegen de laatst bezochte locatie van de patiënt in Animana voordat we een slot voorstellen, en door expliciet te vragen als de patiënt nieuw was.

Het tweede was Animana-sessievervaltijd. De RPA-laag houdt een ingelogde session vast, en Animana ongeldigt die op een schema dat we nergens gedocumenteerd vonden. We zagen op een donderdagmiddag vijf appointment-writes stil falen. We hebben elke 90 seconden een heartbeat-read toegevoegd en een re-login-routine die getriggerd wordt op elke 302 naar de loginpagina.

Het derde was de toon. De eerste week lazen de Nederlandse antwoorden als beleefd, maar net even stijf. Eigenaren merkten dat. We hebben de system prompt herschreven om te leunen op de feitelijke formuleringen die de senior assistente had gebruikt in haar laatste zes maanden aan inbox-antwoorden, geschraapt uit het archief met haar toestemming. De tevredenheidsscore van eigenaren steeg de week daarna met een marge die niemand van ons had verwacht.

Het vierde waren Nederlandse typfouten en dialect. Eigenaren schrijven inbox-berichten vanaf telefoons, vaak half-Nederlands en half-Vlaams, vaak met autocorrect die het erger maakt. "Affspraak" voor "afspraak", "vacintie" voor "vaccinatie", "enthuanise" voor "euthanasie". De verkeerd gespelde euthanasie was degene die ons schrik aanjoeg. We hebben een fuzzy-match-laag boven de flag-termen gezet en twee weken lang elke wel-of-niet-geflagde beslissing in de schaduw beoordeeld voordat we de classifier vertrouwden om op eigen oordeel te handelen.

Wat het team terugkreeg

De interim assistente ging van 4,5 uur per dag in de inbox naar ongeveer 40 minuten. Die tijd besteedt ze nu aan de rouw-en-euthanasie-wachtrij, het werk dat haar daadwerkelijk nodig heeft. De praktijkmanager kreeg geen agendaklachten meer. De twee dierenartsen die woensdagmiddagen kwijtraakten aan "kun je even snel de agenda checken" kregen hun woensdagmiddagen terug.

Het getal waar we meer om gaven dan om de 40 seconden: nul dubbele boekingen in de eerste elf weken in productie, tegen een gemiddelde van drie tot vijf per week daarvoor.

Wat we anders zouden doen

We zouden eerder beginnen met de calendar read sync. We behandelden het als loodgieterswerk en het bleek de dragende muur van het hele systeem te zijn. Is je PMS ouder dan vijf jaar en mist hij een echte API, reken dan op twee weken loodgieterswerk voordat je één regel agent-logica schrijft.

We zouden ook de euthanasie-flag vanaf dag één instrumenteren in plaats van vanaf week drie. We hadden geluk dat geen enkele edge case erdoorheen glipte. Dat geluk hadden we niet nodig moeten hebben.

Toen we de chat agent voor de Tilburgse dierenkliniek bouwden, liepen we ertegenaan dat de drift van de Animana-agenda tussen de read replica en het live systeem groter was dan de docs suggereerden. We hebben dat uiteindelijk opgelost met een reconciliatielus van 90 seconden en een write-verify-read-patroon op elke afspraak. Sta jij naar een vergelijkbaar inbox-probleem te kijken tegen je eigen legacy systeem, dan is dat patroon (en een paar andere) waar ons werk aan AI-agents op is gebouwd.

Het kleinste wat je vandaag kunt doen: open je gedeelde inbox, tel hoeveel van de laatste 100 threads dezelfde vraag in andere bewoordingen zijn. Dat getal is de eerste taak van je agent.

Kern

Een inbox-agent is alleen zo goed als de gesprekken die hij weet te vermijden. Flag de euthanasie-thread voordat je optimaliseert voor de herboek-thread.

FAQ

Waarom niet gewoon de eigen afsprakenwidget van Animana gebruiken?

Die bestaat, maar leest geen vrije Nederlandse e-mails, classificeert geen intent, en kan een euthanasie-thread niet naar een mens routeren. Het is een formulier, geen inbox-agent.

Is screen-scrapen van Animana op de lange termijn veilig?

Eigenlijk niet. We gebruiken een dun RPA-pad voor writes en een gesynchroniseerde read replica voor queries, met een heartbeat die sessievervaltijd opvangt. Elke Animana-release krijgt een smoke test voor deploy.

Hoe voorkom je dat de agent automatisch antwoordt op een noodgeval?

Een zeven-intent-classifier met twee intents (clinical_urgent en bereavement_or_euthanasia) die hard geblokkeerd zijn voor geautomatiseerde antwoorden. De flag is met opzet te gretig. Vals-positieven zijn goedkoop; vals-negatieven niet.

Wat gebeurt er als de agent een slot voorstelt dat de dierenarts daarna annuleert?

De reconciliatielus leest Animana elke 90 seconden opnieuw en bevestigt opnieuw bij de eigenaar als een voorgesteld slot verdwijnt voordat ze terugschrijven. We sluiten nooit een thread op een niet-geverifieerde write.

Kan een kleinere kliniek dit betalen?

Het euthanasie-routeringsstuk is bij elke kliniekgrootte de moeite van bouwen waard. De volledige herboek-pijplijn verdient zich het snelst terug boven ongeveer 600 wekelijkse threads, waar een menselijke inbox-rol al onder druk staat.

ai agentschat agentsautomationcase studyworkflowintegrations

Iets bouwen?

Start een project