Aller au contenu principal

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

· 25 minutes de lecture
SEO and Content Writer

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.

Aperçu du scénario
1. Watch records
Airtable récupère les lignes des ZUGFeRD Requests dont Status est « Nouveau ».
2. Create a ZUGFeRD invoice
PDF4me. Convertit le JSON de la facture en XML EN 16931 dans un PDF/A-3.
3. Upload an attachment
Airtable replace le PDF hybride sur le même enregistrement.
4. Update a record
Airtable réécrit le résultat afin que la ligne indique ce qui s'est passé.
5. Send an email
Gmail envoie la facture électronique à l'acheteur figurant sur la ligne.
La version courte

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.

Airtable base PDF4me Live Automations with the ZUGFeRD Requests table open, showing rows RE-2026-0007 to RE-2026-0010 with InvoiceDate 2026-10-12, DueDate 2026-11-11, Currency EUR, SellerName Muster GmbH at Hauptstrasse 1, 10115 Berlin DE with SellerVATID DE123456789, BuyerName Test Kunde AG at Bahnhofstrasse 5, 80331 Muenchen DE, ItemDescription Consulting, Quantity 10.00, UnitPrice 100.50, VATRate 19.00, NetTotal 1005, VATAmount 191, GrossTotal 1196 and Status Generated

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

Gmail showing the received message with subject Your e-invoice RE-2026-0009, the body reading Hello Test Kunde AG, Please find your ZUGFeRD e-invoice RE-2026-0009 attached, Total 1195.95 EUR, and one PDF attachment whose thumbnail shows the rendered German invoice

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 Automations avec une table nommée ZUGFeRD 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.
Voir d'abord le produit fini
Voici le fichier exact produit par le scénario capturé pour la ligne RE-2026-0009. Ouvrez-le dans un lecteur pour visualiser la page, et dans un validateur ZUGFeRD pour visualiser le code XML intégré.
Télécharger sample-output-zugferd-re-2026-0009.pdf

Aperçu du scénario​

  1. Watch records (Airtable) récupèrent les nouvelles lignes dans ZUGFeRD Requests.
  2. Create a ZUGFeRD invoice (PDF4me) convertit le JSON en un PDF hybride.
  3. Upload an attachment (Airtable) l'ajoute au champ Document de la même ligne.
  4. Update a record (Airtable) réécrit le résultat.
  5. Send an email (Gmail) permet de transmettre la facture électronique à l'acheteur.

Aperçu complet du scénario​

The Make scenario canvas showing five connected modules in order: Airtable Watch records with a clock icon, PDF4me Create a ZUGFeRD invoice, Airtable Upload an attachment, Airtable Update a record, and Gmail Send an email, each marked with a green tick and one operation

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.

  1. Ajouter Airtable > Watch records comme déclencheur.
  2. Configure:
    • Base: PDF4me Live Automations
    • Tableau: ZUGFeRD Requests
    • Trigger field: Created
    • Label field: Title
    • Limite: 10
    • Formule: {Status}='New'

Configuration Watch records​

Make Airtable Watch records module with Base set to PDF4me Live Automations, Table ZUGFeRD Requests, Trigger field Created, Label field Title, Limit 10, View left empty and Formula braces Status equals New

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.

  1. Ajouter PDF4me > Create a ZUGFeRD invoice.
  2. 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
  3. 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​

Make PDF4me Create a ZUGFeRD invoice module showing File Name ZUGFeRD_ plus the InvoiceNumber token plus .pdf, an empty Document slot for a base PDF, Input Format JSON, an Invoice JSON Data block containing InvoiceId, TypeCode 380, InvoiceType RECHNUNG, IssueDate and DeliveryDate from formatDate expressions, Seller and Buyer objects with addresses, a LineItems array with UnitCode C62, a Totals object, then Output Mode XML With PDF, ZUGFeRD Version 2 star, Conformance Level EN16931 and Render Invoice on PDF set to Yes

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​

