← Blog

Voice agents

Voice agent op een notariskantoor: 920 calls per week, één wachtrij

Een Utrechts notariskantoor met zeven partners verloor 40 minuten per partner per dag aan intake-calls. De voice agent die het overnam verwerkt nu 920 aanvragen per week.

Jacob Molkenboer· Oprichter · A Brand New Company· 16 jun 2026· 9 min
Zwarte bakelieten telefoonhoorn op ivoren leren onderlegger, groen zijden lint uit een leren agenda.

De ochtendwachtrij om 08:14

Een kandidaat-notaris achter één van de zeven partnerbureaus op het Utrechtse kantoor van onze klant opent om 08:14 haar wachtrij. Eenenveertig calls zijn er binnengekomen vannacht. De voice agent heeft ze allemaal aangenomen. Negentien zijn routine-afspraakaanvragen: koopakte, hypotheek, verklaring van erfrecht. Tweeëntwintig staan in een aparte kolom, oranje gemarkeerd. Elk daarvan is een Wwft-melding boven €15.000, wachtend op een kandidaat-notaris die het transcript moet lezen voordat het dossier doorgaat naar Compromis.

Zes maanden eerder bestond die kolom niet. De calls wel. Die zaten op een Post-it op het scherm van de intake-paralegal. Dit is wat er tussen die twee momenten gebeurde.

Dit is een case study, geen tutorial. De voice agent die we bouwden bestaat uit een Twilio-trunk, een fine-tuned ASR, een structured-output-laag en een routing rule. Het interessante zit in geen van die vier. Het interessante zijn de elf weken die we besteedden aan het overhalen van een dertien jaar oude Nederlandse notariële database, een toezichthouder met een werkdag-deadline, en een maatschap van zeven voorzichtige juristen om akkoord te gaan met een machine vóór de telefoon.

Het kantoor, vóór de agent

Zeven partners. Vier kandidaat-notarissen. Elf paralegals. Ruwweg 4.200 lopende dossiers, verdeeld over koop, hypotheek, familie en ondernemingsrecht. De telefoon gaat op een doordeweekse ochtend ongeveer 184 keer. De helft is statusvragen, een kwart afspraakverzoeken en de rest is wat één partner "de lange staart van verwarring over wat een notaris eigenlijk doet" noemde.

De intake-balie was vroeger één paralegal in rotatie. Om 11:00 liep ze 40 minuten achter. Om 15:00 was de rotatie drie dik. Calls na 17:30 vielen in de voicemail en werden de volgende ochtend verwerkt, wat betekende dat een Wwft-relevante transactie die woensdagavond werd gesignaleerd pas donderdag om 10:00 werd gemeld. Dat is al een werkdag te laat voor het venster van het KNB Centraal Digitaal Repertorium.

Ze hadden eerder twee dingen geprobeerd. Een standaard IVR-menu, dat klanten irriteerde en 60% van de calls naar de verkeerde wachtrij stuurde. En een generieke chatbot op de site, die de toegevoegd notaris liet uitzetten nadat een kandidaat-notaris hem clausules zag voorstellen die zij nooit had goedgekeurd. Voice was het enige kanaal waar de echte klanten (ouder, vaak Nederlandstalig met een regionaal accent, soms bellend vanaf een bezichtiging van een koopwoning) überhaupt met een machine wilden praten.

Wat een afspraakaanvraag werkelijk inhoudt

Voordat we een regel code schreven, zaten we vier ochtenden naast de intake-paralegal. Een afspraakaanvraag is geen "plan een slot in." Het is, op dit kantoor:

  1. De beller identificeren tegen de hash die we in Compromis bewaren.
  2. Het dossiertype (koopakte, hypotheek, testament) binnen de eerste negentig seconden vaststellen.
  3. Beslissen of het gesprek een Wwft-melding nodig heeft.
  4. Beschikbaarheid van partner en kandidaat-notaris apart controleren, want Nederlandse notarissen mogen bepaalde akten wettelijk niet delegeren.
  5. Inschrijven in Compromis, de audio archiveren in het Exchange 2017-dossierarchief, een bevestiging sturen, en voor elke transactie boven €15.000 een gestructureerde regel in een wachtrij plaatsen die een kandidaat-notaris binnen het werkuur leest.

Uit dat laatste punt komt de deadline. Het KNB Centraal Digitaal Repertorium verwacht bepaalde registraties binnen één werkdag. Mis je dat, dan dient het kantoor een melding-laat in. Drie daarvan per kwartaal en de deken belt. Onze klant had er vier in 2024.

De architectuur, zo plat als we 'm konden houden

De voice agent staat overal voor. Een Twilio PSTN-trunk landt op een Nederlands afgestemde ASR (Whisper-large-v3, fine-tuned op ongeveer 40 uur interne notariscalls, opgenomen over zes weken met expliciete toestemming van de beller en een bewaartermijn). De structured-output-laag is een LLM met een strict JSON-schema en een refusal-modus die naar een mens doorzet. Twee backends doen ertoe: Compromis (dertien jaar oud, SQL achter een krakend webformulier) en een zelfgebouwd Exchange 2017-archief dat de partners weigeren te migreren, omdat elk dossier sinds 2017 erin staat.

