Facture électronique ZUGFeRD à partir d'une base Airtable: Générez le JSON et envoyez le PDF hybride par e-mail avec Make et PDF4me

PDF4me Create a ZUGFeRD invoice est un module Make qui transforme les données structurées d'une facture en une facture électronique hybride PDF/A-3. Associé à une base de données Airtable, il lit une ligne, la convertit au format XML EN 16931, génère un fichier lisible et exploitable par machine, puis l'intègre à l'enregistrement.
Une recherche de logiciels de facturation électronique vous donnera un comparatif de fournisseurs: plateformes, suites logicielles, tarification par document. Si vous cherchez à savoir si Airtable permet de créer des factures, vous trouverez une longue discussion expliquant que ce n’est pas possible. Entre ces deux constats, il y a une équipe qui utilise déjà Airtable, à qui l’on vient d’imposer la lisibilité de ses factures par machine, et qui ne souhaite pas migrer son système vers une plateforme de facturation pour répondre à cette exigence de format. Ce scénario est fait pour elle.
Une ligne est ajoutée à une table Airtable avec un vendeur, un acheteur, un article et les totaux. Make récupère ces données, crée un objet JSON compact à partir des colonnes, et PDF4me le convertit en un PDF/A-3 intégrant du XML EN 16931 Le fichier est ensuite ajouté à l'enregistrement en pièce jointe et envoyé à l'acheteur par e-mail. Cinq modules suffisent, et personne n'écrit de code XML.
Questions et réponses basées sur le pourquoi
Why run this from Airtable rather than an invoicing product?Les données de facturation sont généralement un sous-produit d'un travail déjà enregistré quelque part. Si le projet, le client et le tarif convenu sont consignés dans une base de données, cette base constitue la source la plus fiable dont vous disposez. Transférer ces données dans un produit pour respecter un format de fichier revient à conserver indéfiniment le même client à deux endroits.
Why describe the invoice as JSON instead of writing the XML?La syntaxe des factures intersectorielles est longue, complexe et très sensible à l'emplacement des codes. L'objet JSON, quant à lui, exprime la même information en beaucoup plus petit, avec des clés qui ressemblent à des termes métiers. PDF4me génère ensuite le XML conforme. La partie la plus facile à perturber est celle que vous ne gérez pas.
Why does the hybrid file matter?Parce que la facture a deux destinataires. Le système comptable de l'acheteur lit le XML intégré et enregistre le document sans intervention manuelle; le comptable fournisseurs ouvre le même fichier et en consulte une page. Un seul document suffit aux deux, et c'est pourquoiFeRD, le forum allemand à l'origine du format, l'a conçu ainsi plutôt que de spécifier uniquement le XML.
Why attach the result back to the record?Car une facture électronique introuvable par la suite n'est qu'un problème que vous avez simplement reporté. Insérer le PDF dans le champ Document de la ligne permet de lier le document aux données qui l'ont généré, ce qui est essentiel lorsqu'un acheteur conteste un montant dix-huit mois plus tard.
Ce que vous obtiendrez
Entrée: une ligne Airtable contenant le numéro de facture, les dates, un bloc vendeur, un bloc acheteur, un article et les totaux, avec Status « Nouveau ». Sortie: un fichier ZUGFeRD PDF/A-3 joint à cet enregistrement et un courriel à l’acheteur contenant ce même fichier.

Une ligne par facture. Chaque colonne devient une clé dans le JSON généré par le scénario.

L'acheteur voit une facture normale. Son logiciel, quant à lui, interprète le code XML qu'elle contient.
Ce dont vous avez besoin
- A Make account.Open Make Cinq modules sur les applications standard.
- PDF4me API key.Get your API key Une seule connexion PDF4me suffit pour ce scénario.
- An Airtable baseLa base capturée est
PDF4me Live Automationsavec une table nomméeZUGFeRD Requests, contenant l'en-tête de la facture, le bloc vendeur incluant un numéro de TVA, le bloc acheteur, les champs des lignes de commande, les totaux, une colonne Email, un champ Status et un champ de pièce jointe appeléDocument. - A Gmail accountpour la livraison, connecté à Make.
- Your seller details including a VAT IDElles proviennent de colonnes, de sorte qu'une base peut facturer pour plusieurs entités juridiques.
Aperçu du scénario
- Watch records (Airtable) récupèrent les nouvelles lignes dans
ZUGFeRD Requests. - Create a ZUGFeRD invoice (PDF4me) convertit le JSON en un PDF hybride.
- Upload an attachment (Airtable) l'ajoute au champ
Documentde la même ligne. - Update a record (Airtable) réécrit le résultat.
- Send an email (Gmail) permet de transmettre la facture électronique à l'acheteur.
Aperçu complet du scénario

