Passa al contenuto principale

Fattura elettronica ZUGFeRD da una base Airtable: crea il JSON e invia il PDF ibrido via email con Make e PDF4me

· 24 minuti di lettura
SEO and Content Writer

PDF4me Create a ZUGFeRD invoice è un modulo Make che trasforma i dati strutturati di una fattura in una fattura elettronica ibrida PDF/A-3. Puntato a una base Airtable, legge una riga, la converte in XML EN 16931, restituisce un file leggibile e analizzabile automaticamente e lo reinserisce nel record.

Cercando "software per la fatturazione elettronica" si ottiene un confronto tra i fornitori: piattaforme, suite, prezzi per documento. Cercando " Airtable può creare fatture" si trova una lunga discussione che spiega che non può. Tra questi due risultati si colloca un team che già utilizza Airtable, a cui è stato appena richiesto che le fatture siano leggibili automaticamente e che non vuole migrare le proprie operazioni su una piattaforma di fatturazione solo per soddisfare un requisito di formato. Questo scenario è pensato proprio per loro.

Riepilogo dello scenario
1. Watch records
Airtable. Seleziona le righe nelle ZUGFeRD Requests in cui Status è Nuovo.
2. Create a ZUGFeRD invoice
PDF4me converte il file JSON della fattura in formato XML EN 16931 all'interno di un PDF/A-3.
3. Upload an attachment
Airtable. Rimette il PDF ibrido sullo stesso record.
4. Update a record
Airtable. Riscrive il risultato in modo che la riga indichi cosa è successo.
5. Send an email
Gmail. Invia la fattura elettronica all'acquirente nella riga.
La versione breve

Una riga viene inserita in una tabella Airtable con un venditore, un acquirente, una voce e i totali. Make la preleva, crea un oggetto JSON compatto a partire dalle colonne e PDF4me lo trasforma in un PDF/A-3 con XML EN 16931 incorporato al suo interno. Il file viene quindi riaggiunto al record come allegato e inviato all'acquirente via e-mail. Cinque moduli, e nessuno scrive XML.

Domande e risposte basate sul "perché"​

Why run this from Airtable rather than an invoicing product?Poiché i dati di fatturazione sono solitamente un sottoprodotto di un lavoro già tracciato altrove, se il progetto, il cliente e la tariffa concordata risiedono in un database, quest'ultimo rappresenta la fonte di dati più affidabile a disposizione. Trasferire tali informazioni in un prodotto per conformarsi a un formato di file significa mantenere lo stesso cliente in due posizioni diverse per sempre.

Why describe the invoice as JSON instead of writing the XML?Poiché la sintassi delle fatture intersettoriali è lunga, profondamente annidata e non ammette errori sulla posizione di ciascun codice, l'oggetto JSON esprime lo stesso concetto in uno spazio molto più ridotto, con chiavi che si leggono come termini commerciali, e PDF4me genera da esso l'XML conforme. La parte in cui è più facile commettere errori è quella che non viene gestita direttamente.

Why does the hybrid file matter?Poiché la fattura ha due destinatari. Il sistema contabile dell'acquirente legge l'XML incorporato e registra il documento senza che nessuno lo digiti; la persona addetta alla contabilità fornitori apre lo stesso file e visualizza una pagina. Un unico artefatto soddisfa entrambi, ed è per questo cheFeRD Il forum tedesco che ha ideato il formato lo ha creato in questo modo, anziché specificare solo XML.

Why attach the result back to the record?Perché una fattura elettronica che non riesci più a trovare è un problema che hai semplicemente rimandato. Inserire il PDF nel campo Document della riga collega il documento ai dati che lo hanno generato, che è esattamente ciò che si desidera quando un acquirente contesta una cifra diciotto mesi dopo.


Cosa riceverai​

Input: una riga Airtable con il numero di fattura, le date, un blocco venditore, un blocco acquirente, una voce e i totali, con Status impostato su Nuovo. Output: un PDF/A-3 ZUGFeRD allegato a tale record e un'e-mail all'acquirente contenente lo stesso file.

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

Una riga per fattura. Ogni colonna qui diventa una chiave nel JSON che lo scenario crea.

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'acquirente vede una normale fattura. Il suo software, invece, ne legge il contenuto in formato XML.


Di cosa hai bisogno​

  • A Make account.Open Make Cinque moduli nelle applicazioni standard.
  • PDF4me API key.Get your API key Un singolo collegamento PDF4me è sufficiente per l'intero scenario.
  • An Airtable baseLa base dati acquisita è PDF4me Live Automations con una tabella denominata ZUGFeRD Requests, che contiene l'intestazione della fattura, il blocco del venditore con il codice IVA, il blocco dell'acquirente, i campi delle voci di riga, i totali, una colonna Email, un campo Status e un campo allegato chiamato Document.
  • A Gmail accountper la consegna, collegato a Make.
  • Your seller details including a VAT IDProvengono da colonne, quindi una singola base dati può fatturare per più di un'entità legale.