Waarom überhaupt fine-tunen. Whisper out-of-the-box transcribeerde "kandidaat-notaris" als "candidate notary" of liet het koppelteken weg in zo'n 38% van de calls. "Huwelijksvoorwaarden" werd in minder dan de helft van de gevallen correct getranscribeerd, en de regionale klinker in "testament" struikelde er in ongeveer één op de twaalf calls overheen. Veertig uur in-domain audio bracht de word-error rate op de notariële woordenschat van 11,2% naar 2,4%. Dat was de eenheid werk die ertoe deed voordat de rest van de stack zijn waarde mocht bewijzen.

We raken Compromis niet aan via een echte API. Die is er niet. We lezen vanaf een read-replica van de SQL-backend, en writes lopen via een synthetische intake-bot user die hetzelfde formulier indient als de paralegal. Dat formulier is sinds 2014 niet veranderd. Wij behandelen dat als feature.

Voor het Exchange-archief wordt audio opgeslagen door het transcript en een base64-bijlage te self-mailen naar een gedeelde mailbox, gekoppeld aan dossiernummer. Lomp. Betrouwbaar. De partners kunnen "jansen koopakte 2026" in Outlook zoeken en vinden de call binnen vier seconden. We overwogen een aparte audioservice te bouwen. We besloten dat het vermogen van de partners om hun eigen archief vanuit hun eigen client te doorzoeken belangrijker was dan architectonische zuiverheid.

De Wwft-routinglogica

Dit is het stuk dat daadwerkelijk bepaalt wie er naar een transactie kijkt voordat die doorloopt. De voice agent destilleert een gestructureerd object uit de call en draait een routing rule die er zo uitziet:

# Returns one of: human_review, kandidaat_notaris_wwft, partner_intake, automated_book

def route_intake(call):
    value = call.structured.transaction_value_eur     # int | None
    confidence = call.structured.confidence            # 0.0 - 1.0

    # confidence floor calibrated on a held-out set of 1,200 calls
    if confidence < 0.78:
        return "human_review"

    if value is not None and value >= 15_000:
        # Wwft trigger: a kandidaat-notaris must eyeball the transcript
        # within one working hour, before the KNB CDR clock starts.
        return "kandidaat_notaris_wwft"

    if call.structured.dossier_type in {"testament", "huwelijksvoorwaarden"}:
        return "partner_intake"

    return "automated_book"

De confidence floor (0,78) is het allerbelangrijkste getal in het systeem. Daaronder vindt geen automatische boeking plaats. De voice agent leest terug wat hij hoorde, de beller bevestigt of corrigeert, en als de bevestiging twee keer achter elkaar mislukt gaat de call door naar de intake-paralegal. Ongeveer 6,4% van de calls gaat die route. De partners zijn blijer met dat getal dan met de 100% paralegal-belasting die ze in mei 2025 hadden.

De Wwft-drempel is hard gecodeerd in deterministische Python op een geparste integer, nooit in het model. In week drie leerden we waarom: een LLM herinterpreteert vrolijk "boven de vijftienduizend" als "boven de vijftienhonderd" of "boven de honderdvijftigduizend" zodra een beller de cijfers in de verkeerde volgorde uitspreekt. Numerieke vergelijkingen horen buiten het model. Het model stelt een waarde voor; Python beslist wat ermee gebeurt.

De SLA van vijfentwintig seconden

Vanaf het moment dat een beller een transactiebedrag boven €15.000 uitspreekt tot het moment dat er een regel in de kandidaat-notarisrij verschijnt, hebben we vijfentwintig seconden. Dat budget ziet er ruwweg zo uit:

  • ~6s: streaming ASR vangt het bedrag en het model levert het gestructureerde veld op.
  • ~3s: een tweede pass vraagt de beller het bedrag hardop te bevestigen.
  • ~4s: de routing rule draait, de queue-regel wordt geschreven en de Compromis intake-bot user begint met het indienen van het formulier.
  • ~5s: de bevestigingsmail gaat eruit en de audio-archive-job start.
  • ~7s: speling voor retries, network jitter en de gebruikelijke Exchange-hapering.

De mediane routing-tijd over de laatste 30 dagen is 17,4s. Het 95e percentiel is 24,1s. De enige overschrijding die we in mei logden was een Compromis read-replica die 90 seconden achterliep op de primary. We voegden een heartbeat-check toe en een fail-open-pad dat eerst naar de kandidaat-notarisrij schrijft, daarna naar Compromis, en als derde naar het audio-archief. Volgorde telt als de deadline regulatoir is.

Wat brak, en wat we leerden

De factor-100-misser. Een beller zei "vijftienduizend, vijfhonderd" (oftewel €15.500). De ASR liet de komma vallen. De structured-output-pass las het als €1.550.000. De routing rule deed het juiste, want het bedrag bleef boven €15.000 en ging naar de kandidaat-notarisrij, maar de bevestigingsmail noemde de klant het verkeerde bedrag. We lezen transactiebedragen nu cijfer voor cijfer terug naar de beller. Acht extra seconden per getroffen call. Sindsdien geen missers meer.

