Email automation
NCTS-T1 e-mailtriage: hoe een Venlose expediteur 16:30 haalt
Het is 15:48 in Venlo. Zes NCTS-T1-referenties zitten ongelezen in de mailbox, drie van EORI's die de balie nooit eerder zag, en de cutoff in Aachen-Süd is nog veertig minuten weg.

Het 16:30-probleem
Stel je de douanebalie voor van een Venlose expediteur met 29 medewerkers, een dinsdagmiddag in februari. Het is 15:48. In de gedeelde mailbox staan 412 ongelezen mails van die ochtend. Zes daarvan zijn NCTS-T1-referenties voor trailers die vóór de 16:30-cutoff van Aachen-Süd door moeten. Drie hebben een verzender-EORI die het bedrijf nog nooit heeft gezien. De senior douane-expert zit in een klantgesprek. De junioren zoeken in een Oracle 12c-archief dat niets teruggeeft, tenzij je de naam van de afzender exact spelt zoals iemand 'm in 2017 heeft ingetikt.
Mist ook maar één van die zes T1's de 16:30, dan blijft de trailer tot de ochtend aan de grens staan, brandt de chauffeur zijn rijtijd op onder EU-verordening 561/2006, en belt de klant nog vóór het ontbijt.
Dit was de situatie waar we in oktober 2025 binnenstapten. Twaalf weken later verwerkte dezelfde balie gemiddeld 2.940 douanemails per week, zonder ook maar één cutoff in Aachen-Süd te missen. Zo hebben we dat gedaan.
De legacy die je niet kunt vervangen
Elke expediteur waar we in Nederland, Duitsland of België mee hebben gewerkt, heeft dezelfde stack: een douaneplatform van vóór 2015, een eigen manifest-archief dat een zekere Henk in PL/SQL geschreven heeft, een mailclient, en een wandkalender met de Duitse feestdagen in rood gemarkeerd.
Onze klant in Venlo draaide Descartes Customs Filing voor de aangiften en een eigen Oracle 12c-manifestarchief van vóór de huidige eigenaar. De Descartes-installatie werkte. Het Oracle-archief werkte. Geen van beide krijgt nog formele leverancierssupport — Oracle Database 12.2 viel volgens het Oracle Lifetime Support Policy in 2022 buiten premier support — en geen van beide ging de komende achttien maanden ergens heen. Probeer een operationeel team van 14 man maar eens hun TMS te laten omruilen midden in de najaarspiek.
Dus we hebben niets gemigreerd. We hebben een e-mailagent vóór de bestaande stack gezet, hem leesrechten op beide systemen gegeven, en de mensen hun gereedschap laten houden.
Hoe 2.940 mails per week er echt uitzien
De balie krijgt grofweg vijf soorten mail per dag:
- NCTS-T1- en T2-referenties van vervoerders die om afhandeling vragen — ongeveer 60% van het volume.
- Manifestvragen van ontvangers die willen weten waar hun zending in het Oracle-archief staat — ongeveer 18%.
- Correspondentie van de Bundeszollverwaltung: ATB-meldingen, controleopdrachten, vrijgavebevestigingen — ongeveer 12%.
- Interne overdrachtsmails tussen Venlo en de agent in Aachen-Süd — ongeveer 7%.
- De rest: facturen, klachten, mailinglijsten, phishing — ongeveer 3%.
Voor het project landde elk van die mails in één gedeelde mailbox: douane@. De balie sorteerde ze met de hand. Alleen de triagestap kostte zo'n 14 uur per week, voordat iemand een echte aangifte had aangeraakt.
Waarom onbekende EORI's het hele spel zijn
Een NCTS-T1 met een bekende verzender-EORI is een bekend probleem. De balie heeft papieren van dat bedrijf, een kredietcheck in het dossier, en een prijssjabloon. De mail kan automatisch bevestigd worden en gaat naar de junior die de klant doet.
Een NCTS-T1 met een onbekende verzender-EORI is een ander beest. Het kan een nieuwe klant zijn met een eerste zending. Het kan een expediteur stroomafwaarts zijn die de mail verkeerd doorstuurde. Het kan fraude zijn: iemand probeert een schoon importeursprofiel aan een vuile zending te knopen. Tot een mens beslist welke van de drie, is het veiligst: stoppen.
De fout die teams maken, is die mails in dezelfde wachtrij laten staan als de routine. De senior expert vindt ze om 16:25, vijf minuten voor de cutoff, en moet kiezen: de T1 toch indienen tegen een niet-geverifieerde EORI en het risico nemen, of de deadline missen en de klant verliezen.
Bouw je een douane-triageagent die onbekende-EORI-T1's behandelt als zomaar een classificatieprobleem, dan heb je een aansprakelijkheid gebouwd. Het juiste ontwerp is om ze te parkeren — zichtbaar, hoorbaar — in een aparte wachtrij met een deadlineklok eraan.
De agent, in drie lagen
Het systeem heeft drie lagen. Geen ervan is op zichzelf bijzonder. De waarde zit in de koppeling.
Laag 1: classificatie met een douane-prompt
Elke binnenkomende mail wordt over IMAP IDLE uit de gedeelde mailbox gehaald. Een vision-model leest de body en eventuele PDF-bijlagen — de meeste NCTS-T1-referenties komen als PDF binnen — en geeft een JSON-envelope terug:
{
"category": "ncts_t1",
"mrn": "26NL00000123456789",
"sender_eori": "NL854321987",
"consignor_name": "Vermeer Cargo BV",
"office_of_destination": "DE004600",
"estimated_arrival_utc": "2026-02-17T14:50:00Z",
"confidence": 0.94
}De categorieën zijn een gesloten lijst: negen waarden, gekoppeld aan de bestaande mappenstructuur van de balie. We hebben geen taxonomie verzonnen. We hebben die overgenomen die de senior expert al elf jaar gebruikte.
Laag 2: lookups in Descartes en Oracle
De EORI uit laag 1 wordt parallel tegen drie bronnen gecheckt:
- De klantentabel van Descartes Customs Filing, ontsloten via de REST-interface.
- Het Oracle 12c-manifestarchief, via een read-only databasegebruiker en één geïndexeerde query op
consignor_eori. Die index hebben we toegevoegd. Het kostte elf minuten downtime op een zaterdag. - De publieke EORI-validatieservice van de Europese Commissie, om te bevestigen dat het nummer syntactisch klopt en op dit moment actief is.
Geven alle drie een match terug en staat de EORI bij de klant in het dossier, dan gaat de mail naar de routinewachtrij, wordt er een bevestiging opgesteld, en wordt de aangifte in Descartes voorgevuld met de waarden uit de JSON-envelope. De mens checkt en dient in.
Laag 3: de wachtrij van de douane-expert
Staat de EORI niet in het dossier, of geeft één van de bronnen niets terug, dan wordt de mail geparkeerd in een aparte Outlook-map met de naam NCTS-onbekend. Elk item in die map heeft een sorteerbare kolom met de minuten tot de cutoff van het betreffende Duitse douanekantoor. Voor Aachen-Süd is dat 16:30 CET. Voor Kehl 16:00. Voor Frankfurt-Flughafen 17:30.
De senior expert opent die map twee keer per dag. Items staan gesorteerd op deadline, oplopend. De agent heeft de EORI-lookup al gedaan, het bijbehorende manifest-PDF uit Oracle aangehangen, en drie mogelijke antwoorden opgesteld. De mens leest, kiest er één, dient in.
Wat de cijfers zeggen na twaalf weken
We meten vier dingen. De getallen hieronder zijn het voortschrijdend vierwekengemiddelde over de periode tot 13 juni 2026.
- Mails per week verwerkt: 2.940, was 2.610. Het volume groeide omdat de balie een contract aannam dat ze eerder hadden afgewezen wegens capaciteit.
- Triagetijd: 1,8 uur per week voor het hele team, was ongeveer 14.
- NCTS-T1's ingediend na 16:00 voor een 16:30-cutoff: 6 in twaalf weken, was rond de 40 per twaalf weken.
- Gemiste cutoffs Aachen-Süd: nul, was drie per kwartaal.
Het cijfer waar de klant het meest om geeft, is het laatste. Nul gemiste cutoffs over een volledig piekkwartaal: dát rechtvaardigt het project. De rest is meegenomen.
De gotcha's die we tegenkwamen
Drie dingen verliepen niet volgens plan, en die zijn het benoemen waard.
Rate limits op de Descartes-API. De REST-interface op de on-premise Descartes-installatie gooit zonder pardon een 429 als je meer dan zes parallelle klantlookups doet. We zijn geëindigd met een kleine Redis-semaphore vóór elke Descartes-call. Saai. Nodig.
Character sets in Oracle 12c. Het legacy-archief was aangemaakt met WE8MSWIN1252 als database-characterset. Afzendernamen met Poolse of Tsjechische diakritieken — Łukasiewicz, Šafařík — stonden er als mojibake in. Onze exact-match-query miste ze. We hebben de index herbouwd tegen een genormaliseerde lowercase-ASCII-kolom, en de recall ging van 71% naar 99,4%.
De 16:30-timer is geen 16:30. De Bundeszollverwaltung publiceert 16:30 als cutoff voor Aachen-Süd, maar in de praktijk neemt het kantoor op vrijdagen vóór een feestdag vanaf 16:15 geen nieuwe T1's meer aan. De senior expert wist dat. De agent niet, totdat we een Duitse feestdagenkalender en een vrijdag-voor-feestdag-regel hebben toegevoegd.
Een douane-e-mailagent, tot op het skelet uitgekleed, is een routeersysteem met een deadlineklok eraan vast. Het model bepaalt wat voor mail het is. De lookups bepalen of een mens er nog naar moet kijken. De klok bepaalt wie er in paniek raakt.
Wat we anders zouden doen
De grootste fout die we maakten, was de eerste sprint richten op "classificeren en antwoorden". We hadden moeten richten op "parkeer de onbekenden". Alleen classificeren levert je ongeveer drie uur per week op. Onbekenden in een op deadline gesorteerde wachtrij krijgen, levert je het cijfer voor gemiste cutoffs op — en dát is het cijfer waar een expediteur een verlengingscontract op tekent.
Kijk je naar een vergelijkbaar probleem, dan is dit de kleinste versie van de bouw die de business case in week één had bewezen: een script dat de gedeelde mailbox leest, elke binnenkomende NCTS-T1-PDF door een vision-model haalt, de verzender-EORI extraheert, je klantentabel queryt, en elke misser in een map gooit met de naam NCTS-onbekend en een kolom voor minuten tot cutoff. Dat alleen al, vóór er één antwoord opgesteld of één database geïntegreerd is, had deze balie in de eerste maand drie middagen gescheeld.
Toen we de e-mailagent voor de balie in Venlo bouwden, bleven we tegen dat Oracle-characterset-probleem hierboven aanlopen. We hebben het uiteindelijk opgelost met een genormaliseerde ASCII-index en een nachtelijke reconciliatiejob, maar de les bleef hangen: de legacy-database is altijd vreemder dan de README beweert.
Run je vandaag een douane- of logistieke balie, dan is dit de audit van vijf minuten: open je gedeelde mailbox, sorteer op afzender, en tel hoeveel mails er deze week kwamen van EORI's die niet in je klantentabel staan. Dat getal is de omvang van je triageprobleem.
Kern
Douane-e-mailautomatisering is een routeersysteem met een deadlineklok eraan: parkeer elke onbekende-EORI-T1 in een eigen wachtrij, gesorteerd op minuten tot cutoff.
FAQ
Waarom niet eerst weg van Descartes Customs Filing en Oracle 12c?
Beide systemen werken en het team kent ze. Een TMS vervangen in de najaarspiek is een gegarandeerde ramp. De agent staat met leesrechten vóór de bestaande stack, dus migratie is niet nodig.
Wat gebeurt er met een NCTS-T1 met een onbekende verzender-EORI?
Die wordt geparkeerd in een aparte Outlook-map genaamd NCTS-onbekend, met een kolom voor de minuten tot de cutoff van het bestemmingskantoor. De senior expert pakt die map twee keer per dag op.
Hoe weet de agent wanneer de cutoff in Aachen-Süd verschuift?
We hebben een Duitse feestdagenkalender toegevoegd en een regel die de cutoff op de vrijdag vóór een feestdag naar 16:15 schuift. De gepubliceerde 16:30 is niet altijd het werkelijke tijdstip.
Wat was de grootste winst in het project?
Nul gemiste cutoffs in Aachen-Süd over een volledig piekkwartaal, was drie per kwartaal. Dat is het cijfer dat de bouw en de verlenging rechtvaardigde.