Voice agents
Voice agent op Navision 2009: 1.640 calls/week NL+PL
Het is dinsdag 06:14. Een Poolse chauffeur in Tilburg wil weten welke pallet paksoi waar staat binnen zijn routeslot. De voice agent antwoordt in 35 seconden.

Het telefoonprobleem van 06:14
Het is dinsdagochtend, 06:14, op een natte dag in mei. Een Poolse chauffeur staat met een koeltrailer geparkeerd bij een Carrefour-distributiecentrum bij Tilburg. Hij wil weten of de twee pallets paksoi onder referentie 41229 op zijn rit van vandaag staan of die van morgen, want zijn routeplanner heeft hem al veertig minuten naar voren geschoven. Hij belt de groothandel in Breda. De lijn gaat precies één keer over.
Wat er vroeger op dat moment gebeurde: niemand nam op. De nachtploeg had om 06:00 overgedragen, het dagteam stond in de loods, en het gesprek rolde door naar voicemail. De chauffeur sprak een bericht in in het Pools. Veertig minuten later belde iemand hem terug, in het Nederlands, nadat er op kantoor om hulp was gevraagd. Toen was hij al halverwege Eindhoven.
Wat er nu gebeurt: de lijn wordt opgenomen door een voice agent, in het Pools, bij de eerste keer overgaan. De agent leest de orderreferentie terug, bevestigt de twee pallets, noemt het laaddok en zegt dat het routeslot 07:15 tot 07:45 is. Totale gespreksduur: 41 seconden.
Dat is één gesprek. Per week zijn er zo'n 1.640 van dit type.
De groothandel en de randvoorwaarde
Het bedrijf is een groothandel in versproducten in Breda met 26 medewerkers. Ze verplaatsen bladgroente, koolsoorten, kruiden en een vaste roulatie van fruit buiten het seizoen tussen Nederlandse telers, Poolse telers en zo'n 90 middelgrote afnemers in de Benelux. Een serieus bedrijf met oude infrastructuur.
Hun grootboek draait in Microsoft Dynamics NAV 2009. NAV 2009 ging in 2015 uit mainstream support en in 2019 uit extended support; Microsofts eigen lifecycle-pagina staat nog online als je de data zelf wilt nalezen.
Dat klinkt als een verhaal over het vervangen van de ERP. Dat is het niet. De groothandel heeft de afgelopen acht jaar twee keer geprobeerd te migreren naar Business Central. Beide keren trokken ze in week elf de stekker eruit, omdat de routeplanner, de weegbrug-integratie en drie maatwerk-margerapporten nooit netjes mee zouden komen. De CFO is daar eerlijk over. Hij noemt NAV 2009 "het hartinfarct dat we nooit hadden". Het nummer dat je belt begint nog steeds met 076.
Wat ze echter niet konden volhouden, was statuscalls blijven afhandelen zoals voorheen. Ze raakten elke dag ongeveer vier uur werkvloertijd kwijt aan rinkelende telefoons.
De opzet van de bouw
We hebben een voice agent bovenop NAV gebouwd zonder NAV zelf aan te raken. Dat is de hele architectuur in één zin. De rest is detail.
De agent neemt elk inkomend gesprek op één specifiek nummer aan, identificeert de beller tegen het klantrecord (CLI plus een fallback-verificatie via bedrijfsnaam en postcode), en handelt drie intents af:
- Orderstatus, het saaie geval, "waar is mijn paksoi"
- Bevestiging van het routeslot, "zit mijn pallet op de rit van 07:15"
- Kwaliteitsklacht, die binnen 30 seconden naar een mens wordt doorgeschakeld
Al het overige, inclusief nieuwe orders, escaleert naar een planner. We hebben er bewust voor gekozen om in de eerste bouw niet meer intents toe te voegen. Een gefocuste agent die twee dingen feilloos kent, is veel nuttiger dan een brede die op zes punten een slag om de arm houdt.
De agent praat met NAV via een read-only SQL view die we ernaast hebben gebouwd, plus een kleine queue-tabel voor writes. We raken de productie-NAV-instantie niet aan. De view wordt elke 60 seconden ververst vanuit een gespiegelde read replica, wat traag klinkt totdat je je herinnert dat pallet-ETA's in stappen van 15 minuten veranderen, niet van 15 seconden.
De integratie met de routeplanner is ouder dan de ERP. Het is een Windows-service van een derde partij uit 2011 waar het bedrijf geen afscheid van wil nemen, omdat hij één specifieke eigenaardigheid begrijpt over hoe hun chauffeurs Belgische plattelandsleveringen aanpakken. We praten ermee via een pollende file drop, op precies dezelfde manier als de routeplanner altijd al met NAV praatte. De agent leest hetzelfde bestandsformaat. Aan de planner hoefde niets te veranderen.
Dat is de filosofie. Het nieuwe systeem volgt de contouren van het oude.
Nederlands en Pools in één voice stack
De eis van twee talen was de ene ontwerpkeuze die iedereen onderschatte, inclusief wij.
Ongeveer 38% van de chauffeurs van de groothandel is Poolstalig. Een kleiner deel van hun telers ook. De afnemers zijn vrijwel volledig Nederlandstalig. Code-switching midden in een gesprek is normaal. Een planner kan zeggen "tak, oczywiście, wij sturen 'm om kwart over zeven". Daar bouw je niet voor met een eentalig ASR-model.
We draaien de eerste 2,5 seconden van elk gesprek twee recognisers parallel, scoren ze op confidence van de openingszin, en zetten het gesprek vast op de winnaar. Vanaf dat punt blijft de agent in die taal, tenzij de beller expliciet wisselt. Er is geen "toets 1 voor Nederlands"-menu. De agent antwoordt gewoon in de taal die de beller gebruikte.
Pools was lastiger. Nederlandse ASR is in goede vorm; de publieke corpora zijn diep, inclusief projecten als Mozilla's Common Voice, dat genoeg gevalideerde Nederlandse audio bevat om de meeste regionale accenten te dekken. Poolse ASR werkt prima op een schoon signaal, maar Poolse ASR voor een chauffeur die belt vanuit een rijdende cabine met stationair draaiende diesel en een Bluetooth-headset is een ander probleem. We hebben de word-confidence-threshold van het model voor Pools verlaagd naar 0,62 en een deterministische fallback toegevoegd: als de agent in drie pogingen geen referentienummer kan krijgen, biedt hij aan om de beller een korte link te sms'en die hij kan aantikken om te bevestigen. Ongeveer 4% van de Poolse gesprekken valt terug op die route. Ongeveer 0,7% van de Nederlandse gesprekken.
We hebben de recognizer ook vooraf geladen met de productlijst van de groothandel, in beide talen, als custom vocabulary. De grootste accuracy-sprong op dag één kwam van het aanleren aan het model dat "paksoi" een woord is, dat "pak choi" hetzelfde woord is, en dat "Chinese kool" in context hetzelfde woord kan zijn. Niets daarvan is exotisch. Alles brak het standaardvocabulaire.
Het budget van 35 seconden
Waar de operations-directeur het meest om gaf, was wall-clock. Hij had zijn oude door mensen opgenomen calls gemeten, en de mediaan was 2 minuten 11 seconden, omdat het grootste deel van die tijd erin zat dat de planner naar het tweede scherm liep om het routebestand op te halen. Hij wilde de agent onder de 40 seconden end-to-end.
We kwamen uit op 35 seconden voor de mediane statuscall, inclusief begroeting, verificatie, de lookup, het uitgesproken antwoord en de afsluiting. Dat getal is belangrijk, omdat het het verschil is tussen een chauffeur die aan de lijn blijft en een chauffeur die ophangt om direct dispatch te bellen.
Waar de 35 seconden naartoe gaat:
greeting + language lock 2.4s
CLI match + verify (if needed) 6.8s
NAV view lookup (cached path) 0.9s
route-planner file read 1.6s
TTS answer (with pallet + ETA) 11.0s
caller confirmation + close 12.3s
De twee lange regels in dat lijstje zijn de menselijke, niet de machinale. De lookup en het lezen van het bestand zitten samen onder de 3 seconden. Het grootste deel van het budget gaat naar mensen die praten en luisteren, wat prima is, want dat is het deel dat de agent niet kan opjagen.
De randvoorwaarde die ertoe deed was wall-clock, niet accuracy. Een agent met 96% accuracy die in 35 seconden antwoordt, verslaat een agent met 99% die er 90 over deed.
De kwaliteitsklacht doorrouteren
De ene intent die we altijd naar mensen doorzetten, was kwaliteitsklachten.
In de Nederlandse versbranche is een "kwaliteitsklacht" het gesprek waarin de afnemer zegt dat de sla warm aankwam, dat de aardbeien gekneusd waren, of dat de kruiden condens vertonen in het bakje. Zulke gesprekken kunnen uitdraaien op creditfacturen, retourzendingen of beschadigde telersrelaties, en dat is niet het soort gesprek dat je in 2026 door een voice agent jaagt.
De agent luistert naar een kleine set triggers: woorden als klacht, kapot, warm, bruin, schimmel, plus hun Poolse equivalenten (skarga, zepsute, ciepło, brązowy, pleśń), plus een intent classifier die de beleefdere bewoordingen oppikt. Bij een trigger routeert het gesprek naar de logistiek planner van dienst, met een korte gestructureerde overdracht: naam van de beller, klantcode, orderreferentie, de beste inschatting van de agent over het type klacht, en een schone opname van de laatste 20 seconden.
De planner neemt gemiddeld binnen zo'n 8 seconden op. De beller hoeft zichzelf nooit te herhalen. De opname speelt in de headset van de planner, niet op de speaker, dus hij hoort het terwijl hij nog in het gesprek zit. Als je een voice agent bouwt voor een bedrijf met echte aansprakelijkheid, dan zit de slimme zet niet in de agent klachten laten afhandelen. De slimme zet zit erin de overdracht naar een mens onzichtbaar te maken.
Hoe 90 dagen productie eruitzagen
Cijfers uit de eerste 90 dagen, allemaal gemeten tegen de voorgaande 90 dagen als baseline:
- 1.640 calls per week opgenomen door de agent, tegen 1.420 per week die eerder door mensen werden opgenomen (de agent pakt calls die voorheen naar voicemail rolden)
- Mediane antwoordtijd: 35 seconden (was 131 seconden)
- Aandeel dat naar een mens wordt geroute: 11% (doel was onder de 15%)
- Kwaliteitsklacht binnen 30 seconden bij een planner: 94% van de gevallen
- Poolstalige gesprekken volledig end-to-end afgehandeld: 27% van het totaal (was 0%, omdat niemand in het dagteam vloeiend Pools sprak)
- Teruggewonnen werkvloertijd: ongeveer 17 uur per week, verdeeld over het team
Het getal dat de CFO verraste, stond niet in dat rijtje. Het was dat de nachtploeg, die voorheen zo'n 80 calls tussen 22:00 en 06:00 afhandelde, er geen één meer deed. De agent nam ze allemaal over. De nachtploeg gebruikt die tijd nu om de uitgaande pallets voor de ochtend voor te bereiden, waardoor de laadstart van 06:30 verschuift naar 06:18. Twaalf minuten eerder is twaalf minuten meer slaap voor elke chauffeur in de route.
Wat dit niet is
Een paar dingen die deze bouw niet deed, en niet probeerde te doen.
Het verving NAV niet. Dat gaat het ook niet doen. De groothandel draait NAV 2009 tot de dag dat ze overstappen op wat er daarna komt, en dat hebben ze nog niet gekozen. Daar ligt apart werk voor op tafel, en dat is niet dit project.
Het moderniseerde hun operatie niet. Het nam de telefoon op. Dat is één workflow. De reden dat het werkt is dat de workflow smal is en de integratie eerlijk.
Het heeft niemands baan gered. De twee parttime telefonisten gingen toch al met pensioen. Door de agent hoefde het bedrijf die rollen niet opnieuw in te vullen, en kon de rest van het team stoppen met om de zes minuten onderbroken worden tijdens de ochtendspits.
Het kleinste wat je vandaag kunt doen
Kijk eens een week lang naar het inbound-call-logboek van één van je nummers. Tel hoeveel van de gesprekken één van drie dingen zijn: een statusvraag, een slot-bevestiging of een klacht. Als dat aandeel boven de helft ligt, heb je dezelfde vorm van het probleem dat deze groothandel had.
Toen we de voice agent voor deze Bredase groothandel bouwden, was het onderdeel dat ons verraste niet het spraakmodel of het wisselen van talen, het was de file drop van de routeplanner uit 2011 en hoe netjes die overeind bleef toen er een nieuwe beller aan de andere kant zat. Wil je zien hoe we dit soort werk aanpakken, dan ligt de pagina AI-agents het dichtst bij dit verhaal.
Kern
Een voice agent die een oude telefoonlijn netjes afhandelt, verslaat een nieuwe ERP die de hele stack overnieuw schrijft. Volg de contouren van het legacy-systeem; vecht er niet tegen.
FAQ
Hoe verbind je een moderne voice agent met een oude ERP zoals Navision 2009?
Via een read-only SQL view die wordt gespiegeld vanuit een read replica, plus een kleine write-queue. De productie-NAV-instantie raak je nooit aan. De agent leest de view; planners schrijven terug via de queue.
Waarom twee ASR-modellen in plaats van taaldetectie?
Nederlands-Pools code-switching komt vaak voor in versbranche-calls. Twee recognisers de eerste 2,5 seconden laten draaien en het gesprek vastzetten op de winnaar is betrouwbaarder dan één model vragen de taal midden in een zin te detecteren.
Wat blijft in deze bouw bij mensen?
Kwaliteitsklachten, alle nieuwe orders, en alles waar de confidence van de agent zakt. De overdracht bevat de klantcode, orderreferentie, een inschatting van de klacht en de laatste 20 seconden audio.
Hoe lang duurde het voordat dit live stond?
Ongeveer negen weken van kickoff tot eerste productiecall, daarna vier weken tunen. Het meeste werk zat aan de NAV-kant en in het bestandsformaat van de routeplanner, niet in de voice stack zelf.