Pular para o conteúdo principal

Fatura eletrônica ZUGFeRD baseada no Airtable: Crie o JSON e envie o PDF híbrido por e-mail no Make com PDF4me

· 25 min para ler
SEO and Content Writer

PDF4me Create a ZUGFeRD invoice é um módulo Make que transforma dados estruturados de faturas em uma fatura eletrônica híbrida em formato PDF/A-3. Ao ser configurado em uma base Airtable, ele lê uma linha, converte-a para XML EN 16931, retorna um arquivo legível e analisável por máquina e o insere novamente no registro.

Ao pesquisar por software de faturamento eletrônico, você encontra uma comparação de fornecedores: plataformas, pacotes, preços por documento. Ao pesquisar se Airtable pode gerar faturas, você encontra uma longa discussão explicando que não. Entre esses dois resultados, está uma equipe que já utiliza o Airtable, acabou de ser informada de que suas faturas precisam ser legíveis por máquina e não quer migrar suas operações para uma plataforma de faturamento apenas para atender a um requisito de formato. Este cenário é para eles.

O cenário em resumo
1. Watch records
Airtable. Seleciona linhas em ZUGFeRD Requests onde Status é "Novo".
2. Create a ZUGFeRD invoice
PDF4me. Converte o JSON da fatura em XML EN 16931 dentro de um PDF/A-3.
3. Upload an attachment
Airtable. Coloca o PDF híbrido de volta no mesmo registro.
4. Update a record
Airtable. Reescreve o resultado para que a linha indique o que aconteceu.
5. Send an email
Gmail. Envia a fatura eletrônica para o comprador na linha correspondente.
A versão curta

Uma linha é inserida em uma tabela Airtable com um vendedor, um comprador, um item e os totais. Make captura essa linha, constrói um objeto JSON compacto a partir das colunas e PDF4me converte isso em um PDF/A-3 com XML EN 16931 incorporado. O arquivo é então adicionado ao registro como um anexo e enviado ao comprador por e-mail. Cinco módulos, e ninguém escreve XML.

Perguntas e respostas baseadas no "porquê".​

Why run this from Airtable rather than an invoicing product?Isso ocorre porque os dados da fatura geralmente são um subproduto de um trabalho já registrado em algum lugar. Se o projeto, o cliente e o valor acordado estiverem em uma base de dados, essa base é o que mais se aproxima de uma fonte confiável. Transferir essas informações para um produto específico para atender a um formato de arquivo significa manter o mesmo cliente em dois lugares diferentes para sempre.

Why describe the invoice as JSON instead of writing the XML?Como a sintaxe de faturas intersetoriais é longa, profundamente aninhada e inflexível quanto à posição de cada linha de código, o objeto JSON expressa a mesma informação em um espaço muito menor, com chaves que se assemelham a termos comerciais. PDF4me gera o XML compatível a partir dele. A parte mais fácil de errar é justamente aquela que você não mantém.

Why does the hybrid file matter?Porque a fatura tem dois públicos. O sistema de contabilidade do comprador lê o XML incorporado e registra o documento sem que ninguém precise digitá-lo; a pessoa do departamento de contas a pagar abre o mesmo arquivo e vê uma página. Um único artefato atende a ambos, e é por isso que...FeRD O fórum alemão por trás do formato o construiu dessa maneira, em vez de especificar apenas XML.

Why attach the result back to the record?Porque uma fatura eletrônica que você não consegue encontrar depois é um problema que você apenas adiou. Inserir o PDF no campo Document da linha vincula o artefato aos dados que o produziram, que é exatamente o que você deseja quando um comprador contesta um valor dezoito meses depois.


O que você receberá​

Entrada: uma linha Airtable com o número da fatura, as datas, um bloco do vendedor, um bloco do comprador, um item de linha e os totais, com Status definido como Novo. Saída: um PDF/A-3 ZUGFeRD anexado a esse registro e um e-mail para o comprador contendo o mesmo arquivo.

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

Uma linha por fatura. Cada coluna aqui se torna uma chave no JSON que o cenário constrói.

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

O comprador vê uma fatura normal. O software dele lê o XML contido nela.


Do que você precisa​

  • A Make account.Open Make Cinco módulos sobre aplicativos padrão.
  • PDF4me API key.Get your API key Uma única conexão PDF4me cobre todo o cenário.
  • An Airtable baseA base capturada é PDF4me Live Automations com uma tabela chamada ZUGFeRD Requests, contendo o cabeçalho da fatura, o bloco do vendedor incluindo um número de IVA, o bloco do comprador, os campos dos itens da fatura, os totais, uma coluna de e-mail, um campo Status e um campo de anexo chamado Document.
  • A Gmail accountPara entrega, conectado ao Make.
  • Your seller details including a VAT IDElas provêm de colunas, portanto, uma base pode faturar para mais de uma entidade legal.