Guarda prima l'articolo finito
Questo è il file esatto prodotto dallo scenario acquisito per la riga RE-2026-0009. Aprilo con un lettore per visualizzare la pagina e con un validatore ZUGFeRD per visualizzare l'XML incorporato.
Scarica sample-output-zugferd-re-2026-0009.pdf

Panoramica dello scenario​

  1. Watch records (Airtable) e rileva le nuove righe nelle ZUGFeRD Requests.
  2. Create a ZUGFeRD invoice (PDF4me) convertendo il JSON in un PDF ibrido.
  3. Upload an attachment (Airtable) lo allega al campo Document sulla stessa riga.
  4. Update a record (Airtable) e ne scrive il risultato.
  5. Send an email (Gmail) recapita la fattura elettronica all'acquirente.

Panoramica completa dello scenario​

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

Stessa struttura a cinque moduli dello scenario QR svizzero. Solo il modulo PDF4me al centro è diverso.


Passaggio 1: Come si attiva uno scenario da una riga Airtable?​

Flusso finora: ancora niente, questo è il trigger.

Una riga contrassegnata come "pronta" rappresenta la richiesta di emissione di una fattura.

  1. Aggiungi Airtable > Watch records come trigger.
  2. Specificare:
    • Base: PDF4me Live Automations
    • Tavolo: ZUGFeRD Requests
    • Trigger field: Created
    • Label field: Title
    • Limite: 10
    • Formula: {Status}='New'

Configurazione 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 funge da interruttore. Non viene emesso nulla finché una persona non imposta una riga su Nuovo.


Passaggio 2: Come si trasforma una riga in una fattura ZUGFeRD?​

Flusso finora: il trigger Airtable.

Questo è il modulo che genera la fattura elettronica. Le impostazioni definiscono il formato; il file JSON ne determina il contenuto.

  1. Aggiungi PDF4me > Create a ZUGFeRD invoice.
  2. Configurare l'output:
    • File Name: ZUGFeRD_ seguito dal InvoiceNumber e dall'estensione .pdf
    • Input Format: JSON
    • Output Mode: XML With PDF
    • ZUGFeRD Version: 2*
    • Conformance Level: EN16931
    • Render Invoice on PDF: Yes
  3. Incolla l'oggetto fattura in Invoice JSON Data e mappa le colonne in:
{
"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"
}
}

Vale la pena soffermarsi su tre parti di quell'oggetto. TypeCode 380 è il codice per una fattura commerciale ed è fisso, non derivato da nulla nel database. UnitCode C62 è il codice UN/ECE per "un'unità di qualcosa", che è ciò che serve per ore o unità di servizio. Infine, il blocco Payment contiene PaymentReference, il testo che l'acquirente cita al momento del pagamento, che in questo caso è semplicemente il numero della fattura.

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

Il campo scorre nell'editor, quindi solo una parte dell'oggetto è visibile alla volta. Il blocco qui sopra rappresenta l'oggetto nella sua interezza.

Ciò che decide ogni impostazione​

CampoValore quiCiò che controlla
Input FormatJSONÈ necessario fornire un oggetto strutturato anziché un file XML già pronto o una riga CSV.
Output ModeXML With PDFRestituisce un file ibrido. XML Only il file XML della fattura
ZUGFeRD Version2*La generazione 2.x, che è quella allineata con EN 16931 La vecchia 1.0 non lo è.
Conformance LevelEN16931Il profilo che la fattura dichiara di soddisfare e, di conseguenza, le chiavi che il JSON deve fornire
Render Invoice on PDFYesCrea una pagina di fattura leggibile a partire dagli stessi dati. In assenza di un PDF di base, è questo che conferisce al file un aspetto più umano.
DocumentvuotoDove andrebbe inserito un PDF di base con la tua intestazione. Lascialo vuoto e PDF4me genererà una pagina semplice.

Tip.Le chiavi relative a denaro e quantità devono arrivare come numeri nudi, non come stringhe tra virgolette, motivo per cui vengono elaborateparseNumber mentre i campi di testo sono racchiusi tra virgolette. Una virgoletta"1005" verrà respinto laddove un semplice1005 viene accettato e l'errore che riceverai si riferirà allo schema anziché alle virgolette. Nota il secondo argomento:parseNumber(1.NetTotal; ".") dice Make il separatore decimale è un punto. Lascialo fuori e una locale che scrive1005,00 anziché fallire, il risultato sarà un numero errato, che è l'esito peggiore.


Passaggio 3: Come si fa a reinserire la fattura elettronica nel sistema?​