La structure à cinq modules est identique à celle du scénario QR suisse. Seul le module PDF4me central diffère.
Étape 1: Comment déclencher un scénario à partir d’une ligne Airtable?
Déroulement jusqu'à présent: rien pour l'instant, ceci est le déclencheur.
Une ligne marquée « prête » correspond à une demande d'émission de facture.
- Ajouter Airtable > Watch records comme déclencheur.
- Configure:
- Base:
PDF4me Live Automations - Tableau:
ZUGFeRD Requests - Trigger field:
Created - Label field:
Title - Limite:
10 - Formule:
{Status}='New'
- Base:
Configuration Watch records

Status est l'interrupteur. Aucune opération n'est effectuée tant qu'une personne n'a pas défini une ligne sur « Nouveau ».
Étape 2: Comment transformer une ligne en facture ZUGFeRD?
Déroulement jusqu'à présent: le déclencheur Airtable.
Ce module génère la facture électronique. Les paramètres définissent le format; le format JSON définit le contenu.
- Ajouter PDF4me > Create a ZUGFeRD invoice.
- Configurer la sortie:
- File Name:
ZUGFeRD_suivi du InvoiceNumber l’extension.pdf - Input Format:
JSON - Output Mode:
XML With PDF - ZUGFeRD Version:
2* - Conformance Level:
EN16931 - Render Invoice on PDF:
Yes
- File Name:
- Collez l'objet facture dans Invoice JSON Data et mappez les colonnes comme suit:
{
"InvoiceId": "{{1.InvoiceNumber}}",
"TypeCode": "380",
"InvoiceType": "RECHNUNG",
"IssueDate": "{{formatDate(1.InvoiceDate; "YYYY-MM-DD")}}T00:00:00",
"DeliveryDate": "{{formatDate(1.InvoiceDate; "YYYY-MM-DD")}}T00:00:00",
"IsTest": false,
"Seller": {
"Name": "{{1.SellerName}}",
"VatId": "{{1.SellerVATID}}",
"Address": {
"Street": "{{1.SellerStreet}}",
"PostalCode": "{{1.SellerPostalCode}}",
"City": "{{1.SellerCity}}",
"Country": "{{1.SellerCountry}}"
}
},
"Buyer": {
"Name": "{{1.BuyerName}}",
"Address": {
"Street": "{{1.BuyerStreet}}",
"PostalCode": "{{1.BuyerPostalCode}}",
"City": "{{1.BuyerCity}}",
"Country": "{{1.BuyerCountry}}"
}
},
"LineItems": [
{
"ProductName": "{{1.ItemDescription}}",
"Quantity": {{1.Quantity}},
"UnitCode": "C62",
"UnitPrice": {{1.UnitPrice}},
"LineTotal": {{parseNumber(1.NetTotal; ".")}}
}
],
"Totals": {
"Currency": "{{1.Currency}}",
"LineTotal": {{parseNumber(1.NetTotal; ".")}},
"TaxBasisTotal": {{parseNumber(1.NetTotal; ".")}},
"TaxPercent": {{1.VATRate}},
"TaxTotal": {{parseNumber(1.VATAmount; ".")}},
"GrandTotal": {{parseNumber(1.GrossTotal; ".")}},
"ChargeTotal": 0,
"AllowanceTotal": 0
},
"Payment": {
"Currency": "{{1.Currency}}",
"PaymentReference": "{{1.InvoiceNumber}}",
"DueDate": "{{formatDate(1.DueDate; "YYYY-MM-DD")}}T00:00:00"
}
}
Trois éléments de cet objet méritent une attention particulière. Le TypeCode 380 correspond à une facture commerciale et est fixe; il ne provient d'aucun élément de la base. UnitCode C62 est le code UN/ECE pour « une unité de quelque chose », ce qui correspond aux heures ou aux unités de service. Enfin, le bloc Payment contient PaymentReference, le texte que l'acheteur indique lors du paiement, qui est ici simplement le numéro de facture.
Create a ZUGFeRD invoice

