RobotsHelp

Factuurverwerking automatiseren met n8n: van Gmail naar Sheets, zonder overtypen

Het is het einde van de maand. Ergens in je inbox staan 20 leveranciersfacturen. Een paar zijn twee keer doorgestuurd. Eén is een telefoonfoto van een papieren bon. En je moet ze allemaal in één spreadsheet hebben voordat je boekhouder er weer om vraagt. De korte oplossing: factuurverwerking automatiseren met n8n. Een werkproces controleert Gmail op pdf-bijlagen, laat een AI-model (Gemini werkt goed) elke factuur uitlezen naar vaste velden en schrijft per factuur één rij naar Google Sheets. De e-mail krijgt een label, zodat die niet twee keer wordt verwerkt. En voordat een grote factuur als goedgekeurd wordt gemarkeerd, krijg jij eerst een verzoek om akkoord. Je bouwt het eenmalig in ongeveer een middag en test het met tien oude facturen. Daarna controleer je rijen in plaats van ze over te typen.

Hieronder bouw je het volledige werkproces, onderdeel voor onderdeel. Je leest ook hoe je gescande facturen verwerkt, de kosten laag houdt en veilig werkt.

Wil je elke week gratis zo’n praktisch AI-werkproces ontvangen?

No password needed – your reset opens instantly.

Geen wachtwoord. Alleen je e-mailadres, en je bent aangemeld.

Wat dit werkproces doet (en wat het nooit hoort te doen)

Bekijk de werkprocessen voor facturen in de sjablonenbibliotheek van n8n en je ziet steeds dezelfde beproefde opzet: Gmail regelmatig controleren op e-mails met pdf-bijlagen, de tekst uit de pdf halen, een AI-model de factuur laten omzetten naar vaste velden, controleren op dubbele facturen, het resultaat toevoegen aan een Google-spreadsheet en het eventueel naar iemand doorsturen voor goedkeuring (n8n-sjabloon: factuurgegevens van Gmail naar Sheets, n8n-sjabloon: leveranciersfacturen met controle op dubbele invoer). We gebruiken die opzet en maken hem wat flexibeler voor een klein bedrijf: hij verwerkt scans, markeert twijfelgevallen en doet niets met geld.

Dat laatste is belangrijk. Dit werkproces registreert en signaleert. Het betaalt niet, mailt geen leveranciers en verandert niets in je boekhoudsoftware. Jij bepaalt nog steeds wat er wordt betaald. Je bespaart tijd op overtypen en zoeken. Meestal is dat toch al het werk waar niemand plezier aan beleeft.

Dit is het geheel in één overzicht:

  1. Gmail Trigger: haalt nieuwe e-mails met een pdf-bijlage op.
  2. Extract From File: haalt de tekst uit de pdf.
  3. Information Extractor (met een Gemini-chatmodel): zet die tekst om naar vaste velden.
  4. Edit Fields: voegt een unieke factuursleutel en een status toe.
  5. Google Sheets: schrijft of wijzigt één rij per factuur.
  6. Gmail: geeft de e-mail een label dat aangeeft dat hij is verwerkt.
  7. Optioneel: een e-mail aan jou voor goedkeuring van bedragen boven je limiet.

Voordat je begint: drie dingen om klaar te zetten

1. Een spreadsheet met vaste kolommen

Maak een Google-spreadsheet met de naam “Invoices” en deze kolomkoppen in rij 1: invoice_key, supplier_name, invoice_number, invoice_date, due_date, currency, subtotal, tax_amount, total, vat_number, notes, status, email_subject. Die vaste kolommen zorgen dat de rest werkt. De AI vult steeds dezelfde velden in. Zo kun je de gegevens later sorteren, filteren en optellen.

2. Een Gmail-label met de naam invoice-logged

Het werkproces voegt dit label toe aan elke verwerkte e-mail. De trigger slaat vervolgens alles met dat label over. Dat is je eerste controle om te voorkomen dat dezelfde factuur twee keer wordt verwerkt.

3. Je toegangsgegevens in n8n

Je hebt Google-toegangsgegevens voor Gmail en Sheets nodig, plus een Gemini API-sleutel. De documentatie van n8n legt uit hoe je die Gemini-sleutel instelt: je maakt hem aan op de pagina voor API-sleutels in Google AI Studio en plakt hem in toegangsgegevens van het type “Google Gemini(PaLM) API” (n8n-documentatie: Google Gemini-toegangsgegevens). In n8n Cloud kun je ook “Use Gateway credits” kiezen in plaats van een eigen sleutel. Geeft Gmail later een 401-fout met “unauthorized_client”? Meestal los je dat op door de Gmail API in je Google Cloud-project in te schakelen (n8n-documentatie: veelvoorkomende problemen met Gmail Trigger).

