Process automation
Herhaalrecepten: van 27 minuten naar 90 seconden met n8n
Een dierenartsenpraktijk in Groningen met 41 medewerkers verdronk in herhaalrecepten. Eén n8n-flow naar IDEXX en Exact Online bracht het terug van 27 minuten naar 90 seconden.

Maandagochtend, 8:15. De hoofdreceptioniste van een dierenkliniek in Groningen opent haar inbox. Vierendertig herhaalrecepten staan te wachten: telefoonberichten die de antwoorddienst in het weekend heeft uitgetypt, zes formulieren uit het portaal, elf mailtjes doorgestuurd door andere klinieken in de groep. Ze weet hoe de dag eruit gaat zien. Zevenentwintig minuten per aanvraag, plus of min. De lunch wordt achter haar bureau.
Vermenigvuldig dat over twaalf klinieken en de som wordt naar. De groep telt eenenveertig mensen in receptionist-, dierenarts- en paraveterinaire functies. De afhandeling van herhaalrecepten kostte ruwweg twee fte voordat iemand de techniek had aangeraakt.
We hebben de workflow afgelopen voorjaar opnieuw gebouwd in één self-hosted n8n-flow. De doorlooptijd is nu negentig seconden voor de automatisch goedgekeurde aanvragen, ongeveer 78% van het volume. In deze post laat ik zien waar die oorspronkelijke 27 minuten naartoe gingen, wat de n8n-flow precies doet, wat we eerst hebben geprobeerd en wat niet werkte, en de twee dingen die in de eerste twee weken stuk gingen.
Waar die 27 minuten daadwerkelijk in zaten
Die 27 minuten waren geen luiheid. We hebben twee ochtenden naast het receptionistenteam gezeten voordat er één regel code geschreven was. De tijd valt grofweg zo uiteen.
- 4 minuten om de aanvraag te ontleden, vaak een uitgewerkt voicemailbericht, en daaruit huisdier, eigenaar en medicatie te halen.
- 5 minuten in IDEXX om de patiënt op te zoeken, het chronische medicatiedossier te trekken en de datum van het laatste consult voor die aandoening te checken.
- 3 minuten beoordelen, onder Nederlandse veterinaire regelgeving, of de dierenarts op afstand mag tekenen of dat de eigenaar terug moet komen voor een nieuw consult.
- 6 minuten wachten op of piepen van de dierenarts die midden in een consult zit, en dan nog eens wachten tot ze in het dossier kijkt.
- 4 minuten een recept-PDF genereren uit een Word-sjabloon, de opmaak fixen die brak op het moment dat Word met PDF ging praten, het ding aan een mail hangen, versturen.
- 3 minuten een factuurregel aanmaken in Exact Online, het debiteurnummer van de eigenaar overpennen, het verzoek sluiten in IDEXX.
- 2 minuten contextswitch-belasting: telefoon gaat, inloop komt binnen, waterkoker.
Geen van deze stappen is dom. Elke stap bestaat met reden. Bij elkaar betekende het dat een receptioniste in een ochtend ongeveer twaalf aanvragen aankon, en de wachtrij groeide harder dan dat ze hem afwerkten.
De randvoorwaarde waar niemand omheen automatiseert
Voordat we ook maar één API aanraakten, hadden we de harde randvoorwaarde vastgepind. Een bevoegde dierenarts moet elk herhaalrecept goedkeuren. De Nederlandse Wet Dieren schrijft het voor, en de richtlijnen van de KNMvD zijn er glashelder over. Software keurt geen recepten goed. De dierenarts doet dat. Wat het systeem moet doen, is de dierenarts in één klik een beslissing voorleggen met alle context die ze nodig heeft, en daarna verdwijnen.
Dat uitgangspunt maakte de rest van het ontwerp simpel. We probeerden de dierenarts niet uit de loop te halen. We probeerden elke minuut rondom de dierenarts weg te halen.
Wat we eerst probeerden en wat niet werkte
De eerste versie, in week één gebouwd als wegwerpprototype, was een Zapier-MVP die hing aan een gedeelde IMAP-inbox en een Google Sheet. Die deed drie dingen slecht. Het kon de IDEXX-API niet aanroepen op een manier die de rate limits per kliniek respecteerde. Het was niet achter de eigen VPN van de groep te zetten, dus patiëntdata kruiste infrastructuurgrenzen die wij niet beheerden. En de prijs schaalde per taak zonder plafond, wat op maandagen met 34 aanvragen serieus oploopt.
We hebben de MVP na acht dagen omgelegd. De Sheet was wel voor één ding nuttig: hij gaf het team voor het eerst een plek om de wachtrij te zien. Alleen dat al haalde ongeveer een derde van de gevoelde chaos eruit. Dat patroon (één wachtrij, voor iedereen zichtbaar) hebben we meegenomen naar de productieversie.
De n8n-flow van begin tot eind
Eén flow, self-hosted op een kleine VPS in Amsterdam, achter de eigen VPN van de praktijkgroep. We kozen n8n boven Make of Zapier om drie redenen: self-hosting (patiëntdata verlaat geen EU-infrastructuur die de groep zelf beheert), leesbare JSON-exports onder git, en de vrijheid om in een Function node te duiken als een leverancier-API iets geks doet. Alle drie waren binnen de eerste maand relevant.
De flow kent zes stappen. Ze zijn echt opeenvolgend, dus hier verdient een genummerde lijst zijn plek.
- Intake. Eén inkomend mailadres (
recepten@) en een portaalformulier schrijven beide naar dezelfde Postgres-tabel. De voicemail-transcriptiedienst schrijft daar ook naartoe. Eén wachtrij, drie bronnen. - Parse. Een klein classifier-model haalt huisdiernaam, e-mail of telefoon van de eigenaar, medicatie en dosering eruit. Komt de confidence onder 0,85, dan gaat de aanvraag naar een human-review-lane. Ongeveer 14% van de aanvragen belandt daar.
- Lookup. n8n roept de IDEXX-praktijkmanagement-API aan, zoekt de patiënt op en haalt de chronische medicatiehistorie en de datum van het laatste consult voor de relevante aandoening op.
- Gate. Is de patiënt binnen 12 maanden gezien voor de bijbehorende aandoening, dan is de aanvraag automatisch geschikt. Zo niet, dan stuurt n8n de eigenaar een voorgevulde Calendly-link voor het juiste consulttype bij de juiste dierenarts, en sluit de aanvraag als “consult vereist”. Geen recept, geen ping naar de dierenarts, geen verder werk.
- Goedkeuring dierenarts. Voor automatisch geschikte aanvragen post n8n een Slack-bericht in het kanaal van de dienstdoende dierenarts, met de patiëntsamenvatting, de notities van het laatste consult, de gevraagde medicatie en twee knoppen: goedkeuren en afwijzen. De goedkeurknop schiet een webhook terug naar dezelfde flow.
- Afhandeling. Bij goedkeuring rendert n8n de recept-PDF uit een HTML-template (we gebruiken een klein Puppeteer-servicetje, geen Word), mailt het naar de eigenaar, maakt de factuurregel in Exact Online en schrijft de afsluitnotitie terug in IDEXX.
De rol van de dierenarts in de workflow is één Slack-bericht en één klik, meestal tussen consulten door. Dat is de enige synchrone menselijke stap. Al het andere draait terwijl zij bij de volgende hond staat.
Voor wie nieuwsgierig is hoe de Exact Online-factuuroproep eruitziet zodra je een refresh token in handen hebt, dat is grofweg dit:
curl -X POST \
"https://start.exactonline.nl/api/v1/${DIVISION}/salesinvoice/SalesInvoices" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"OrderedBy": "'"${DEBTOR_GUID}"'",
"Journal": "70",
"SalesInvoiceLines": [{
"Item": "'"${ITEM_GUID_RX_RENEWAL}"'",
"Quantity": 1,
"Description": "Herhaalrecept '"${MEDICATION}"' - '"${PET_NAME}"'"
}]
}'
Wat negentig seconden je opleveren
Die 90 seconden is wall-clock van intake tot het moment dat de eigenaar de recept-PDF in de inbox heeft, voor de 78% aanvragen die automatisch geschikt zijn. De opbouw:
- Ongeveer 8 seconden voor parse, lookup en gate.
- Ongeveer 60 seconden mediaan wachten op de dienstdoende dierenarts om te kijken en te klikken. Het 95e percentiel zit dichter bij vier minuten, wat ook prima is.
- Ongeveer 22 seconden voor PDF-render, mail versturen, factuurregel in Exact Online en sluitnotitie in IDEXX.
Voor de 22% die een consult nodig heeft, sluit de flow binnen twee seconden met een Calendly-link in de inbox van de eigenaar. Voor de receptioniste hebben die aanvragen nooit bestaan.
Je automatiseert niet het oordeel van de dierenarts. Je automatiseert de vijfentwintig minuten dossiers trekken en formulieren vullen die om dat oordeel heen liggen.
De twee dingen die in de eerste twee weken stukgingen
Niks gaat schoon de lucht in. Twee faalmodi doken op in week één en week twee, en allebei zijn ze het benoemen waard, want ze gaan iedereen overkomen die deze stack aan elkaar knoopt.
De sessietokens van Exact Online
De OAuth-flow van Exact Online geeft een refresh token uit die na dertig dagen ongebruik verloopt. Het eerste weekend zonder facturen (een rustige nationale feestdag) was al genoeg om hem ongeldig te maken. Maandagochtend hadden twaalf klinieken zes uur gat in de facturatie voordat iemand het doorhad. We hebben het opgelost met een dagelijkse cron die een goedkoop endpoint aanroept om de sessie warm te houden, plus een Slack-alert zodra er ergens een 401 terugkomt van de Exact-node.
IDEXX rate limits tijdens de ochtendpiek
Tussen 08:00 en 09:30 checkt elke kliniek in de groep patiënten in, draait diagnostiek en schrijft notities tegen IDEXX aan. Onze lookup-aanroepen liepen in dat venster tegen 429-rate-limits aan. We hebben een Redis-backed queue toegevoegd met een minimum interval van 250 ms per kliniek-ID, en retries met exponential backoff. Het maakt de eigenaar niks uit of haar recept-mail om 09:32 binnenkomt in plaats van 09:01.
Bouw je dit en heeft je praktijkmanagement-systeem een dagelijks piekvenster, test de integratie dan binnen dat venster vóór je live gaat. Off-hours performance liegt tegen je.
Wat dit niet is
Dit is geen AI-agent. Er zit geen model in de loop dat klinische beslissingen neemt. De classifier in stap twee is een klein open-weights modelletje dat lokaal draait, alleen ingezet om gestructureerde velden uit rommelige vrije tekst te halen. Alles stroomafwaarts is deterministische n8n. Dat hebben we bewust zo gehouden.
Op Hacker News loopt deze maand een terugkerende discussie of de AI-vooruitgang vertraagt, en een aparte draad over de tools die mensen voor zichzelf hebben gebouwd sinds LLM's bruikbaar werden. Van binnenuit het werk dat wij voor operations-teams afleveren, voelen beide draden een tikkeltje scheef getypecast. De duurzame winst komt nog steeds vooral uit saaie deterministische integratie: één workflow-tool, twee vendor-API's, een zorgvuldige regelgevende gate, een heldere stap met de mens in de loop. De flitsende delen van de AI-stack zijn nuttig, maar zelden de bottleneck.
Hoe je dit tegen je eigen operatie aanlegt
Heb je een operatie met meerdere vestigingen in een gereguleerde sector (veterinair, tandheelkundig, juridisch, accountancy, of in de zorgrand), dan zal de vorm van dit probleem bekend voorkomen. De vragen om jezelf deze week te stellen:
- Welke terugkerende taken in jouw team hebben een duidelijke regelgevende of oordeelsmatige gate die een mens moet bezitten? Markeer die. Dat zijn geen automatiseringsdoelen, dat zijn scharnierpunten.
- Hoe ziet het werk in de twintig minuten rondom die gate eruit? Dat is je doelwit.
- Tussen welke twee systemen alt-tabt je front-office de hele dag heen en weer? Dat zijn je integratie-endpoints.
- Wat is de kleinste werkeenheid die je van begin tot eind kunt afhandelen zonder een mens aan te raken, zodra de gate is gepasseerd?
De winst bij de Groningse groep zat niet in technische verfijning. De zwaarste dag waren die twee ochtenden achter de balie met een notitieblok voor er code geschreven was. De flow zelf bestaat uit zo'n 340 regels geëxporteerde n8n-JSON en een Puppeteer-service van rond de 80 regels. De credential vault, de rate-limit shim en de monitoring kostten meer tijd dan de business logic. Dat is normaal.
Het onverwachte tweede-orde-effect
Toen we deze procesautomatisering voor de praktijkgroep bouwden, was wat we niet zagen aankomen hoeveel van de waarde in het “consult vereist”-pad opdook. Tweeëntwintig procent van de herhaalverzoeken wordt nu binnen een dag een geboekte afspraak, waar ze voorheen op de to-do van een dierenarts bleven liggen tot iemand de eigenaar terugbelde. De flow legde vraag bloot die het team niet zag, omdat niemand tijd had gehad om na te bellen.
Wil je de audit van vijf minuten: pak de meest betrouwbare terugkerende klacht uit je team, klok deze week met een stopwatch de traagste versie ervan, en schrijf op tussen welke twee systemen ze aan het alt-tabben zijn. Dat lijstje is de hele opdracht.
Kern
Je automatiseert niet het oordeel van de dierenarts. Je automatiseert de vijfentwintig minuten dossiers trekken en formulieren vullen die eromheen zitten.
FAQ
Waarom n8n en niet Zapier of Make?
Met self-hosting blijft patiëntdata op infrastructuur die de praktijkgroep zelf beheert, de flow exporteert als leesbare JSON onder git, en Function nodes laten ons quirks in vendor-API's patchen zonder de tool te verlaten.
Hoe blijft dit systeem binnen de Nederlandse veterinaire regelgeving?
Het keurt geen recepten goed. Een bevoegde dierenarts klikt elk herhaalrecept persoonlijk goed via Slack. De flow regelt alleen intake, lookup, de consult-vereist-gate, afhandeling en facturatie.
Wat houdt een eigenaar tegen om het systeem te misbruiken?
De gate checkt in IDEXX de datum van het laatste consult dat is gekoppeld aan de bijbehorende aandoening. Is die ouder dan twaalf maanden, dan wordt de aanvraag een boekingslink in plaats van een recept.
Hoe lang duurde de bouw?
Twee ochtenden observeren, acht dagen op een wegwerp-Zapier-MVP die we daarna hebben afgeschoten, en ongeveer drie weken voor de productie-n8n-flow inclusief de Exact Online- en IDEXX-integraties en de monitoring.