Le champ défile dans l'éditeur, seule une partie de l'objet est donc visible à la fois. Le bloc ci-dessus représente l'objet entier.
Ce que chaque paramètre détermine
| Champ | Valeur ici | Ce qu'il contrôle |
|---|---|---|
| Input Format | JSON | Vous devez fournir un objet structuré plutôt qu'un fichier XML prêt à l'emploi ou une ligne CSV. |
| Output Mode | XML With PDF | Renvoie un seul fichier hybride. XML Only le fichier XML de la facture. |
| ZUGFeRD Version | 2* | La génération 2.x, c'est-à-dire celle qui est conforme à EN 16931 L'ancienne génération 1.0 ne l'est pas. |
| Conformance Level | EN16931 | Le profil auquel la facture prétend correspondre, et donc les clés que le JSON doit fournir. |
| Render Invoice on PDF | Yes | Générez une page de facture lisible à partir des mêmes données. En l'absence de PDF de base, c'est ce qui donne au fichier son aspect humain. |
| Document | vide | Là où devrait se trouver un PDF de base avec votre en-tête. Laissez ce champ vide et PDF4me générera une page vierge. |
Tip.Les clés de montant et de quantité doivent être fournies sous forme de nombres simples, et non de chaînes de caractères entre guillemets; c’est pourquoi elles sont traitées par un processus spécifique.parseNumber tandis que les champs de texte sont entourés de guillemets. Un guillemet"1005" sera rejeté lorsqu'un simple1005 L'opération est acceptée, et l'erreur renvoyée concernera le schéma plutôt que les guillemets. Notez le deuxième argument:parseNumber(1.NetTotal; ".") indique Make le séparateur décimal comme un point. Omettez-le et une locale qui écrit1005,00 Elle aboutira à un mauvais nombre plutôt que d'échouer, ce qui serait le pire des résultats.
Étape 3: Comment réintégrer la facture électronique dans le dossier?
Déroulement jusqu'à présent: le déclencheur plus le module PDF4me.
- Ajouter Airtable > Upload an attachment.
- Configure:
- Base et Table: comme à l'étape 1
- Record ID: l'
iddu déclencheur - Attachment field:
Document - File: le résultat de PDF4me - Create a ZUGFeRD invoice
- File name:
ZUGFeRD_suivi du InvoiceNumber l'extension.pdf - Data: le Document de sortie du module 2
- Content type:
PDF file
Configuration Upload an attachment

Content type est ici PDF file. Dans le cas d'un QR code suisse, une image PNG est utilisée dans le même emplacement.
Étape 4: Comment enregistrez-vous le résultat sur la ligne?
Déroulement jusqu'à présent: tout s'est déroulé via le téléchargement de pièces jointes.
- Ajouter Airtable > Update a record.
- Configure:
- Base et Table: comme à l'étape 1
- Record ID: l'
iddu déclencheur - Record: renseignez uniquement les informations à renvoyer, généralement Status et un OutputLink
Update a record

Toutes les colonnes du tableau apparaissent ici. La capture d'écran les montre vides et le panneau a défilé; par conséquent, définissez Status intentionnellement.
Tip.Un champ mappé mais vide efface la cellule. Dans un tableau de factures, cela signifie un numéro de TVA manquant ou une date d'échéance oubliée lors d'une exécution qui, par ailleurs, a été signalée comme réussie. Par conséquent, ne renseignez pas les champs que vous n'utilisez pas intentionnellement.
Étape 5: Comment envoyez-vous la facture électronique à l'acheteur?
Déroulement jusqu'à présent: tout est passé par la mise à jour de l'enregistrement.
La facture électronique en attente dans la base de données n'a pas été émise.
- Ajouter Gmail > Send an email.
- Configure:
- To: la colonne Email du déclencheur
- Subject:
Your e-invoiceet le InvoiceNumber - Body type:
Raw HTML - Content: un court corps HTML indiquant le nom de l’acheteur, la facture et le total
- Ajouter la pièce jointe:
- File: PDF4me - Create a ZUGFeRD invoice
- File name:
ZUGFeRD_suivi du InvoiceNumber l'extension.pdf - Data: le Document de sortie du module 2
Configuration Send an email