Bouw je factuurverwerking in n8n, onderdeel voor onderdeel

Stap 1: een Gmail Trigger die alleen facturen ophaalt

Voeg een Gmail Trigger toe met de gebeurtenis “Message Received”. Stel een rustig controle-interval in, bijvoorbeeld elke 15 minuten. Bij facturen komt het zelden op de minuut aan.

Zet bij de filters het volgende in Search. Dit zijn gewone Gmail-zoekoperatoren. Je kunt de regel dus eerst precies zo in de zoekbalk van Gmail testen. Zie Google: zoekopdrachten verfijnen in Gmail:

has:attachment filename:pdf -label:invoice-logged (invoice OR factuur OR rechnung OR facture OR bill)

Pas daarna twee instellingen aan waar bijna iedereen tegenaan loopt:

  • Read Status. De standaardinstelling is “Unread emails only” (n8n-documentatie: Gmail Trigger). Bekijk je een factuur even op je telefoon vóór de volgende controle? Dan is de e-mail gelezen en ziet het werkproces hem niet meer. Stel dit in op zowel ongelezen als gelezen e-mails. Laat het label bepalen welke e-mails worden overgeslagen.
  • Simplify uit, Download Attachments aan. Zet Simplify uit en schakel onder Options de optie Download Attachments in. De eerste bijlage komt in een binair veld met de naam attachment_0, de tweede in attachment_1, enzovoort. Die namen komen rechtstreeks uit de code van dit onderdeel, dat in n8n een node heet. Zie n8n op GitHub: de Gmail Trigger-node.

Max Emails per Poll staat standaard op 10 (maximaal 50). Extra e-mails wachten op de volgende controle. Een drukke maandafsluiting kost dus gewoon een paar extra rondes.

Tip: vraag leveranciers waar mogelijk om facturen naar een apart adres te sturen, zoals invoices@yourcompany. Of stel een Gmail-filter in dat ze naar één inbox doorstuurt. Een inbox met alleen relevante e-mails werkt beter dan een slimme zoekregel.

Stap 2: Extract From File (PDF)

Voeg Extract From File toe en kies de bewerking “Extract From PDF”. Stel Input Binary Field in op attachment_0 in plaats van de standaardwaarde data (n8n-documentatie: Extract From File). Voer dit één keer uit met een testmail. Bij een factuur uit boekhoudsoftware zie je de factuurtekst in het resultaat: rommelig, maar compleet.

Is het resultaat leeg of bijna leeg? Dan is de pdf een scan of foto. Lees eerst het onderdeel over gescande facturen hieronder en kom daarna terug.

Stap 3: Information Extractor met een Gemini-chatmodel

Dit is de AI-stap. Voeg de node Information Extractor toe en koppel er een Google Gemini Chat Model aan. Gebruik bij Text de waarde {{ $json.text }}. Dat is precies het voorbeeld dat n8n geeft voor invoer uit Extract From PDF (n8n-documentatie: Information Extractor).

Kies bij Schema Type de optie “Generate From JSON Example” en plak het volgende voorbeeld. n8n kijkt alleen naar de veldnamen en gegevenstypen, niet naar de waarden:

{
  "supplier_name": "Brightline Print Ltd",
  "invoice_number": "INV-2041",
  "invoice_date": "2026-10-02",
  "due_date": "2026-11-01",
  "currency": "EUR",
  "subtotal": 400.00,
  "tax_amount": 84.00,
  "total": 484.00,
  "vat_number": "NL000000000B01",
  "notes": ""
}

Goed om te weten uit de documentatie: bij een JSON-voorbeeld behandelt n8n elk veld als verplicht. Op echte facturen ontbreekt vaak een vervaldatum of btw-nummer. Vertel het model dus wat het moet doen als een veld ontbreekt. Open onder Options de optie System Prompt Template en gebruik bijvoorbeeld deze tekst. n8n voegt daar zelf instructies voor de opmaak aan toe:

Je leest leveranciersfacturen voor een klein bedrijf.
Neem elke waarde exact over zoals die is afgedrukt. Raad nooit en vul geen waarde in die niet op de factuur staat.
Datums: schrijf ze als YYYY-MM-DD.
Bedragen: gewone getallen met een punt als decimaalteken, zonder valutasymbool of scheidingsteken voor duizendtallen. "1.234,50" wordt dus 1234.50.
Valuta: de code van drie letters (EUR, GBP, USD).
Staat een veld niet op de factuur? Geef dan een lege tekenreeks terug (of 0 voor een bedrag) en vermeld in "notes" welk veld ontbreekt.
Als het subtotaal plus de belasting niet gelijk is aan het totaal, schrijf dan "totalen kloppen niet" in "notes".
Als dit helemaal geen factuur is (maar een offerte, nieuwsbrief of pakbon), schrijf dan "geen factuur" in "notes".

