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

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

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

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 Automationscom uma tabela chamadaZUGFeRD 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 chamadoDocument. - 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.
Visão geral do cenário
- Watch records (Airtable) detecta novas linhas nas
ZUGFeRD Requests. - Create a ZUGFeRD invoice (PDF4me) converte o JSON em um PDF híbrido.
- Upload an attachment (Airtable) o anexa ao campo
Documentna mesma linha. - Update a record (Airtable) grava o resultado de volta.
- Send an email (Gmail) entrega a fatura eletrônica ao comprador.
Visão geral completa do cenário

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.
- Adicione Airtable > Watch records como gatilho.
- Configurar:
- Base:
PDF4me Live Automations - Mesa:
ZUGFeRD Requests - Trigger field:
Created - Label field:
Title - Limite:
10 - Fórmula:
{Status}='New'
- Base:
Configuração Watch records

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

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.
| Campo | Valor aqui | O que ele controla |
|---|---|---|
| Input Format | JSON | Que você forneça um objeto estruturado em vez de um XML pronto ou uma linha CSV. |
| Output Mode | XML With PDF | Retorna um arquivo híbrido. XML Only retorna o XML da fatura por si só. |
| ZUGFeRD Version | 2* | A geração 2.x, que é a que está alinhada com EN 16931 A versão legada 1.0 não está. |
| Conformance Level | EN16931 | O perfil que a fatura alega atender e, portanto, quais chaves o JSON deve fornecer. |
| Render Invoice on PDF | Yes | Crie 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. |
| Document | vazio | Onde 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.
- Adicionar Airtable > Upload an attachment.
- Configurar:
- Base e Table: como na etapa 1
- Record ID: o
iddo 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

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

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.
- Adicionar Gmail > Send an email.
- Configurar:
- To: a coluna Email do gatilho
- Subject:
Your e-invoicemais o InvoiceNumber - Body type:
Raw HTML - Content: um breve corpo HTML com o nome do comprador, a fatura e o total.
- 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

O anexo vem do módulo 2, portanto Airtable nunca é lido novamente para o arquivo.
Execute o cenário e verifique.
- Save o cenário e execute-o uma vez.
- Adicione uma linha às
ZUGFeRD Requestscom um vendedor, um comprador, um item de linha, ambas as datas e StatusNew. - Cada um dos cinco módulos deve reportar uma operação.
- Abra a linha: o campo
Documentdeve conter um arquivo PDF com o nome do número da fatura. - 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.
- 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
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ção | Quem o dirige? | De onde vêm os dados? | O que você mantém |
|---|---|---|---|
| Plataforma de faturamento eletrônico versus este cenário | Finanças, através de um portal | Uploads ou uma integração | Um contrato por documento e sua respectiva conexão. |
| Módulo ERP versus este cenário | Finanças dentro do ERP | O próprio livro-razão do ERP | Licenças e uma migração para obter seus dados. |
| Biblioteca de desenvolvedor versus este cenário | Um desenvolvedor, dentro de um aplicativo | Seu banco de dados, por meio de código. | O código, as atualizações de esquema e os lançamentos. |
| Este cenário | Qualquer pessoa que possa adicionar uma linha Airtable | A base que a equipe já mantém | Cinco 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
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.
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.
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.
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.