La pièce jointe provient du module 2, donc Airtable n'est jamais relu pour le fichier.
Exécutez le scénario et vérifiez
- Save le scénario et exécutez-le une fois.
- Ajoutez une ligne aux
ZUGFeRD Requestsavec un vendeur, un acheteur, un article, les deux dates et StatusNew. - Chacun des cinq modules doit signaler une opération.
- Ouvrez la ligne: le champ
Documentdoit contenir un fichier PDF nommé d’après le numéro de facture. - Ouvrez la pièce jointe. Vous devriez y voir une page de facture lisible, et un validateur ZUGFeRD devrait y trouver du code XML EN 16931.
- Veuillez vérifier la boîte de réception de l'acheteur pour le message et sa pièce jointe.
Dans l'exécution capturée, la ligne RE-2026-0009 a produit une facture de Muster GmbH à Berlin avec le numéro de TVA DE123456789 à Test Kunde AG à Muenchen, dix unités de Consulting à 100,50, et l'e-mail a signalé un total de 1195,95 EUR.
Do not trust the grid for decimals.La grille Airtable affiche VATAmount 191 et GrossTotal 1196, alors que la facture et l'e-mail indiquent respectivement 190.95 et 1195.95. Aucun recalcul n'est effectué: TaxTotal et GrandTotal sont directement issues de ces deux colonnes. La grille les affiche simplement avec la précision définie pour le champ numérique. Il est conseillé d'augmenter cette précision avant toute tentative de rapprochement d'une colonne avec une facture, car les chiffres semblent incohérents.
Variantes courantes que vous pouvez ajouter sans reconstruction
Comment cela se compare-t-il aux autres méthodes de production d'une facture électronique?
Chaque ligne décrit une alternative. La dernière ligne correspond à ce scénario.
| Comparaison | Qui le dirige? | D'où proviennent les données? | Ce que vous entretenez |
|---|---|---|---|
| Plateforme de facturation électronique vs ce scénario | La finance, via un portail | Téléchargements ou intégration | Un contrat par document et un lien avec celui-ci |
| Module ERP par rapport à ce scénario | La finance, au sein de l'ERP | Le propre registre du progiciel de gestion intégré (PGI) | Licences et migration pour transférer vos données dans |
| Bibliothèque de développement par rapport à ce scénario | Un développeur, à l'intérieur d'une application | Votre base de données, via le code | Le code, les mises à jour du schéma et les versions |
| Ce scénario | Toute personne capable d'ajouter une ligne Airtable | La base que l'équipe conserve déjà | Cinq modules et un objet JSON |
Questions fréquentes
Qu'est-ce que l'automatisation des comptes fournisseurs?
Du côté du destinataire, cela signifie qu'une facture arrive, que ses champs sont lus automatiquement, que les montants sont vérifiés et que le résultat est validé ou transmis pour approbation. La fiabilité de cette étape de lecture repose sur le fait que les données sont intégrées à la facture plutôt que récupérées à partir d'une image.
Ce scénario correspond à la partie « envoi » de cet accord. La production d'un fichier que le système de l'acheteur peut analyser permet le traitement automatisé de sa comptabilité fournisseurs.
Airtable peut-il créer des factures?
Les solutions non conformes ne sont pas compatibles. Airtable peut stocker des données de facturation et les présenter dans une interface ou une vue imprimable, mais ne peut pas produire un PDF/A-3 contenant un XML conforme à la norme EN 16931, ce qu'exige la facturation électronique.
La répartition utilisée dans ce scénario est la plus pratique: Airtable constitue l’enregistrement, PDF4me produit le document, et ce document est renvoyé à l’enregistrement en tant que pièce jointe.
Comment fonctionne l'automatisation des comptes fournisseurs?
Le processus se déroule en trois étapes: la réception, l’extraction et la comptabilisation. La réception consiste à centraliser les documents; l’extraction les transforme en champs; la comptabilisation inscrit ces champs dans le grand livre, généralement après un contrôle de niveau de confiance ou d’approbation.
Les factures électroniques hybrides court-circuitent l'étape intermédiaire. Lorsque le XML est déjà intégré au fichier, l'extraction consiste en un traitement plutôt qu'en une reconnaissance, ce qui explique la tendance croissante des réglementations à privilégier cette approche.
Qu'est-ce que l'automatisation Airtable?
Airtable intègre son propre outil de création d'automatisations pour les déclencheurs et les actions au sein d'une base, ce qui couvre une grande partie du fonctionnement interne. Cependant, il ne permet pas d'appeler une API de documents et de renvoyer un fichier pour un champ de pièce jointe, étape pourtant nécessaire dans ce cas précis.
Make est positionné à côté précisément pour cette raison. Le déclencheur surveille toujours une table Airtable, mais le cœur du scénario peut atteindre des services auxquels les automatisations d' Airtable ne peuvent pas accéder.
Dépannage
Ouvrez le fichier d'entrée du module dans l'historique d'exécution et lisez-le au format JSON. Une colonne Airtable vide laisse une clé vide, et une valeur monétaire dont les guillemets sont conservés arrive sous forme de texte alors qu'un nombre est attendu. Dans les deux cas, l'objet produit semble correct, mais la conversion échoue.
Conformance Level détermine les champs requis par le profil. Si vous déclarez être conforme à la norme EN16931 alors que le fichier JSON omet des clés attendues par le profil, la validation échouera, même si le fichier s'ouvre correctement. Veuillez fournir les clés manquantes ou utiliser un niveau de conformité inférieur.
Render Invoice on PDF est désactivée et aucun fichier PDF de base n'a été fourni. Par conséquent, le code XML a été intégré sans aucun élément graphique. Le fichier reste une facture électronique valide, mais sa partie destinée aux personnes physiques est vide.
Vérifiez que Output Mode est XML With PDF, puis assurez-vous que les modules 3 et 5 récupèrent leurs données du module 2. Tout autre élément joint envoie une page qui semble correcte mais qui ne contient aucune donnée lisible par leur logiciel.
Prochaines étapes
Un mandat de paiement se présente généralement sous la forme d'un problème de format de fichier. Il s'agit en réalité de savoir où se trouvent déjà vos données de facturation et si un système peut les lire.