← Terug naar alle artikelen

Een conforme e-factuur genereren met n8n en SealDoc

SealDoc Team · · 6 min lezen

Een conforme e-factuur genereren heeft meer bewegende delen dan het lijkt. Je hebt een geldige XML-factuur nodig, het juiste EN 16931-profiel, een PDF/A-3-container waarin die XML is ingebed, en bij voorkeur een RFC 3161-tijdstempel voordat de factuur je archief in gaat. Dat allemaal in een eigen integratie bouwen is weken werk.

Deze tutorial zet hetzelfde resultaat in elkaar in n8n, met de community-node n8n-nodes-sealdoc. Geen eigen code. De workflow genereert de factuur, haalt de XML en de PDF/A-3 op en slaat ze allebei op.

Vereisten

  • Een zelfgehoste n8n-instantie met community-nodes ingeschakeld.
  • Een SealDoc-werkruimte met API-toegang: het gratis Developer-plan of elk betaald plan. Zie de prijzen.
  • Een SealDoc API-sleutel. Die maak je aan in de SealDoc-app onder Integration → API Keys. Kopieer hem meteen: hij wordt maar één keer getoond.
  • Je bedrijfsgegevens. De verkoper op de factuur is je eigen bedrijf, en het btw-nummer daarvan moet overeenkomen met het btw-nummer van je SealDoc-werkruimte.

Installeer de node in n8n via Settings → Community nodes → Install, met de pakketnaam n8n-nodes-sealdoc. Installeer je nodes liever met de hand, voer dan dit uit in je n8n-nodesmap (meestal ~/.n8n/nodes) en herstart n8n:

npm i n8n-nodes-sealdoc

Maak daarna de credential aan: Credentials → New → SealDoc API, en plak je sleutel in het veld API Key. Laat Base URL op https://api.sealdoc.eu staan.

Wat de workflow doet

  1. Een trigger levert de factuurgegevens aan als JSON: een webhook, een databaserij, een formulierinzending of elke andere n8n-bron.
  2. SealDoc · Invoice · Generate bouwt de e-factuur, valideert hem en verzegelt hem in een PDF/A-3. Dat gebeurt binnen de aanroep: de node geeft een afgeronde job terug.
  3. SealDoc · Invoice · Get XML geeft de XML van de e-factuur terug als bestand.
  4. Een HTTP Request-node downloadt de PDF/A-3.
  5. Een opslagnode zet beide bestanden in je archief.

Stap 1: de trigger instellen

Maak een nieuwe workflow aan en voeg een Webhook-trigger toe met HTTP-methode POST. Daarmee krijg je een URL die elk systeem met factuurgegevens kan aanroepen. Om te testen werkt een Manual Trigger met vaste gegevens net zo goed.

Een minimaal voorbeeld van wat de trigger kan aanleveren:

{
  "invoiceNumber": "INV-2026-00042",
  "invoiceDate": "2026-05-06",
  "dueDate": "2026-06-05",
  "buyer": {
    "name": "Widget BV",
    "vatNumber": "NL987654321B01",
    "address": "Keizersgracht 10",
    "postalCode": "1015 CN",
    "city": "Amsterdam",
    "country": "NL"
  },
  "line": {
    "description": "Consulting services May 2026",
    "quantity": 10,
    "unitPriceExclVat": 150.00
  }
}

De verkoper staat niet in deze payload. Dat is je eigen bedrijf, dus die stel je één keer in de node in.

Stap 2: Invoice · Generate toevoegen

Voeg een SealDoc-node toe, hernoem hem naar Generate invoice en stel in:

  • Resource: Invoice. Operation: Generate.
  • Invoice Number Source: Own Number. Invoice Number: {{ $json.invoiceNumber }}. Laat je je facturen liever door SealDoc nummeren? Kies dan SealDoc Numbering Series.
  • Invoice Date: {{ $json.invoiceDate }}. Due Date: {{ $json.dueDate }}.
  • Currency: EUR.
  • VAT Rate: 0.21. Het tarief is een fractie, dus 21% is 0.21. Laat VAT Category op “derive from the rate” staan en VAT Label leeg: bij een standaardtarief schrijft SealDoc de btw-vermelding zelf.
  • Seller: je bedrijf, met Name, VAT Number, Address, Postal Code, City en Country (tweelettercode).
  • Buyer Source: Buyer Details. Buyer: vul elk veld met de gegevens uit de trigger, bijvoorbeeld {{ $json.buyer.name }} en {{ $json.buyer.postalCode }}. Klanten die je in SealDoc hebt opgeslagen, gebruik je direct met Buyer Profile.
  • Lines: voeg een regel toe met Description {{ $json.line.description }}, Quantity {{ $json.line.quantity }}, Unit Hour en Unit Price (Excl. VAT) {{ $json.line.unitPriceExclVat }}.
  • Profile: Basic (Factur-X 1.0). De node biedt daarnaast XRechnung DE, waarvoor een Buyer Reference (de Leitweg-ID) en een contactpersoon bij de verkoper nodig zijn, en Peppol BIS 3.0 (UBL 2.1), waarvoor de Peppol-endpoint-ID’s van beide partijen nodig zijn.
  • RFC 3161 Timestamp: aan, dat is de standaardinstelling.

