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

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.
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.

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

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 Automationscon una tabella denominataZUGFeRD 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 chiamatoDocument. - 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.
Panoramica dello scenario
- Watch records (Airtable) e rileva le nuove righe nelle
ZUGFeRD Requests. - Create a ZUGFeRD invoice (PDF4me) convertendo il JSON in un PDF ibrido.
- Upload an attachment (Airtable) lo allega al campo
Documentsulla stessa riga. - Update a record (Airtable) e ne scrive il risultato.
- Send an email (Gmail) recapita la fattura elettronica all'acquirente.
Panoramica completa dello scenario

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.
- Aggiungi Airtable > Watch records come trigger.
- Specificare:
- Base:
PDF4me Live Automations - Tavolo:
ZUGFeRD Requests - Trigger field:
Created - Label field:
Title - Limite:
10 - Formula:
{Status}='New'
- Base:
Configurazione Watch records

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.
- Aggiungi PDF4me > Create a ZUGFeRD invoice.
- 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
- File Name:
- 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

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
| Campo | Valore qui | Ciò che controlla |
|---|---|---|
| Input Format | JSON | È necessario fornire un oggetto strutturato anziché un file XML già pronto o una riga CSV. |
| Output Mode | XML With PDF | Restituisce un file ibrido. XML Only il file XML della fattura |
| ZUGFeRD Version | 2* | La generazione 2.x, che è quella allineata con EN 16931 La vecchia 1.0 non lo è. |
| Conformance Level | EN16931 | Il profilo che la fattura dichiara di soddisfare e, di conseguenza, le chiavi che il JSON deve fornire |
| Render Invoice on PDF | Yes | Crea 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. |
| Document | vuoto | Dove 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.
- Aggiungi Airtable > Upload an attachment.
- Specificare:
- Base e Table: come nel passaggio 1
- Record ID: l'
iddel 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

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

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.
- Aggiungi Gmail > Send an email.
- Specificare:
- To: la colonna Email dal trigger
- Subject:
Your e-invoicepiù il InvoiceNumber - Body type:
Raw HTML - Content: un breve corpo HTML che indica l'acquirente, la fattura e il totale
- 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

L'allegato proviene dal modulo 2, quindi Airtable non viene mai letto per il file.
Esegui lo scenario e verifica
- Save lo scenario ed eseguilo una volta.
- Aggiungi una riga alle
ZUGFeRD Requestscon un venditore, un acquirente, una voce, entrambe le date e StatusNew. - Ciascuno dei cinque moduli dovrebbe segnalare un'operazione.
- Apri la riga: il campo
Documentdovrebbe contenere un file PDF denominato con il numero della fattura. - 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.
- 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
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.
| Confronto | Chi lo gestisce? | Da dove provengono i dati | Ciò che mantieni |
|---|---|---|---|
| Piattaforma di fatturazione elettronica a confronto con questo scenario | Finanza, attraverso un portale | Caricamenti o un'integrazione | Un contratto per documento e una connessione ad esso |
| Modulo ERP rispetto a questo scenario | Finanza, all'interno del sistema ERP | Il registro contabile del sistema ERP | Licenze e una migrazione per inserire i tuoi dati |
| Libreria di sviluppo rispetto a questo scenario | Uno sviluppatore, all'interno di un'applicazione | Il tuo database, tramite codice | Il codice, gli aggiornamenti dello schema e le release |
| Questo scenario | Chiunque può aggiungere una riga Airtable | La base che la squadra già mantiene | Cinque 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
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.
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.
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.
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.