Flusso finora: il trigger più il modulo PDF4me.

  1. Aggiungi Airtable > Upload an attachment.
  2. Specificare:
    • Base e Table: come nel passaggio 1
    • Record ID: l' id del trigger
    • Attachment field: Document
    • File: output di PDF4me - Create a ZUGFeRD invoice
    • File name: ZUGFeRD_ seguito dal InvoiceNumber e dall'estensione .pdf
    • Data: il Document di output del modulo 2
    • Content type: PDF file

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 è PDF file. Lo scenario correlato con codice QR svizzero utilizza un'immagine PNG nello stesso slot.


Passaggio 4: Come si registra il risultato sulla riga?​

Flusso finora: tutto tramite caricamento dell'allegato.

  1. Aggiungi Airtable > Update a record.
  2. Specificare:
    • Base e Table: come nel passaggio 1
    • Record ID: l' id del trigger
    • Record: inserisci solo ciò che desideri venga scritto, che di solito è Status e 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

Tutte le colonne della tabella sono visualizzate qui. L'immagine le mostra vuote e il pannello scorrevole, quindi impostate Status con attenzione.

Tip.Un campo mappato ma vuoto cancella il contenuto della cella. In una tabella di fatturazione, ciò significa un codice IVA vuoto o una data di scadenza mancante in un'esecuzione che altrimenti ha segnalato il successo, quindi non modificare nulla che non sia intenzionalmente scritto.


Passaggio 5: Come si invia la fattura elettronica all'acquirente?​

Flusso finora: tutto attraverso l'aggiornamento del record.

Non è stata emessa alcuna fattura elettronica presente nel database.

  1. Aggiungi Gmail > Send an email.
  2. Specificare:
    • To: la colonna Email dal trigger
    • Subject: Your e-invoice più il InvoiceNumber
    • Body type: Raw HTML
    • Content: un breve corpo HTML che indica l'acquirente, la fattura e il totale
  3. Allega l'allegato:
    • File: PDF4me - Create a ZUGFeRD invoice
    • File name: ZUGFeRD_ seguito dal InvoiceNumber e dall'estensione .pdf
    • Data: il Document di output del modulo 2

Configurazione 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

L'allegato proviene dal modulo 2, quindi Airtable non viene mai letto per il file.


Esegui lo scenario e verifica​

  1. Save lo scenario ed eseguilo una volta.
  2. Aggiungi una riga alle ZUGFeRD Requests con un venditore, un acquirente, una voce, entrambe le date e Status New.
  3. Ciascuno dei cinque moduli dovrebbe segnalare un'operazione.
  4. Apri la riga: il campo Document dovrebbe contenere un file PDF denominato con il numero della fattura.
  5. Apri l'allegato. Dovresti visualizzare una pagina di fattura leggibile e un validatore ZUGFeRD dovrebbe trovare il codice XML EN 16931 all'interno dello stesso file.
  6. Controlla la casella di posta dell'acquirente per trovare il messaggio e il relativo allegato.

Nella sequenza acquisita, la riga RE-2026-0009 ha generato una fattura da Muster GmbH di Berlin con partita IVA DE123456789 a Test Kunde AG di Muenchen, per dieci unità di Consulting a 100,50, e l'e-mail ha riportato un totale di 1195,95 EUR.

Do not trust the grid for decimals.La griglia Airtable mostra VATAmount 191 e GrossTotal 1196, mentre la fattura e l'e-mail riportano rispettivamente 190.95 e 1195.95. Non viene effettuato alcun ricalcolo: TaxTotal e GrandTotal vengono letti direttamente da queste due colonne. La griglia si limita a visualizzarli con la precisione impostata per il campo numerico. È consigliabile aumentare tale precisione prima di tentare di confrontare una colonna con una fattura, poiché le cifre appaiono semplicemente incoerenti.


Varianti comuni che puoi aggiungere senza dover ricostruire​

Fattura su più righe
LineItems è già un array. Mantieni le righe in una seconda tabella collegata, recuperale con Search records e crea l'array con un aggregatore prima del modulo PDF4me.
Mettilo sulla tua carta intestata
Lo slot Document nel modulo 2 accetta un PDF di base. Inserisci una pagina personalizzata e Render Invoice on PDF disegnerà la fattura su di essa anziché su una pagina vuota.
Conservare anche il file XML separatamente.
Alcuni acquirenti desiderano il file strutturato separatamente. Eseguite il modulo una seconda volta con Output Mode impostata su XML Only e allegate il risultato insieme al PDF.
Cambia formato per acquirente
Aggiungi una colonna di formato e un router. Gli acquirenti del settore pubblico in Germania in genere preferiscono XRechnung a un file ibrido, e questa è una decisione di routing, non una ricostruzione.

