← Blog

Email automation

Email automation in een advocatenkantoor: Kleos en NOvA

Een Haarlems advocatenkantoor krijgt 1.820 cliëntmails per week. Triëren, conflictcheck, opstellen, archiveren — zonder één reply die NOvA-gedragsregel 5 schendt.

Jacob Molkenboer· Oprichter · A Brand New Company· 31 dec 2025· 10 min
Crème envelop met lakzegel, koperen briefopener, groene pochet, ivoren kaart met groen lint, koperen bel op ivoren bureau.

Maandag, 08:14, Haarlem

De managing partner opent Outlook. 1.820 ongelezen. Dat is wat er over een weekend binnenkomt bij een advocatenkantoor van 28 mensen dat ondernemingsrecht, arbeidsrecht, familierecht en een flink stuk pro deo doet. Van die 1.820 zijn er ongeveer 60 urgent. Zo'n 30 blijken dezelfde cliënt te zijn die twee medewerkers en een partner tegelijk mailt over dezelfde zaak. Zes zijn nieuwe prospects. Twaalf komen van de wederpartij. Eén — en dat is de bedoelde — is een verzoek van een partij die elders in het kantoor al wordt vertegenwoordigd tégen het bedrijf van de afzender. Dat is een NOvA-regel-5-probleem voordat één medewerker haar eerste koffie heeft gehad.

Dit is de playbook voor het uitrollen van een email-automation agent in precies die situatie. We gaan je niet vertellen wat je moet kopen. We vertellen je in welke volgorde je het bouwt, welke grenzen de agent nooit mag overschrijden, en de drie dingen die misgingen voordat het werkte.

Het intake-probleem, in cijfers

Voordat een model ook maar één inbox aanraakte, lazen we twee weken lang mail. Niet de berichten zelf — dat zou de geheimhoudingsplicht schenden waar het kantoor zich onder NOvA-gedragsregel 3 al aan had verbonden. We haalden headers, adressen, groottes en onderwerppatronen door een script dat de partners hadden ingezien en goedgekeurd.

Van de 1.820 mails per week:

  • 1.140 zaten al in een bekend dossier — contact in Kleos, dossiernummer in het onderwerp of de body.
  • 410 waren bekende cliënten maar het dossier was onduidelijk: één cliënt, vier zaken.
  • 180 waren nieuw — prospect-intake, wederpartij, rechtbank of leverancier.
  • 90 waren ruis: nieuwsbrieven, agenda-spam, de onvermijdelijke LinkedIn-reacties.

Die verdeling bepaalt de architectuur. Alles wat hierna komt, is een gevolg van die vier getallen.

Waarom we niet met de agent zijn begonnen

De reflex, als een partner vraagt om “AI in de inbox”, is om een model aan te sluiten op Microsoft Graph, het op de gedeelde mailbox te zetten en het laten opstellen. Dat hebben we niet gedaan. Het eerste wat we bouwden was de belangenconflict-gate, en die draaide zes weken zonder ook maar één reply op te stellen.

De reden is tuchtrechtelijk en de reden is ook saai. Onder NOvA-gedragsregel 5 mag de advocaat niet optreden voor twee partijen met tegenstrijdige belangen, of tegen een voormalige cliënt in een verwante zaak. Een opgesteld antwoord — zelfs een ontvangstbevestiging — dat naar de verkeerde partij gaat, is in de ogen van de deken het kantoor dat optreedt. We moesten weten dat we de conflictcheck konden vertrouwen voordat de agent mocht spreken.

Waarschuwing

Een automatische ontvangstbevestiging aan een nieuwe prospect is geen neutrale handeling. Als die prospect al wederpartij is in een dossier twee verdiepingen hoger, heb je net een klachtdossier bij de lokale deken geopend. Bouw de conflict-gate vóór de drafter.

De Kleos-brug die niet bestond

Kleos is het dossiermanagementsysteem van Wolters Kluwer waarop een aanzienlijk deel van de middelgrote Nederlandse kantoren draait. Dit kantoor zat er veertien jaar op. Dat is een voordeel en een probleem. Het voordeel is veertien jaar partijgegevens, dossierhistorie en bekende conflicten. Het probleem is dat het kantoor nog op een legacy on-premise versie zat, zonder publieke API verder dan een verouderde SOAP-endpoint en een SQL-replica die de IT-manager voor de accountant had ingericht.

We hebben niet aangedrongen op een upgrade. Het kantoor had grotere zorgen. In plaats daarvan bouwden we een read-only sync van de SQL-replica naar een Postgres-mirror — partijen, dossiers, status, wederpartijen — die elk kwartier ververst. De agent raakte Kleos nooit direct aan. Hij queryde de mirror.

-- De query in het hart van de conflict-gate.
-- Gegeven een afzender + geëxtraheerde entiteiten:
-- staat een van hen aan de tegenpartij in een lopend dossier?