Vooral de regel voor getallen scheelt je veel opschoonwerk. Op Europese facturen staat duizend tweehonderdvierendertig euro en vijftig cent als 1.234,50. De spreadsheet verwacht 1234.50.

Stap 4: Edit Fields om een sleutel en status toe te voegen

Voeg een Edit Fields (Set)-node toe. Sleep alle uitgelezen velden erin en voeg vervolgens zelf drie velden toe:

  • invoice_key: sleep supplier_name erin, typ een | en sleep daarna invoice_number erin. Dat wordt dus “Brightline Print Ltd|INV-2041”. Zo herken je dezelfde factuur als die twee keer binnenkomt.
  • status: de vaste tekst te controleren. Elke rij begint met die status. Je verandert die zelf in “goedgekeurd” of “betaald”.
  • email_subject: sleep het onderwerp uit Gmail Trigger erin. Zo vind je de oorspronkelijke e-mail binnen een paar seconden terug.

Stap 5: Google Sheets, Append or Update Row

Voeg een Google Sheets-node toe met de bewerking Append or Update Row. Die werkt een bestaande rij bij of voegt een nieuwe toe als er geen overeenkomende rij is. Kies je spreadsheet Invoices, kies Map Each Column Manually en stel Column to Match On in op invoice_key (n8n-documentatie: bewerkingen voor Google Sheets). Een doorgestuurde kopie van dezelfde factuur komt nu op dezelfde rij terecht, in plaats van een tweede rij aan te maken. Dat is je tweede controle op dubbele invoer. Die herkent ook een factuur die een leverancier opnieuw stuurt met “herinnering” in het onderwerp.

Stap 6: Gmail, het label toevoegen

Voeg een Gmail-node toe. Kies bij Resource voor Message en bij Operation voor Add Label. Sleep voor Message ID de id uit Gmail Trigger erin en kies je label invoice-logged (n8n-documentatie: bewerkingen voor Gmail-berichten). Zet deze node als laatste. Zo krijgt een e-mail pas het label wanneer de bijbehorende rij echt in de spreadsheet staat. Gaat er halverwege iets mis? Dan blijft de e-mail zonder label en wordt hij opnieuw opgehaald.

Stap 7 (optioneel): een e-mail voor goedkeuring van grote facturen

Voeg na de spreadsheet een If-node toe: is total groter dan je limiet, bijvoorbeeld 1000? Voeg op de true-tak, de route voor ‘ja’, een Gmail-node toe met de bewerking Send and Wait for Approval. Stuur de e-mail naar jezelf en zet de leverancier, het factuurnummer, het totaal en de vervaldatum in het bericht. Stel Type of Approval in op “Approve and Disapprove”. Het werkproces pauzeert totdat je klikt. Na je klik zet een tweede Google Sheets-node (Update Row, gekoppeld op invoice_key) de status op “goedgekeurd” of “afgekeurd”. Volgens n8n is deze bewerking geschikt voor eenvoudige goedkeuringen. Voor complexere situaties verwijst n8n naar de Wait-node.

Er worden nog steeds geen betalingen gedaan. “Goedgekeurd” in een spreadsheet betekent alleen dat je de factuur hebt bekeken. Betalen blijft mensenwerk, via je bank of boekhoudprogramma.

Hoe zit het met gescande facturen en telefoonfoto’s?

Een gescande pdf is eigenlijk een afbeelding van een pagina. Er zit dus mogelijk geen tekst in die Extract From File kan uitlezen. Hier komt Gemini goed van pas. Volgens de documentatie van Google verwerkt Gemini pdf’s met ingebouwde beeldherkenning. Het begrijpt dus tekst, tabellen en afbeeldingen op de pagina, niet alleen een verborgen tekstlaag. Dat werkt voor bestanden tot 50 MB of 1000 pagina’s (Google AI for Developers: documenten begrijpen).