Veja primeiro o artigo finalizado.
Este é o arquivo exato que o cenário capturado gerou para a linha RE-2026-0009. Abra-o em um leitor para visualizar a página e em um validador ZUGFeRD para visualizar o XML incorporado.
Baixe o arquivo sample-output-zugferd-re-2026-0009.pdf

Visão geral do cenário​

  1. Watch records (Airtable) detecta novas linhas nas ZUGFeRD Requests.
  2. Create a ZUGFeRD invoice (PDF4me) converte o JSON em um PDF híbrido.
  3. Upload an attachment (Airtable) o anexa ao campo Document na mesma linha.
  4. Update a record (Airtable) grava o resultado de volta.
  5. Send an email (Gmail) entrega a fatura eletrônica ao comprador.

Visão geral completa do cenário​

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

O formato de cinco módulos é o mesmo do cenário QR suíço. Apenas o módulo PDF4me no meio difere.


Passo 1: Como acionar um cenário a partir de uma linha Airtable?​

Fluxo até agora: nada ainda, este é o gatilho.

Uma linha marcada como pronta indica uma solicitação para emissão de fatura.

  1. Adicione Airtable > Watch records como gatilho.
  2. Configurar:
    • Base: PDF4me Live Automations
    • Mesa: ZUGFeRD Requests
    • Trigger field: Created
    • Label field: Title
    • Limite: 10
    • Fórmula: {Status}='New'

Configuração 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 é o interruptor. Nada é emitido até que alguém defina uma linha como Nova.


Passo 2: Como transformar uma linha em uma fatura ZUGFeRD?​

Fluxo até o momento: o gatilho Airtable.

Este é o módulo que gera a fatura eletrônica. As configurações definem o formato; o JSON define o conteúdo.

  1. Adicionar PDF4me > Create a ZUGFeRD invoice.
  2. Configure a saída:
    • File Name: ZUGFeRD_ mais o InvoiceNumber mais .pdf
    • Input Format: JSON
    • Output Mode: XML With PDF
    • ZUGFeRD Version: 2*
    • Conformance Level: EN16931
    • Render Invoice on PDF: Yes
  3. Cole o objeto da fatura em Invoice JSON Data e mapeie as colunas em:
{
"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"
}
}

Três partes desse objeto merecem atenção. TypeCode 380 é o código para uma fatura comercial e é fixo, não derivado de nada na base. UnitCode C62 é o código UN/ECE para "uma de alguma coisa", que é o que você precisa para horas ou unidades de serviço. E o bloco Payment no final contém PaymentReference, o texto que o comprador cita ao pagar, que aqui é simplesmente o número da fatura.

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

O campo rola no editor, então apenas parte do objeto fica visível por vez. O bloco acima representa o objeto inteiro.

O que cada configuração decide.​

CampoValor aquiO que ele controla
Input FormatJSONQue você forneça um objeto estruturado em vez de um XML pronto ou uma linha CSV.
Output ModeXML With PDFRetorna um arquivo híbrido. XML Only retorna o XML da fatura por si só.
ZUGFeRD Version2*A geração 2.x, que é a que está alinhada com EN 16931 A versão legada 1.0 não está.
Conformance LevelEN16931O perfil que a fatura alega atender e, portanto, quais chaves o JSON deve fornecer.
Render Invoice on PDFYesCrie uma página de fatura legível a partir dos mesmos dados. Sem um PDF base fornecido, é isso que dá ao arquivo sua versão legível.
DocumentvazioOnde um PDF base com seu cabeçalho seria inserido. Deixe em branco e PDF4me renderizará uma página em branco.

Tip.As chaves de valor monetário e quantidade precisam chegar como números puros, não como strings entre aspas, e é por isso que elas passam por esse processo.parseNumber enquanto os campos de texto são delimitados por aspas. Um texto entre aspas"1005" será rejeitado onde for simples1005 é aceito, e o erro que você receberá se referirá ao esquema em vez das aspas. Observe o segundo argumento:parseNumber(1.NetTotal; ".") O separador decimal é um ponto. Make-o de fora e use uma localidade que escreva1005,00 O resultado será sempre o mesmo: em vez de falhar, a análise resultará em um número incorreto, o que seria o pior resultado possível.