SELECT d.dossier_nr, d.matter_type, p.role, p.display_name
FROM   dossier_parties p
JOIN   dossiers d ON d.id = p.dossier_id
WHERE  d.status IN ('open', 'in_behandeling')
AND    (
         p.email           = ANY($1::text[])
      OR p.kvk_number      = ANY($2::text[])
      OR p.normalised_name = ANY($3::text[])
       )
AND    p.role IN ('wederpartij', 'tegenpartij_advocaat');

Drie sleutels: e-mail, KvK-nummer, genormaliseerde naam. De derde verdiende zijn geld. Nederlandse rechtspersonen worden binnen één dossier doorgaans op vier manieren geschreven. We normaliseerden op kleine letters, knipten rechtsvormsuffixen weg, verwijderden diakritische tekens en draaiden een tri-gram-match. False positives zijn hier prima. False negatives beëindigen carrières.

De conflict-gate, end to end

Elke binnenkomende mail doorloopt dezelfde zes stappen voordat er een draft wordt opgesteld:

  1. Headers strippen en parsen: from, to, cc, references, in-reply-to.
  2. Entiteiten uit de body extraheren — namen, bedrijfsnamen, KvK-nummers, BSN-patronen (en die meteen redacten).
  3. De afzender opzoeken in de Kleos-mirror.
  4. De conflict-query hierboven draaien tegen elke geëxtraheerde entiteit, inclusief historische partijen uit de archiefindex.
  5. Bij elke hit: de mail parkeren in de partner-queue, geen draft, geen auto-reply, geen leesbevestiging.
  6. Schoon: doorzetten naar de drafter met de gematchte dossiercontext.

De partner-queue is geen map. Het is een kleine webview met drie knoppen — vrij, conflict bevestigd, deken raadplegen — en een audit log dat het kantoor op verzoek aan een tuchtrechter kan overhandigen. Het audit log is het echte resultaat. Het dashboard is het bijproduct.

De ontvangstbevestiging opstellen

Pas na zes weken alleen-de-conflict-gate lieten we de agent opstellen. En zelfs toen was de eerste draft een ontvangstbevestiging. Niets inhoudelijks. Niets dat als juridisch advies gelezen kon worden. De template:

Geachte {aanhef} {achternaam},

Wij hebben uw bericht in goede orde ontvangen en hebben
dit toegevoegd aan dossier {dossier_nr}. {behandelend_advocaat}
neemt binnen {sla_uren} werkuren contact met u op.

Mocht uw bericht spoedeisend zijn, dan kunt u bellen op
{telefoon_dossier}.

Met vriendelijke groet,
namens {behandelend_advocaat}
{firm_name}

Vijf variabelen, één toonregister, geen mening. We logden elke verzending. Het model vulde alleen slots; het schreef geen proza. Die keuze is bewust. Vrije tekst opstellen voor een tuchtrechtelijk gereguleerd beroep is een probleem dat je in week één niet nodig hebt. Misschien nooit. Het algemene principe is klein en duurzaam: de kleinste reply die de agent kan sturen is de veiligste. Slot-filling verslaat vrije-tekstgeneratie voor elk gereguleerd beroep, zeker in de eerste negentig dagen.

Het Outlook 2016-archiefprobleem

Het kantoor had een zelfgebouwd archief: elke verstuurde en ontvangen mail sinds 2016 op een netwerkshare met PST-bestanden, één per medewerker per jaar, geïndexeerd door een Python-script van een inmiddels gepensioneerde IT-lead. Dat archief telde mee omdat conflictchecks historische context nodig hadden. Was deze afzender ooit partij in een gesloten dossier?

We hebben de PST's niet gemigreerd naar een modern systeem. Het kantoor had geen behoefte aan een Exchange Online-migratie in hetzelfde kwartaal. We deden in plaats daarvan dit:

  1. Eenmalige extractie. We mountten de PST's read-only en gebruikten libpff om headers, partijlijsten en message-IDs in Postgres te trekken. De berichten zelf bleven staan waar ze stonden.
  2. Een nachtelijke delta. Nieuwe mail sinds de laatste extractie werd om 03:00 binnengehaald via hetzelfde script. De IT-manager is eigenaar van de cron.
  3. Hash-only-lookup voor de agent. De conflict-gate queryt headervelden en partij-hashes — nooit de body — tegen de archiefindex.

Die beslissing scheelde ongeveer vier maanden projecttijd en één carrière-bekortende migratie. We weten dat PST's mounten al jaren een bekend kwetsbare operatie is; Microsoft documenteert de bestandsgrootte- en corruptieproblemen op .pst-stores al jaren. We draaiden de extractie op één VM, nooit parallel, en kopieerden de bestanden voordat we ze lazen.

Het false-positive-budget bijstellen