ChampValeur iciCe qu'il contrôle
Input FormatJSONVous devez fournir un objet structuré plutôt qu'un fichier XML prêt à l'emploi ou une ligne CSV.
Output ModeXML With PDFRenvoie un seul fichier hybride. XML Only le fichier XML de la facture.
ZUGFeRD Version2*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 LevelEN16931Le profil auquel la facture prétend correspondre, et donc les clés que le JSON doit fournir.
Render Invoice on PDFYesGé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.
DocumentvideLà 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.

  1. Ajouter Airtable > Upload an attachment.
  2. Configure:
    • Base et Table: comme à l'étape 1
    • Record ID: l' id du 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​

Make Airtable Upload an attachment module with Base PDF4me Live Automations, Table ZUGFeRD Requests, Record ID mapped from the trigger id, Attachment field Document, File set to the PDF4me Create a ZUGFeRD invoice output, File name ZUGFeRD_ plus the InvoiceNumber token plus .pdf, Data set to the module 2 Document output and Content type PDF file

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.

  1. Ajouter Airtable > Update a record.
  2. Configure:
    • Base et Table: comme à l'étape 1
    • Record ID: l' id du déclencheur
    • Record: renseignez uniquement les informations à renvoyer, généralement Status et un OutputLink

Update a record​

Make Airtable Update a record module with Base PDF4me Live Automations, Table ZUGFeRD Requests, Record ID mapped from the trigger, and the Record section listing the table fields Title, InvoiceNumber, InvoiceDate, DueDate, Currency with its Map toggle enabled, SellerName, SellerStreet, SellerPostalCode, SellerCity and SellerCountry as empty inputs

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.

  1. Ajouter Gmail > Send an email.
  2. Configure:
    • To: la colonne Email du déclencheur
    • Subject: Your e-invoice et le InvoiceNumber
    • Body type: Raw HTML
    • Content: un court corps HTML indiquant le nom de l’acheteur, la facture et le total
  3. 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​

Make Gmail Send an email module with the recipient mapped from the Email column, Subject Your e-invoice plus the InvoiceNumber token, Body type Raw HTML, an HTML content block greeting the buyer and stating the gross total and currency, and one attachment taking the PDF4me module output with the file name ZUGFeRD_ plus InvoiceNumber plus .pdf

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​

  1. Save le scénario et exécutez-le une fois.
  2. Ajoutez une ligne aux ZUGFeRD Requests avec un vendeur, un acheteur, un article, les deux dates et Status New.
  3. Chacun des cinq modules doit signaler une opération.
  4. Ouvrez la ligne: le champ Document doit contenir un fichier PDF nommé d’après le numéro de facture.
  5. 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.
  6. 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​

Facturer plusieurs lignes
LineItems est déjà un tableau. Conservez les lignes dans une seconde table liée, récupérez-les avec la Search records, puis construisez le tableau avec un agrégateur avant le module PDF4me.
Mettez-le sur votre papier à en-tête.
Le champ Document du module 2 accepte un PDF de base. Si vous y intégrez une page personnalisée, l’ Render Invoice on PDF imprimera la facture directement sur cette page au lieu d’une page vierge.
Conservez également le fichier XML séparément.
Certains acheteurs souhaitent recevoir le fichier structuré seul. Exécutez le module une seconde fois en Output Mode XML Only et joignez le résultat au PDF.
Changer de format par acheteur
Ajoutez une colonne de format et un routeur. En Allemagne, les acheteurs du secteur public privilégient généralement XRechnung aux fichiers hybrides; il s’agit d’un choix de routage, et non d’une 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.

ComparaisonQui le dirige?D'où proviennent les données?Ce que vous entretenez
Plateforme de facturation électronique vs ce scénarioLa finance, via un portailTéléchargements ou intégrationUn contrat par document et un lien avec celui-ci
Module ERP par rapport à ce scénarioLa finance, au sein de l'ERPLe 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énarioUn développeur, à l'intérieur d'une applicationVotre base de données, via le codeLe code, les mises à jour du schéma et les versions
Ce scénarioToute personne capable d'ajouter une ligne AirtableLa 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​

Le module rejette le JSON de la facture

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.

Un validateur rejette le niveau de conformité

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.

Le PDF s'ouvre vierge.

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.

L'acheteur affirme qu'il n'y a pas de fichier XML.

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.