Passo 3: Como faço para reinserir a fatura eletrônica no registro?​

Fluxo até o momento: o gatilho mais o módulo PDF4me.

  1. Adicionar Airtable > Upload an attachment.
  2. Configurar:
    • Base e Table: como na etapa 1
    • Record ID: o id do gatilho
    • Attachment field: Document
    • File: resultado do PDF4me - Create a ZUGFeRD invoice
    • File name: ZUGFeRD_ mais o InvoiceNumber mais .pdf
    • Data: o Document de saída do módulo 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 aqui é PDF file. O cenário equivalente no sistema QR suíço utiliza uma imagem PNG no mesmo campo.


Passo 4: Como você registra o resultado na linha?​

Fluxo até o momento: tudo feito através do upload de anexos.

  1. Adicionar Airtable > Update a record.
  2. Configurar:
    • Base e Table: como na etapa 1
    • Record ID: o id do gatilho
    • Record: preencha apenas o que você deseja que seja gravado, que normalmente é Status e um 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

Todas as colunas da tabela aparecem aqui. A captura de tela mostra-as vazias e o painel rolado, portanto, defina Status deliberadamente.

Tip.Um campo mapeado, mas vazio, limpa a célula. Em uma tabela de faturas, isso significa um número de IVA em branco ou uma data de vencimento perdida em uma execução que, de outra forma, teria sido bem-sucedida. Portanto, não insira nada que você não esteja preenchendo intencionalmente.


Etapa 5: Como enviar a fatura eletrônica ao comprador?​

Fluxo até o momento: tudo até a atualização do registro.

A fatura eletrônica armazenada em um banco de dados não foi emitida.

  1. Adicionar Gmail > Send an email.
  2. Configurar:
    • To: a coluna Email do gatilho
    • Subject: Your e-invoice mais o InvoiceNumber
    • Body type: Raw HTML
    • Content: um breve corpo HTML com o nome do comprador, a fatura e o total.
  3. Anexe o arquivo:
    • File: o PDF4me - Create a ZUGFeRD invoice
    • File name: ZUGFeRD_ mais o InvoiceNumber mais .pdf
    • Data: o Document de saída do módulo 2

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

O anexo vem do módulo 2, portanto Airtable nunca é lido novamente para o arquivo.


Execute o cenário e verifique.​

  1. Save o cenário e execute-o uma vez.
  2. Adicione uma linha às ZUGFeRD Requests com um vendedor, um comprador, um item de linha, ambas as datas e Status New.
  3. Cada um dos cinco módulos deve reportar uma operação.
  4. Abra a linha: o campo Document deve conter um arquivo PDF com o nome do número da fatura.
  5. Abra o anexo. Você deverá ver uma página de fatura legível e um validador ZUGFeRD deverá encontrar o XML EN 16931 dentro do mesmo arquivo.
  6. Verifique a caixa de entrada do comprador para encontrar a mensagem e o anexo.

Na execução capturada, a linha RE-2026-0009 gerou uma fatura da Muster GmbH em Berlin, com número de IVA DE123456789 para a Test Kunde AG em Muenchen, referente a dez unidades de Consulting no valor de 100,50, e o e-mail informava um total de 1195,95 EUR.

Do not trust the grid for decimals.A tabela Airtable mostra VATAmount 191 e o GrossTotal 1196, enquanto a fatura e o e-mail indicam 190.95 e 1195.95, respectivamente. Nada está sendo recalculado: TaxTotal e GrandTotal são lidos diretamente dessas duas colunas. A tabela simplesmente os exibe com a precisão definida no campo numérico. Aumente essa precisão antes que alguém tente conciliar uma coluna com uma fatura, pois os valores apenas parecerão inconsistentes.


Variações comuns que você pode adicionar sem reconstruir​

Fatura com mais de uma linha
LineItems já é uma matriz. Mantenha as linhas em uma segunda tabela encadeada, recupere-as com a Search records e construa a matriz com um agregador antes do módulo PDF4me.
Coloque isso no seu papel timbrado.
O campo Document no módulo 2 aceita um PDF base. Insira uma página personalizada e Render Invoice on PDF desenhará a fatura diretamente nela, em vez de em uma página em branco.
Mantenha o XML separado também.
Alguns compradores desejam o arquivo estruturado separadamente. Execute o módulo uma segunda vez com Output Mode definido como XML Only e anexe esse resultado junto com o PDF.
Alterar formatos por comprador
Adicione uma coluna de formato e um roteador. Compradores do setor público na Alemanha geralmente preferem XRechnung em vez de um arquivo híbrido, e essa é uma decisão de roteamento, não de reconstrução.