De accent-misclassificatie. Een beller uit Limburg zei "testament" met een klinker die de ASR als "statement" transcribeerde, wat de structured pass classificeerde als het verkeerde dossiertype. We trainden de dossier-classifier opnieuw op een corpus van regionale Nederlandse opnames uit oude voicemails van de partners zelf, met toestemming en bewaartermijn. Misclassificatie op regionale accenten daalde van 4,1% naar 0,9%.

De certificaatrotatie. Onze PSTN-provider roteerde zonder aankondiging certificaten en liet op een dinsdagavond 11 minuten aan calls vallen. De les, onromantisch: een agentic system is nooit betrouwbaarder dan de domste infrastructuurlaag eronder. Idempotente retries, gestructureerde logs en een mensdashboard dat laat zien wanneer calls stoppen met binnenkomen (niet alleen wanneer ze falen) zijn niet onderhandelbaar. De gepubliceerde richtlijnen van Anthropic over building effective agents raken hetzelfde punt van een andere kant: de failure modes die je in productie bijten zitten bijna nooit in het model zelf.

Waarom de partners akkoord gingen

Twee van de zeven partners waren openlijk sceptisch gedurende de hele scoping. Hun bezwaar was niet technisch. Het was dat klanten zich afgewimpeld zouden voelen door een machine in een diep persoonlijk telefoongesprek, een testament van een stervende ouder, een echtscheiding, en dat het kantoor vertrouwen zou verliezen dat decennia had gekost om op te bouwen. We gaven ze gelijk. De voice agent handelt nooit testamenten of huwelijksvoorwaarden van begin tot eind af. Hij doet de identificatie, bevestigt het dossiertype en draagt over. De PARTNER_INTAKE-tak in de routing snippet bestaat omdat die twee partners nee zeiden tegen alles erbuiten. We behandelen die tak als contract: als er een nieuw dossiertype bijkomt, beoordelen beide partners of het erin meegaat.

De cijfers na twaalf maanden

De cijfers die we vóór publicatie met het kantoor afstemden:

  • 920 afspraakaanvragen per week, end-to-end via de agent verwerkt.
  • 92,4% boekingen voltooid zonder menselijke overdracht.
  • 6,4% doorgezet naar een paralegal op de eigen confidence floor van de agent.
  • 1,2% door de beller zelf gestarte overdracht ("kan ik gewoon iemand spreken").
  • 17,4s mediane Wwft-routinglatentie. 24,1s p95.
  • 0 melding-laat-indieningen bij de KNB in de afgelopen vijf maanden. De 2024-basislijn was vier per jaar.
  • De intake-paralegal is overgezet naar dossier-afhandeling. De partners melden een daling van 31% in de voicemail-achterstand van 17:30.
Takeaway

Als de regelgevende klok één werkdag is, is je routingbudget vijfentwintig seconden. Bouw voor de deadline die bijt, niet voor de mediaan.

Het kleinste dat je morgen kunt doen

Run je een gereguleerde praktijk met een telefoon die nog steeds rinkelt: ga morgenochtend naast degene zitten die hem opneemt. Klok elke call van "hallo" tot "tot ziens." Tag elke call met de wettelijke drempel die hij raakt. Aan het eind van de ochtend heb je een routingmatrix die geen consultant ooit voor je had kunnen verzinnen. Die matrix is de hele spec. Toen wij de voice agent voor dit Utrechtse kantoor bouwden, zat het saaie deel in die vier ochtenden op de intake-bank. Het model is uitwisselbaar. De matrix niet.

Kern

Als de regelgevende klok één werkdag is, is je routingbudget vijfentwintig seconden. Bouw voor de deadline die bijt, niet voor de mediaan.

FAQ

Hoe gaat de voice agent om met klanten met een sterk regionaal Nederlands accent?

We hebben Whisper fine-tuned op ongeveer 40 uur interne notariscalls, met meerdere regionale accenten. Calls onder een confidence floor van 0,78 (zo'n 6,4%) gaan alsnog naar een mens.

Wat gebeurt er als Compromis offline is op het moment dat er een call binnenkomt?

De agent schrijft eerst naar de kandidaat-notarisrij, daarna naar Compromis en als derde naar het audio-archief. De regulatoire deadline wordt gehaald, ook als de legacy-backend achterloopt.

Waarom hebben jullie Compromis niet vervangen in plaats van ermee te integreren?

Een dertien jaar oude notariële database met 4.200 lopende dossiers vervangen is een project van twee jaar. Integreren met de SQL-backend en het bestaande intake-formulier kostte elf weken.

Wordt de gespreksaudio AVG- en KNB-conform gearchiveerd?

Ja. Audio wordt opgeslagen in het eigen Exchange-archief van het kantoor, gekoppeld aan dossiernummer, met een bewaartermijn afgestemd op KNB-eisen. Bellers worden bij elke call aan het begin geïnformeerd.

voice agentsai agentscase studyautomationlegacy sitesintegrations

Iets bouwen?

Start een project