Come si confronta questo metodo con gli altri metodi di emissione di una fattura elettronica?​

Ogni riga descrive l'alternativa. L'ultima riga rappresenta questo scenario.

ConfrontoChi lo gestisce?Da dove provengono i datiCiò che mantieni
Piattaforma di fatturazione elettronica a confronto con questo scenarioFinanza, attraverso un portaleCaricamenti o un'integrazioneUn contratto per documento e una connessione ad esso
Modulo ERP rispetto a questo scenarioFinanza, all'interno del sistema ERPIl registro contabile del sistema ERPLicenze e una migrazione per inserire i tuoi dati
Libreria di sviluppo rispetto a questo scenarioUno sviluppatore, all'interno di un'applicazioneIl tuo database, tramite codiceIl codice, gli aggiornamenti dello schema e le release
Questo scenarioChiunque può aggiungere una riga AirtableLa base che la squadra già mantieneCinque moduli e un oggetto JSON

Domande frequenti​

Che cos'è l'automazione della contabilità fornitori?​

Dal punto di vista del destinatario, ciò significa che una fattura arriva, i suoi campi vengono letti automaticamente senza alcun inserimento manuale, le cifre vengono verificate e il risultato viene registrato o inoltrato per l'approvazione. La fattura elettronica ibrida è ciò che rende affidabile la fase di lettura, poiché i dati sono incorporati nel documento anziché essere recuperati da un'immagine della pagina.

Questo scenario rappresenta la prima parte dell'accordo. La creazione di un file che il sistema dell'acquirente possa analizzare è ciò che consente alla contabilità fornitori di funzionare in modo automatico.

Airtable è in grado di creare fatture?​

Non sono conformi. Airtable può contenere i dati delle fatture e disporli in un'interfaccia o in una visualizzazione stampabile, ma non può produrre un PDF/A-3 con XML conforme alla norma EN 16931, che è ciò che richiede l'obbligo di fatturazione elettronica.

La suddivisione utilizzata in questo scenario è quella più pratica: Airtable è il record, PDF4me produce il documento e quest'ultimo viene restituito al record come allegato.

Come funziona l'automazione della contabilità fornitori?​

Il processo si articola in tre fasi: acquisizione, estrazione e registrazione. L'acquisizione consiste nel raccogliere i documenti in un unico luogo; l'estrazione li trasforma in campi; la registrazione scrive questi campi nel registro contabile, solitamente preceduta da un controllo di affidabilità o di approvazione.

Le fatture elettroniche ibride bypassano la parte intermedia. Quando l'XML è già presente all'interno del file, l'estrazione avviene tramite analisi sintattica anziché riconoscimento, ed è per questo che le normative continuano a spingere in questa direzione.

Che cos'è l'automazione Airtable?​

Airtable include un proprio strumento di creazione di automazioni per trigger e azioni all'interno di una base, che copre gran parte del lavoro interno. Tuttavia, non è in grado di richiamare un'API per documenti e restituire un file per un campo allegato, passaggio che è invece necessario in questo scenario.

Make si trova proprio accanto ad esso per questo motivo. Il trigger continua a monitorare una tabella Airtable, ma la parte centrale dello scenario può accedere a servizi a cui le automazioni di Airtable non possono accedere.


Risoluzione dei problemi​

Il modulo rifiuta il JSON della fattura

Apri il bundle di input del modulo nella cronologia delle esecuzioni e leggilo come JSON. Una colonna Airtable vuota lascia una chiave vuota e un valore monetario che ha mantenuto le virgolette arriva come testo dove è previsto un numero. Entrambi producono un oggetto che sembra corretto ma la conversione fallisce comunque.

Un validatore rifiuta il livello di conformità

Conformance Level determina quali campi sono richiesti dal profilo. Dichiarare la conformità EN16931 quando il JSON omette le chiavi previste dal profilo comporterà l'errore di convalida, anche se il file si apre normalmente. Fornire le chiavi mancanti o passare a un profilo di livello inferiore.

Il PDF si apre vuoto

Render Invoice on PDF è impostata su "No" e non è stato fornito alcun PDF di base, quindi il codice XML è stato incorporato senza alcun elemento grafico. Il file è comunque una fattura elettronica valida, ma la sua parte compilata dall'utente è vuota.

L'acquirente afferma che nel file non è presente alcun file XML.

Verifica che Output Mode sia impostata XML With PDF, quindi controlla che i moduli 3 e 5 prendano entrambi i dati dal modulo 2. Allegare qualsiasi altro elemento invia una pagina che sembra corretta ma non contiene nulla che il loro software possa leggere.


Prossimi passi​

Un mandato di solito si presenta come un problema di formato file. In sostanza, si tratta di capire dove si trovano già i dati della fattura e se qualche programma è in grado di leggerli.