Kies je SealDoc API-credential en voer de node uit. Het antwoord ziet er zo uit:

{
  "jobId": "3f6c2a9e-8d41-4b7a-9c0e-5a2b1d7e4f10",
  "status": "completed",
  "statusUrl": "/api/jobs/3f6c2a9e-8d41-4b7a-9c0e-5a2b1d7e4f10"
}

completed betekent dat de factuur gebouwd is, gevalideerd tegen EN 16931 en verzegeld. Er valt niets te pollen. Staat er in een antwoord toch eens queued of processing, dan vertelt een SealDoc · Job · Get-node met dezelfde jobId je wanneer hij klaar is.

Stap 3: de XML ophalen

Voeg een tweede SealDoc-node toe: Resource Invoice, Operation Get XML, Job ID {{ $('Generate invoice').item.json.jobId }}. De node geeft de XML van de e-factuur terug als binair bestand in het veld data: factur-x.xml voor het Basic-profiel, xrechnung.xml voor XRechnung en peppol-ubl.xml voor Peppol BIS.

Stap 4: de PDF/A-3 downloaden

Voeg een HTTP Request-node toe:

  • Method: GET
  • URL: https://api.sealdoc.eu/api/download/{{ $('Generate invoice').item.json.jobId }}
  • Authentication: Generic Credential Type, daarna Header Auth, met als naam X-Api-Key en je API-sleutel als waarde.
  • Response Format: File.

Het resultaat is de verzegelde PDF/A-3 met de XML erin ingebed.

Stap 5: het resultaat opslaan

Voeg de opslagnode toe die bij je stack past: Google Drive, Dropbox, een S3-compatibele bucket, SFTP naar je eigen server, of Write Binary File op de n8n-host zelf.

Vanaf het Starter-plan heeft elke job ook een Legal Evidence Pack: GET /api/jobs/{id}/evidence-pack, met dezelfde X-Api-Key-header. SealDoc stelt het direct na de job samen; vraag je het in de eerste momenten op, dan antwoordt de API met 409 en een Retry-After-header, dus volstaat een korte Wait-node vóór het verzoek.

Als er iets misgaat

Fouten komen direct terug, als een antwoord met een code:

  • 400 bij ongeldige invoer, bijvoorbeeld seller_required, currency_required of invalid_vat_rate.
  • 402 plan_feature_required als de functie niet in je plan zit.
  • 403 seller_vat_mismatch als het btw-nummer van de verkoper afwijkt van dat van je werkruimte.
  • 409 quota_reached als je maandlimiet op is.
  • 422 einvoice_invalid als de factuur niet door de validatie komt.

Standaard stopt de SealDoc-node de workflow bij een fout. Zet de instelling On Error van de node op doorgaan met een foutuitvoer en stuur die uitvoer naar Slack of e-mail, zodat iemand ziet wat er hersteld moet worden.

Wat je krijgt

Een PDF/A-3 die elke pdf-viewer opent als leesbare factuur, met de XML ingebed voor boekhoudsoftware die Factur-X of ZUGFeRD importeert. Het RFC 3161-tijdstempeltoken wordt bij de job bewaard en is los te downloaden (GET /api/jobs/{id}/timestamp). Sleep de pdf in onze gratis Validator en zie zelf het oordeel en elke bevinding.

Volgende stappen

  • Bestaande facturen valideren: SealDoc · Validator · Check valideert een Factur-X- of ZUGFeRD-bestand dat je al hebt, zonder iets te genereren.
  • Andere documenten renderen: SealDoc · Document · Generate maakt in één aanroep van Markdown of HTML een verzegelde PDF/A-3.
  • Teruglezen wat is uitgegeven: SealDoc · Invoice · Get Summary geeft het factuurnummer, het profiel, de taal en de btw-totalen van een gegenereerde factuur terug.

De volledige API-referentie, met een OpenAPI-specificatie en curl-voorbeelden, staat gelinkt op onze developerspagina.

Valideer uw eigen factuur, zonder account →
← Terug naar alle artikelen