Comment générer une facture électronique conforme avec n8n et SealDoc
Générer une facture électronique conforme implique plus d’éléments qu’il n’y paraît. Il vous faut une facture XML valide, le bon profil EN 16931, un conteneur PDF/A-3 dans lequel ce XML est intégré, et idéalement un horodatage RFC 3161 avant qu’elle ne rejoigne votre archive. Construire tout cela dans une intégration sur mesure, ce sont des semaines de travail.
Ce tutoriel assemble le même résultat dans n8n avec le nœud communautaire n8n-nodes-sealdoc. Aucun code personnalisé. Le flux de travail génère la facture, récupère le XML et le PDF/A-3, puis stocke les deux.
Prérequis
- Une instance n8n auto-hébergée avec les nœuds communautaires activés.
- Un espace de travail SealDoc avec accès API : le plan Developer gratuit ou n’importe quel plan payant. Consultez les tarifs.
- Une clé API SealDoc. Créez-en une dans l’application SealDoc sous Integration → API Keys. Copiez-la immédiatement : elle n’est affichée qu’une seule fois.
- Les coordonnées de votre entreprise. Le vendeur sur la facture est votre propre entreprise, et son numéro de TVA doit correspondre à celui de votre espace de travail SealDoc.
Installez le nœud dans n8n via Settings → Community nodes → Install, avec le nom de paquet n8n-nodes-sealdoc. Si vous installez plutôt vos nœuds à la main, exécutez ceci dans votre dossier de nœuds n8n (généralement ~/.n8n/nodes), puis redémarrez n8n :
npm i n8n-nodes-sealdoc
Créez ensuite l’identifiant : Credentials → New → SealDoc API, puis collez votre clé dans le champ API Key. Laissez Base URL sur https://api.sealdoc.eu.
Ce que fait le flux de travail
- Un déclencheur fournit les données de facture en JSON : un webhook, une ligne de base de données, une soumission de formulaire ou toute autre source n8n.
- SealDoc · Invoice · Generate construit la facture électronique, la valide et la scelle dans un PDF/A-3. Tout se passe pendant l’appel : le nœud renvoie une tâche terminée.
- SealDoc · Invoice · Get XML renvoie le XML de la facture électronique sous forme de fichier.
- Un nœud HTTP Request télécharge le PDF/A-3.
- Un nœud de stockage dépose les deux fichiers dans votre archive.
Étape 1 : configurer le déclencheur
Créez un nouveau flux de travail et ajoutez un déclencheur Webhook avec la méthode HTTP POST. Vous obtenez ainsi une URL que n’importe quel système peut appeler avec des données de facture. Pour les tests, un Manual Trigger avec des données fixes fonctionne tout aussi bien.
Un exemple minimal de ce que le déclencheur peut fournir :
{
"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
}
}
Le vendeur ne figure pas dans ces données. C’est votre propre entreprise : vous le configurez donc une seule fois, dans le nœud.
Étape 2 : ajouter Invoice · Generate
Ajoutez un nœud SealDoc, renommez-le Generate invoice et définissez :
- Resource : Invoice. Operation : Generate.
- Invoice Number Source : Own Number. Invoice Number :
{{ $json.invoiceNumber }}. Vous préférez que SealDoc numérote vos factures ? Choisissez plutôt SealDoc Numbering Series. - Invoice Date :
{{ $json.invoiceDate }}. Due Date :{{ $json.dueDate }}. - Currency : EUR.
- VAT Rate :
0.21. Le taux s’exprime en fraction : 21 % s’écrit donc 0.21. Laissez VAT Category sur “derive from the rate” et VAT Label vide : pour un taux normal, SealDoc rédige lui-même la mention de TVA. - Seller : votre entreprise, avec Name, VAT Number, Address, Postal Code, City et Country (code à deux lettres).
- Buyer Source : Buyer Details. Buyer : mappez chaque champ depuis le déclencheur, par exemple
{{ $json.buyer.name }}et{{ $json.buyer.postalCode }}. Les clients que vous avez enregistrés dans SealDoc s’utilisent directement avec Buyer Profile. - Lines : ajoutez une ligne avec Description
{{ $json.line.description }}, Quantity{{ $json.line.quantity }}, Unit Hour et Unit Price (Excl. VAT){{ $json.line.unitPriceExclVat }}. - Profile : Basic (Factur-X 1.0). Le nœud propose aussi XRechnung DE, qui exige une Buyer Reference (la Leitweg-ID) et un contact vendeur, ainsi que Peppol BIS 3.0 (UBL 2.1), qui exige les identifiants d’endpoint Peppol des deux parties.
- RFC 3161 Timestamp : activé, c’est la valeur par défaut.
Sélectionnez votre identifiant SealDoc API et exécutez le nœud. La réponse ressemble à ceci :
{
"jobId": "3f6c2a9e-8d41-4b7a-9c0e-5a2b1d7e4f10",
"status": "completed",
"statusUrl": "/api/jobs/3f6c2a9e-8d41-4b7a-9c0e-5a2b1d7e4f10"
}
completed signifie que la facture est construite, validée selon EN 16931 et scellée. Aucun polling n’est nécessaire. Si une réponse indique un jour queued ou processing à la place, un nœud SealDoc · Job · Get avec le même jobId vous dit quand la tâche est terminée.
Étape 3 : récupérer le XML
Ajoutez un deuxième nœud SealDoc : Resource Invoice, Operation Get XML, Job ID {{ $('Generate invoice').item.json.jobId }}. Le nœud renvoie le XML de la facture électronique sous forme de fichier binaire dans le champ data : factur-x.xml pour le profil Basic, xrechnung.xml pour XRechnung et peppol-ubl.xml pour Peppol BIS.
Étape 4 : télécharger le PDF/A-3
Ajoutez un nœud HTTP Request :
- Method : GET
- URL :
https://api.sealdoc.eu/api/download/{{ $('Generate invoice').item.json.jobId }} - Authentication : Generic Credential Type, puis Header Auth, avec le nom
X-Api-Keyet votre clé API comme valeur. - Response Format : File.
Vous obtenez le PDF/A-3 scellé, avec le XML intégré.
Étape 5 : stocker le résultat
Ajoutez le nœud de stockage qui convient à votre environnement : Google Drive, Dropbox, un bucket compatible S3, SFTP vers votre propre serveur, ou Write Binary File directement sur l’hôte n8n.
À partir du plan Starter, chaque tâche dispose aussi d’un Legal Evidence Pack : GET /api/jobs/{id}/evidence-pack, avec le même en-tête X-Api-Key. SealDoc l’assemble juste après la tâche ; si vous le demandez dans les tout premiers instants, l’API répond 409 avec un en-tête Retry-After, et un court nœud Wait avant la requête suffit donc.
En cas de problème
Les erreurs reviennent immédiatement, sous forme de réponse avec un code :
- 400 pour une entrée invalide, par exemple
seller_required,currency_requiredouinvalid_vat_rate. - 402
plan_feature_requiredlorsque votre plan n’inclut pas la fonctionnalité. - 403
seller_vat_mismatchlorsque le numéro de TVA du vendeur diffère de celui de votre espace de travail. - 409
quota_reachedlorsque votre limite mensuelle est épuisée. - 422
einvoice_invalidlorsque la facture ne passe pas la validation.
Par défaut, le nœud SealDoc arrête le flux de travail en cas d’erreur. Réglez le paramètre On Error du nœud pour continuer avec une sortie d’erreur, puis dirigez cette sortie vers Slack ou un e-mail, afin qu’une personne voie ce qu’il faut corriger.
Ce que vous obtenez
Un PDF/A-3 que n’importe quel lecteur PDF ouvre comme une facture lisible, avec le XML intégré pour les logiciels de comptabilité qui importent Factur-X ou ZUGFeRD. Le jeton d’horodatage RFC 3161 est conservé avec la tâche et se télécharge séparément (GET /api/jobs/{id}/timestamp). Déposez le PDF dans notre Validateur gratuit pour constater par vous-même le verdict et chacun des constats.
Étapes suivantes
- Valider des factures existantes : SealDoc · Validator · Check valide un fichier Factur-X ou ZUGFeRD que vous avez déjà, sans rien générer.
- Produire d’autres documents : SealDoc · Document · Generate transforme du Markdown ou du HTML en PDF/A-3 scellé, en un seul appel.
- Relire ce qui a été émis : SealDoc · Invoice · Get Summary renvoie le numéro de facture, le profil, la langue et les totaux de TVA d’une facture générée.
La référence complète de l’API, avec une spécification OpenAPI et des exemples curl, est accessible depuis notre page développeurs.