In n8n gebruik je de Google Gemini-node met de bewerking Document > Analyze Document (n8n-documentatie: de Google Gemini-node):

  1. Voeg na Extract From File een If-node toe met een Number-voorwaarde: {{ $json.text.trim().length }} is kleiner dan 50. Daarmee test je of het een scan is.
  2. Voeg op de true-tak Google Gemini toe, met Analyze Document. Stel Input Type in op Binary File(s) en de veldnaam op attachment_0.
  3. Schrijf als tekstinvoer: “Neem alle tekst op deze factuur exact over zoals die is afgedrukt, inclusief elk bedrag, elke datum en elk nummer. Houd de tabelrijen op afzonderlijke regels.”
  4. Verhoog de maximale lengte onder Options. In de code van de node is de standaardwaarde 300 tokens. Daardoor kan een factuur met veel factuurregels worden afgekapt. 1500 is een ruimere beginwaarde.
  5. Stuur het resultaat naar dezelfde Information Extractor. Zo leveren beide routes dezelfde kolommen op.

Googles eigen tips voor betere resultaten zijn eenvoudig: draai pagina’s rechtop en gebruik scherpe beelden. Fotografeer je papieren bonnen? Leg ze plat, zorg voor goed licht en sla het resultaat op als pdf. Gebruik de scan-naar-pdf-optie van je telefoon als die beschikbaar is. Zo pikt het filter filename:pdf in je trigger de bon ook echt op.

Kan Gemini factuurverwerking automatiseren voor een klein bedrijf?

Ja, met één belangrijke kanttekening. Gemini is het onderdeel dat de factuur leest. Het houdt je inbox niet in de gaten, beheert geen spreadsheet en onthoudt niet welke facturen het al heeft gezien. Dat doet het werkproces eromheen. Daarom werken n8n en Gemini goed samen: n8n regelt de verbindingen, Gemini doet het leeswerk.

Voor een klein bedrijf bepalen drie dingen of dit goed past:

  • Je aantal facturen. Krijg je vijf facturen per maand? Dan is een handmatige aanpak prima. Sleep de pdf’s in een chat en vraag om de velden, zoals in onze handleiding voor gegevens uit een pdf naar een spreadsheet halen met Claude. Zodra er elke week facturen van verschillende leveranciers binnenkomen, verdien je die middag instellen terug.
  • Je gegevens en de gratis versie. Op de prijspagina van Google staat bij de gratis Gemini API-versie dat inhoud wordt gebruikt om de producten van Google te verbeteren (Gemini API-tarieven). Facturen bevatten leveranciersnamen, bankgegevens en bedragen. Gebruik voor echte bedrijfsfacturen de betaalde versie. Controleer voor je begint de actuele tarieven op die pagina, want die veranderen.
  • Wat je boekhouder nodig heeft. Vraag welke velden je boekhouder echt wil hebben voordat je de spreadsheet bouwt. Later een kolom toevoegen is eenvoudig. 200 oude facturen opnieuw uitlezen niet.

Test het met tien echte facturen voordat je erop vertrouwt

Zet het niet zomaar aan om er daarna niet meer naar om te kijken. Kies tien facturen van vorige maand: een paar die met software zijn gemaakt, minstens één scan, één in een vreemde valuta en één met een creditnota of korting. Stuur ze door naar de inbox die de trigger controleert. Voer het werkproces uit en vergelijk elke rij met de pdf, kolom voor kolom.

Dit moet je na de eerste test meestal bijstellen:

  • Wisselende leveranciersnamen. “Brightline Print Ltd” en “Brightline Print” leveren verschillende sleutels op. Dan werkt de controle op dubbele facturen niet. Voeg een regel toe aan de systeemprompt: “Gebruik de officiële bedrijfsnaam zoals die bovenaan de factuur staat.”
  • Totaalbedrag of nog te betalen bedrag. Sommige facturen tonen een totaalbedrag en een lager “nog te betalen bedrag” na een aanbetaling. Bepaal welk bedrag je wilt en zet dat in de prompt.
  • Documenten die geen factuur zijn. Offertes en orderbevestigingen komen soms door het zoekfilter. Filter rijen met “geen factuur” in notes, of voeg een If-node toe die ze tegenhoudt voordat ze de spreadsheet bereiken.

Test daarna bewust de controle op dubbele facturen: stuur dezelfde factuur twee keer door en controleer of er nog steeds maar één rij staat. Gaan er tien achter elkaar goed? Activeer dan het werkproces. Blijf de eerste maand de rijen met “te controleren” nalopen. Je typt niet meer over, je controleert. Dat kost een paar minuten in plaats van een avond.

Zodra de gegevens erin staan, kun je er aan het einde van de maand vragen over stellen. Bijvoorbeeld hoeveel je per leverancier uitgeeft of wat er volgende week betaald moet worden. Onze handleiding voor een spreadsheet analyseren met ChatGPT laat zien hoe dat zonder formules kan.