Como isso se compara a outras formas de gerar uma fatura eletrônica?​

Cada linha descreve a alternativa. A última linha representa este cenário.

ComparaçãoQuem o dirige?De onde vêm os dados?O que você mantém
Plataforma de faturamento eletrônico versus este cenárioFinanças, através de um portalUploads ou uma integraçãoUm contrato por documento e sua respectiva conexão.
Módulo ERP versus este cenárioFinanças dentro do ERPO próprio livro-razão do ERPLicenças e uma migração para obter seus dados.
Biblioteca de desenvolvedor versus este cenárioUm desenvolvedor, dentro de um aplicativoSeu banco de dados, por meio de código.O código, as atualizações de esquema e os lançamentos.
Este cenárioQualquer pessoa que possa adicionar uma linha AirtableA base que a equipe já mantémCinco módulos e um objeto JSON

Perguntas frequentes​

O que é a automatização de contas a pagar?​

Do lado do destinatário, isso significa que uma fatura chega, seus campos são lidos sem que ninguém os digite, os valores são verificados e o resultado é lançado ou encaminhado para aprovação. Uma fatura eletrônica híbrida é o que torna a etapa de leitura confiável, porque os dados são incorporados em vez de serem recuperados de uma imagem da página.

Este cenário representa a metade de envio desse acordo. Gerar um arquivo que o sistema do comprador possa analisar é o que permite que suas contas a pagar sejam processadas sem supervisão.

Airtable consegue criar faturas?​

Não são compatíveis. Airtable pode armazenar dados de faturas e exibi-los em uma interface ou em uma visualização para impressão, mas não consegue gerar um PDF/A-3 com XML em conformidade com a norma EN 16931, que é o que uma norma de faturamento eletrônico exige.

A divisão utilizada neste cenário é a prática: Airtable é o registro, PDF4me produz o artefato e o artefato retorna ao registro como um anexo.

Como funciona a automatização das contas a pagar?​

Funciona em três partes: entrada, extração e lançamento. A entrada consiste em reunir os documentos em um só lugar; a extração os transforma em campos; o lançamento grava esses campos no livro-razão, geralmente com uma verificação de confiança ou aprovação prévia.

As faturas eletrônicas híbridas eliminam a etapa intermediária. Quando o XML já está dentro do arquivo, a extração se torna uma análise sintática em vez de um reconhecimento, e é por isso que as regulamentações continuam a pressionar nessa direção.

O que é a automação Airtable?​

Airtable inclui seu próprio construtor de automação para gatilhos e ações em um pacote base, o que abrange boa parte do trabalho interno. No entanto, ele não consegue acessar uma API de documentos e retornar um arquivo para um campo de anexo, que é a etapa necessária neste cenário.

Make fica ao lado exatamente por esse motivo. O gatilho ainda monitora uma tabela Airtable, mas o meio do cenário consegue alcançar serviços que as próprias automações do Airtable não conseguem.


Solução de problemas​

O módulo rejeita o JSON da fatura.

Abra o pacote de entrada do módulo no histórico de execuções e leia-o como JSON. Uma coluna vazia Airtable deixa uma chave vazia, e um valor monetário que manteve as aspas chega como texto onde um número era esperado. Ambos produzem um objeto que parece correto, mas ainda assim falha na conversão.

Um validador rejeita o nível de conformidade.

Conformance Level define quais campos o perfil exige. Alegar conformidade com EN16931 enquanto o JSON omite chaves esperadas pelo perfil resulta em falha na validação, mesmo que o arquivo abra normalmente. Forneça as chaves ausentes ou utilize um perfil inferior.

O PDF abre em branco.

Render Invoice on PDF está definida como "Não" e nenhum PDF base foi fornecido, portanto o XML foi incorporado sem nenhum elemento gráfico. O arquivo ainda é uma fatura eletrônica válida, mas a parte correspondente ao texto escrito está vazia.

O comprador afirma que não há XML no arquivo.

Verifique se Output Mode é XML With PDF e, em seguida, certifique-se de que os módulos 3 e 5 estejam obtendo seus dados do módulo 2. Anexar qualquer outro arquivo enviará uma página que parece correta, mas não contém nada que o software deles possa ler.


Próximos passos​

Normalmente, um problema surge devido a uma questão de formato de arquivo. Na verdade, trata-se de saber onde os dados da sua fatura já estão armazenados e se algum programa consegue lê-los.