Lees deze leveranciersfactuur in, reken hem na en laat zien welke regels
niet kloppen met wat we in Exact hebben staan.
Inkoopfacturen automatisch verwerken klinkt als een opgelost probleem. Er zijn genoeg diensten die een PDF inlezen en er velden uit halen. Maar wie inkoopt bij een vaste groep leveranciers en elke regel wil vergelijken met zijn eigen artikelen, heeft meer nodig dan velden. Je wil weten of de factuur klopt, tot op de cent, en zo niet, welke regel het is.
Wij bouwden dat voor een drankengroothandel met slijterij die met Exact Online werkt. Het leest nu de facturen van tien leveranciers, en ongeveer 97 procent sluit tot op de cent. Dit is hoe, en wat er op facturen staat dat je niet verwacht. De klant en de leveranciers blijven anoniem en er staan hier geen bedragen, prijzen of marges.
Een lezer per leverancier, geen slimme herkenning
De eerste keuze was de opvallendste: we gebruiken geen AI en geen tekstherkenning om de facturen te lezen. Elke leverancier heeft een eigen lezer, een stuk gewone code dat precies weet hoe zijn factuur eruitziet.
Dat klinkt ouderwets, maar het heeft drie voordelen. Dezelfde factuur levert altijd dezelfde uitkomst op. Elke lezer is te testen op echte facturen. En als een leverancier zijn opmaak verandert, faalt de lezer zichtbaar in plaats van stilletjes iets anders te lezen.
Voor tien vaste leveranciers is dat goedkoper en preciezer dan herkenning die het meestal goed doet. De lezers zijn wel met een AI-assistent gebouwd. Het verschil zit in wat er draait: gewone code die je kunt nalopen.
Eerst tekst, met de opmaak erbij
Een PDF met een tekstlaag wordt eerst platte tekst, met de kolommen op hun plek. Daar herkent de app de leverancier aan een vaste tekst, zoals een webadres of een bedrijfsnaam, en geeft hem aan de juiste lezer.
Bij één leverancier staat het hele briefhoofd er als plaatje in. Er is dan geen naam om op te herkennen. Die herkennen we aan een vaste regel onderaan de factuur, een juridische vermelding die altijd hetzelfde is. Elektronische facturen in UBL zijn het makkelijkst: die lees je zonder herkenning, veld voor veld.
Narekenen, tot op de cent
Lezen is de helft. Daarna rekent de app na. Tellen de regels plus de factuurkosten op tot het bedrag exclusief btw, zonder statiegeld? Klopt de btw per tarief? Zit er een verschil van meer dan een cent, dan staat de factuur bovenaan met de regel die het veroorzaakt.
Een belangrijke keuze daarbij: rekenen met exacte decimalen, niet met de kommagetallen die een computer standaard gebruikt. Die laatste maken van 0,1 plus 0,2 net geen 0,3, en over veertig regels tel je zo een cent bij elkaar die er niet is. Geld rondt af volgens een vaste regel, en die regel staat in de code en in de tests.
Wat er op een factuur staat dat je niet verwacht
Hier zit het echte werk. Een greep uit wat we tegenkwamen bij tien leveranciers:
Een toeslag die alleen in de voet staat. Een vast bedrag per fles over de hele factuur, niet op de regels. Wie alleen de regels leest, rekent met een te lage inkoopprijs.
Gratis flessen op een eigen regel. Soms als regel met prijs nul, soms als korting met een min ervoor, soms als proefflessen onderaan. Elke variant moet naar dezelfde boeking.
Prijs per doos, per fles, per fust. De ene leverancier factureert per stuk, de andere per doos van zes of per krat. Het aantal op de factuur zegt niets zonder de eenheid erbij.
Statiegeld en emballage. Per regel, in de voet, of als aparte regel met een eigen btw-tarief. Het hoort niet bij de inkoopprijs van het product, en moet er dus uit.
Kosten die op transport lijken. Een brandstoftoeslag is geen product. Die gaat als transportkosten mee, niet als artikel.
Drie jaar archief als test
Facturen van de afgelopen weken zijn een goed begin, maar de echte uitzonderingen zitten in oudere facturen. We haalden daarom drie jaar inkoopfacturen uit het archief in Exact, ruim 1.800 documenten, en lieten ze allemaal door de lezers lopen.
Dat leverde een lijst op die je nooit verzint: een leverancier die twee jaar geleden Engelse getallen gebruikte, een kolom die in oude facturen ontbreekt, een factuurdatum die er soms niet op staat. Elke lezer is daarop aangepast, met de oude factuur als test erbij.
Creditnota's lezen we alleen in een aparte stand. Een gewone upload weigert ze, zodat een creditnota nooit per ongeluk als factuur geboekt wordt. Scans zonder tekstlaag en losse overzichten kunnen niet gelezen worden; die staan op een lijst onder de cijfers, zodat je weet hoe volledig het beeld is.
Elke lezer, een test op een echte factuur
Elke lezer heeft tests op echte facturen van die leverancier: wat erin gaat en wat er precies uit moet komen. Wordt een lezer verbeterd, dan lopen alle oude facturen opnieuw mee. Facturen die al in de app staan, kun je daarna opnieuw laten inlezen met de verbeterde lezer.
Veelgemaakte fouten
Rekenen met gewone kommagetallen. Over veel regels levert dat centen op die er niet zijn. Gebruik exacte decimalen en een vaste afrondregel.
Eén lezer voor alle leveranciers. Een algemene lezer doet alles een beetje. Een lezer per leverancier doet zijn ene factuur perfect, en faalt zichtbaar als die verandert.
Alleen het totaal controleren. Twee fouten kunnen elkaar opheffen. Controleer de regels, de kosten en de btw per tarief apart.
Creditnota's als gewone facturen inlezen. Dan boek je een creditnota als inkoop. Geef ze een eigen stand.
Weggooien wat niet te lezen is. Houd een lijst bij van wat er niet in staat. Een cijfer zonder volledigheid is een gok.
Hoe dit in de hele app past, van factuur tot inkooporder in Exact, lees je in de case van de drankengroothandel. Wat een Exact-koppeling nog meer kan, staat op Exact Online koppelen.