Tegen week vier parkeerde de gate ongeveer 61 mails per week. Het secretariaat — twee mensen — werkte die queue elke ochtend binnen een uur weg. Dat uur was de kostprijs van het systeem. We probeerden 'm niet omlaag te krijgen. We probeerden wél elke parkering uitlegbaar te maken: elke entry droeg de drie sleutels die 'm triggerden, de betrokken dossiernummers en de tri-gram-score die de match over de streep duwde. False positives zijn prima als je ze in vijf seconden wegklikt. Ze worden vervelend als je er tien minuten over moet nadenken.

We hebben de match-threshold precies één keer bijgesteld, in week vier, van 0,78 naar 0,72. Die verschuiving haalde ongeveer elf mails per week van het auto-clear-spoor naar de partner-queue. Het secretariaat was drie werkdagen geïrriteerd op ons. Daarna ving de gate in week acht een conflict met een oud-cliënt dat door de oude threshold heen zou zijn gelopen. Niemand klaagde meer over de werkdruk. Het derde wat we fout deden, was aannemen dat we de threshold uit een sample konden kiezen; dat kun je niet. De enige eerlijke manier is twee weken ruim draaien en op de missers aanscherpen.

Twaalf weken later: wat we maten

De conflict-gate ging live in week één. Drafting ging live in week zeven. In week twintig zaten we met de managing partner aan tafel en keken we naar de cijfers.

  • 1.820 mails per week werden 1.790 unieke threads nadat de deduper het cc-verkeer binnen dezelfde thread had opgegeten.
  • 61 mails per week geparkeerd in de partner-queue. Daarvan waren er 4 bevestigde conflicten die anders een auto-reply hadden gekregen. De andere 57 waren voorzichtigheid.
  • Ontvangstbevestigingen mediaan binnen 6 minuten verstuurd, omlaag van 4,5 uur.
  • Teruggewonnen uren bij medewerkers: het kantoor noteerde 11 uur per week, vooral uit secretariaat-triage en uit het feit dat medewerkers geen mail meer hoefden te bevestigen vóór de lunch.
  • Nul tuchtklachten gerelateerd aan het systeem. Het audit log werd één keer doorgenomen door de eigen compliance officer van het kantoor; dat was de enige toets.

Vier conflicten in twaalf weken is geen marketingnummer. Het is het getal dat het project bij de partners verantwoordde. Eén van die vier was een oud-cliënt van een partner die in 2019 met pensioen ging; de enige plek waar die partij nog bestond, was het PST-archief. Zonder de archiefindex had de agent geantwoord.

Wat je vanmiddag kunt doen

Beheer je een inbox bij een gereguleerd kantoor en lees je dit met de gedachte misschien: trek twee weken mailheaders eruit, tel de vier categorieën hierboven en beantwoord één vraag — hoe zou je weten dat een auto-reply naar de verkeerde partij ging? Kun je dat niet in één zin beantwoorden, dan ben je niet klaar om te draften. Je bent klaar om de conflict-gate te bouwen.

Toen we dit bouwden voor het Haarlemse kantoor, was het stuk dat we onderschatten de normalisatie van Kleos-partijnamen: Nederlandse rechtspersonen worden binnen één dossier op vier manieren geschreven, en de agent valt dicht op elke spelling die hij niet kent. We losten het op met de tri-gram-match en een wekelijkse review van bijna-missers door het secretariaat. Zit jouw team op hetzelfde probleem, dan is dat het soort werk dat we doen in onze AI-agents-praktijk.

Kern

Bouw eerst de belangenconflict-gate en laat hem zes weken alleen draaien voordat de agent ook maar één reply opstelt — het audit log is de echte deliverable.

FAQ

Waarom de agent niet vanaf dag één antwoorden laten opstellen?

NOvA-gedragsregel 5 maakt een verkeerd-geadresseerde draft tot een tuchtrechtelijke kwestie. Door eerst zes weken alleen de conflict-gate te draaien, vertrouwde het kantoor het audit log voordat er één antwoord uitging.

Hoe koppel je aan een legacy on-premise Kleos-installatie?

We koppelden niet direct aan Kleos. We syncten read-only vanuit de SQL-replica naar een Postgres-mirror elk kwartier, en de agent queryt die mirror.

Wat deden jullie met het Outlook 2016 PST-archief?

Headers en partijlijsten werden met libpff in een Postgres-index getrokken. De berichten zelf bleven staan. De conflict-gate queryt hashes, nooit de body.

Wat was de kleinste eerste draft die de agent mocht versturen?

Een ontvangstbevestiging op basis van slot-filling: aanhef, naam, dossiernummer, behandelend advocaat, SLA-uren, spoednummer. Vijf variabelen, geen mening, geen vrije tekstgeneratie.

Hoeveel echte conflicten ving de gate?

Vier in twaalf weken, uit 61 wekelijkse parkeringen in de partner-queue. Eén kwam alleen uit de PST-archiefindex — een oud-cliënt van een partner die in 2019 met pensioen ging.

email automationai agentsautomationcase studyintegrationsworkflow

Iets bouwen?

Start een project