Wat het gebruik kost

n8n zelf kan gratis zijn: de Community-editie die je zelf host, is voor onbepaalde tijd gratis te gebruiken (n8n-documentatie: edities vergelijken). Beheer je liever geen server? n8n Cloud biedt een proefperiode van 14 dagen met Pro-functies en een limiet van 1000 uitvoeringen. Daarna zijn er betaalde abonnementen (n8n-documentatie: gratis proberen en daarna een abonnement kiezen). Elke keer dat het werkproces draait, telt als één uitvoering. Een test met enkele tientallen facturen past dus ruim binnen die proefperiode.

Google rekent het AI-deel per token af. Een factuur van één pagina is klein: volgens Googles documentatie telt elke pdf-pagina als 258 tokens. Bij Gemini 3-modellen betaal je niet voor tokens uit de tekst die al in een pdf is ingesloten. Kijk op de prijspagina voor de actuele bedragen, in plaats van af te gaan op bedragen in een blogartikel, ook in dit artikel.

Werk je liever met Zapier of Make? Dezelfde zeven stappen werken daar ook. Onze voorbeelden van automatiseren met het gratis Zapier-abonnement en de handleiding voor klantonboarding met Make.com laten zien hoe die tools met triggers en stappen werken. Gebruik je n8n al voor je CRM? De handleiding voor CRM-automatisering met n8n gebruikt dezelfde Gmail- en Sheets-toegangsgegevens. Dan heb je de helft al ingesteld.

Vier fouten om te voorkomen bij automatische factuurverwerking

  1. Geen label, geen sleutel. Zonder het label invoice-logged en de koppeling op invoice_key wordt een opnieuw verstuurde factuur een tweede rij. Vroeg of laat volgt dan ook een tweede betaling.
  2. Alleen ongelezen e-mails verwerken. Je leest de e-mail op je telefoon, de trigger slaat hem over en de factuur ontbreekt ongemerkt in de spreadsheet.
  3. Vanaf dag één alles vertrouwen. AI leest facturen goed, maar niet perfect. De status “te controleren” staat er niet voor niets.
  4. Het werkproces laten betalen of antwoorden. Laat betalingen en contact met leveranciers aan een persoon over. Een verkeerd geregistreerde factuur is een kleine correctie. Een verkeerde betaling vraagt om een telefoontje naar je bank.

Veelgestelde vragen

Moet ik kunnen programmeren om dit te bouwen?

Nee. Elke stap hierboven is een node die je instelt met keuzemenu’s en slepen en neerzetten. Alleen twee korte expressies tussen dubbele accolades en het JSON-voorbeeld lijken op code. De expressies kun je ongewijzigd kopiëren. Het JSON-voorbeeld is gewoon een lijst met veldnamen.

Kan n8n ook facturen lezen die geen pdf zijn?

Extract From File verwerkt ook bestandsformaten zoals CSV, XLSX en platte tekst. Word-bestanden staan niet op de lijst. Vraag die leveranciers dus om een pdf. Voor foto’s heeft de Google Gemini-node de bewerking Analyze Image. Die werkt op dezelfde manier als Analyze Document. De meeste leveranciers sturen pdf’s. Begin daarmee en voeg pas andere routes toe als je die bestanden ook echt ontvangt.

Wat als twee leveranciers hetzelfde factuurnummer gebruiken?

Daarom combineert de sleutel de leveranciersnaam met het factuurnummer. “INV-1001” van twee verschillende leveranciers levert twee verschillende sleutels op, en dus twee rijen.

Bouw het deze week

Maak vanavond de spreadsheet en het label. Bouw morgen stap 1 tot en met 6 en test ze met tien oude facturen. Voeg de route voor scans en de goedkeuringsmail pas toe als je ze nodig hebt. Bij de eerste maandafsluiting waarop je rijen controleert in plaats van overtypt, merk je dat het de moeite waard was.

Wil je elke week een nieuw praktisch AI-werkproces zoals dit ontvangen?

No password needed – your reset opens instantly.

Geen wachtwoord. Alleen je e-mailadres, en je bent aangemeld.

Nog nooit iets gebouwd in n8n? Begin met onze n8n-handleiding voor beginners. Kom daarna terug om je factuurverwerking in te stellen.

Twijfel je nog tussen zelf bouwen en betalen voor een kant-en-klare tool? Onze gids over software voor factuurverwerking met AI vergelijkt de belangrijkste soorten tools. Je leest ook hoe je een tool met je eigen facturen test voordat je betaalt.

Bronnen

🇬🇧 Read this page in English