Factura electrónica ZUGFeRD desde una base de Airtable: Crea el JSON y envía el PDF híbrido por correo electrónico en Make con PDF4me

PDF4me Create a ZUGFeRD invoice es un módulo Make que transforma datos de facturas estructuradas en una factura electrónica híbrida PDF/A-3. Conectado a una base de datos Airtable, lee una fila, la convierte a XML EN 16931, devuelve un archivo legible y procesable por máquina, y lo guarda en el registro.
Si buscas software de facturación electrónica, encontrarás una comparativa de proveedores: plataformas, paquetes y precios por documento. Si buscas si Airtable puede generar facturas, te encontrarás con un extenso hilo de discusión que explica que no puede. Entre estos dos resultados se encuentra un equipo que ya utiliza Airtable, al que le acaban de comunicar que sus facturas deben ser legibles por máquina y que no desea migrar sus operaciones a una plataforma de facturación para cumplir con un requisito de formato. Este escenario es para ellos.
Una fila llega a una tabla Airtable con un vendedor, un comprador, un artículo y los totales. Make la procesa, crea un objeto JSON compacto a partir de las columnas y PDF4me lo convierte en un PDF/A-3 con XML EN 16931 incrustado. El archivo se adjunta al registro y se envía al comprador por correo electrónico. Cinco módulos, y nadie escribe XML.
Preguntas y respuestas basadas en el porqué
Why run this from Airtable rather than an invoicing product?Dado que los datos de facturación suelen ser un subproducto de un trabajo que ya se registra en algún lugar, si el proyecto, el cliente y la tarifa acordada se encuentran en una base de datos, esta es la fuente de información más fidedigna disponible. Trasladar esta información a un producto para que cumpla con un formato de archivo implica mantener al mismo cliente en dos lugares indefinidamente.
Why describe the invoice as JSON instead of writing the XML?La sintaxis de la factura intersectorial es extensa, compleja y poco tolerante con la ubicación de cada línea de código. El objeto JSON expresa la misma información en mucho menos espacio, con claves que se leen como términos comerciales, y PDF4me genera el XML correspondiente a partir de él. La parte más propensa a errores es la que no requiere mantenimiento.
Why does the hybrid file matter?Porque la factura tiene dos destinatarios. El sistema contable del comprador lee el XML incrustado y registra el documento sin que nadie lo introduzca manualmente; la persona de cuentas por pagar abre el mismo archivo y ve una página. Un solo documento satisface a ambos, por eso.FeRD El foro alemán responsable del formato lo diseñó de esa manera en lugar de especificar únicamente XML.
Why attach the result back to the record?Porque una factura electrónica que luego no encuentras es un problema que simplemente has pospuesto. Incluir el PDF en el campo Document de la fila vincula el documento con los datos que lo generaron, que es precisamente lo que necesitas cuando un comprador impugna una cifra dieciocho meses después.
Lo que obtendrás
Entrada: una fila Airtable con el número de factura, las fechas, un bloque para el vendedor, un bloque para el comprador, una línea de artículo y los totales, con Status establecido en Nuevo. Salida: un PDF/A-3 ZUGFeRD adjunto a ese registro y un correo electrónico al comprador con el mismo archivo.

Una fila por factura. Cada columna se convierte en una clave en el JSON que genera el escenario.

El comprador ve una factura normal. Su software ve el XML que contiene.
Lo que necesitas
- A Make account.Open Make Cinco módulos sobre aplicaciones estándar.
- PDF4me API key.Get your API key Una conexión PDF4me cubre esta situación.
- An Airtable base. La base capturada es
PDF4me Live Automationscon una tabla llamadaZUGFeRD Requests, que contiene el encabezado de la factura, el bloque del vendedor que incluye un ID de IVA, el bloque del comprador, los campos de los artículos, los totales, una columna de correo electrónico, un campo Status y un campo de archivo adjunto llamadoDocument. - A Gmail accountpara entrega, conectado a Make.
- Your seller details including a VAT ID. Provienen de columnas, por lo que una base puede facturar a más de una entidad legal.
Panorama general
- Watch records (Airtable) recogen nuevas filas en
ZUGFeRD Requests. - Create a ZUGFeRD invoice (PDF4me) convierte el JSON en un PDF híbrido.
- Upload an attachment (Airtable)" lo adjunta al campo
Documenten la misma fila. - Update a record (Airtable) guarda el resultado.
- Send an email (Gmail) entrega la factura electrónica al comprador.
Descripción general completa del escenario

La misma estructura de cinco módulos que el escenario de códigos QR suizos. Solo difiere el módulo PDF4me del medio.
Paso 1: ¿Cómo se activa un escenario a partir de una fila Airtable?
Flujo hasta ahora: nada todavía, este es el detonante.
Una fila marcada como "lista" indica la solicitud para emitir una factura.
- Agrega Airtable > Watch records como activador.
- Configurar:
- Base:
PDF4me Live Automations - Mesa:
ZUGFeRD Requests - Trigger field:
Created - Label field:
Title - Límite:
10 - Fórmula:
{Status}='New'
- Base:
Configuración Watch records

Status es el interruptor. No se emite nada hasta que una persona establece una fila como Nueva.
Paso 2: ¿Cómo se convierte una fila en una factura ZUGFeRD?
Flujo hasta ahora: el activador de Airtable.
Este es el módulo que genera la factura electrónica. La configuración determina el formato; el JSON determina el contenido.
- Agregar PDF4me > Create a ZUGFeRD invoice.
- Configurar la salida:
- File Name:
ZUGFeRD_más el InvoiceNumber más.pdf - Input Format:
JSON - Output Mode:
XML With PDF - ZUGFeRD Version:
2* - Conformance Level:
EN16931 - Render Invoice on PDF:
Yes
- File Name:
- Pegue el objeto factura en Invoice JSON Data y asigne las columnas en:
{
"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"
}
}
Tres partes de ese objeto merecen atención. TypeCode 380 es el código de una factura comercial y es fijo, no derivado de nada en la base. UnitCode C62 es el código UN/ECE para "una unidad", que es lo que se necesita para horas o unidades de servicio. Y el bloque Payment al final contiene PaymentReference, el texto que el comprador cita al pagar, que en este caso es simplemente el número de factura.
Create a ZUGFeRD invoice

El campo se desplaza en el editor, por lo que solo una parte del objeto es visible a la vez. El bloque de arriba muestra el objeto completo.
Lo que decide cada configuración
| Campo | Valor aquí | Lo que controla |
|---|---|---|
| Input Format | JSON | Que proporcione un objeto estructurado en lugar de un XML predefinido o una fila CSV. |
| Output Mode | XML With PDF | Devuelve un archivo híbrido. XML Only devuelve el XML de la factura por separado. |
| ZUGFeRD Version | 2* | La generación 2.x, que es la que se ajusta a la EN 16931 La versión anterior 1.0 no lo es. |
| Conformance Level | EN16931 | El perfil que la factura afirma cumplir y, por lo tanto, qué claves debe proporcionar el JSON. |
| Render Invoice on PDF | Yes | Genera una página de factura legible a partir de los mismos datos. Al no proporcionarse un PDF base, esto es lo que le da al archivo su parte humana. |
| Document | vacío | Aquí iría un PDF base con su membrete. Si lo deja vacío, PDF4me generará una página en blanco. |
Tip.Las claves de dinero y cantidad deben llegar como números sin formato, no como cadenas entre comillas, por eso pasan por...parseNumber mientras que los campos de texto están entre comillas. Una cita"1005" será rechazado donde un simple1005 Se acepta, y el error que reciba se referirá al esquema en lugar de a las comillas. Observe el segundo argumento:parseNumber(1.NetTotal; ".") dice Make el separador decimal sea un punto. Omitirlo y una configuración regional que escriba1005,00 Se analizará con un número incorrecto en lugar de fallar, que es el peor resultado.
Paso 3: ¿Cómo se vuelve a incluir la factura electrónica en el registro?
Flujo hasta el momento: el activador más el módulo PDF4me.
- Agregar Airtable > Upload an attachment.
- Configurar:
- Base y Table: como en el paso 1
- Record ID: el
iddel disparador - Attachment field:
Document - File: la salida de PDF4me - Create a ZUGFeRD invoice
- File name:
ZUGFeRD_más el InvoiceNumber más.pdf - Data: el Document de salida del módulo 2
- Content type:
PDF file
Upload an attachment

Content type es PDF file. El escenario hermano del código QR suizo utiliza una imagen PNG en la misma ranura.
Paso 4: ¿Cómo se registra el resultado en la fila?
Flujo hasta ahora: todo hasta la carga del archivo adjunto.
- Agregar Airtable > Update a record.
- Configurar:
- Base y Table: como en el paso 1
- Record ID: el
iddel disparador - Record: complete solo lo que desea que se escriba, que normalmente es Status y un OutputLink
Update a record

Aquí aparecen todas las columnas de la tabla. La captura las muestra vacías y el panel desplazado, así que configure Status deliberadamente.
Tip.Un campo que está mapeado pero vacío borra la celda. En una tabla de facturas, esto significa un ID de IVA en blanco o una fecha de vencimiento perdida en una ejecución que, de otro modo, habría sido exitosa; por lo tanto, no modifique nada que no esté escribiendo deliberadamente.
Paso 5: ¿Cómo se envía la factura electrónica al comprador?
Flujo hasta ahora: todo hasta la actualización del registro.
No se ha emitido una factura electrónica que se encuentra en la base de datos.
- Agregar Gmail > Send an email.
- Configurar:
- To: la columna Email del desencadenador
- Subject:
Your e-invoicemás el InvoiceNumber - Body type:
Raw HTML - Content: un breve cuerpo HTML que indica el nombre del comprador, la factura y el total.
- Adjunte el archivo:
- File: PDF4me - Create a ZUGFeRD invoice
- File name:
ZUGFeRD_más el InvoiceNumber más.pdf - Data: el Document de salida del módulo 2
Send an email

El archivo adjunto proviene del módulo 2, por lo que Airtable nunca realiza una lectura para obtener el archivo.
Ejecuta el escenario y verifica.
- Save el escenario y ejecútalo una vez.
- Agregue una fila a
ZUGFeRD Requestscon un vendedor, un comprador, un artículo de línea, ambas fechas y StatusNew. - Los cinco módulos deben informar de una operación cada uno.
- Abra la fila: el campo
Documentdebe contener un archivo PDF con el mismo nombre que el número de factura. - Abra el archivo adjunto. Debería ver una página de factura legible, y un validador ZUGFeRD debería encontrar el XML EN 16931 dentro del mismo archivo.
- Revisa la bandeja de entrada del comprador para ver el mensaje y su archivo adjunto.
En la ejecución capturada, la fila RE-2026-0009 generó una factura de Muster GmbH en Berlin con NIF DE123456789 a Test Kunde AG en Muenchen, diez unidades de Consulting a 100,50, y el correo electrónico informó un total de 1195,95 EUR.
Do not trust the grid for decimals.La tabla Airtable muestra VATAmount 191 y GrossTotal 1196, mientras que la factura y el correo electrónico indican 190.95 y 1195.95, respectivamente. No se recalcula nada: TaxTotal y GrandTotal se leen directamente de esas dos columnas. La tabla simplemente los muestra con la precisión configurada en el campo numérico. Amplíe esa precisión antes de intentar conciliar una columna con una factura, ya que las cifras solo parecen inconsistentes.
Variaciones comunes que puedes agregar sin reconstruir
¿Cómo se compara esto con otras formas de generar una factura electrónica?
Cada fila describe la alternativa. La última fila corresponde a este escenario.
| Comparación | ¿Quién lo dirige? | De dónde provienen los datos | Lo que mantienes |
|---|---|---|---|
| Plataforma de facturación electrónica frente a este escenario | Finanzas, a través de un portal | Cargas o una integración | Un contrato por documento y una conexión con el mismo. |
| Módulo ERP frente a este escenario | Finanzas, dentro del ERP | El libro mayor del propio ERP | Licencias y una migración para transferir sus datos. |
| Biblioteca para desarrolladores frente a este escenario | Un desarrollador, dentro de una aplicación | Tu base de datos, a través del código | El código, las actualizaciones del esquema y las versiones |
| Este escenario | Cualquiera que pueda agregar una fila Airtable | La base que el equipo ya mantiene | Cinco módulos y un objeto JSON |
Preguntas frecuentes
¿Qué es la automatización de cuentas por pagar?
En el lado del receptor, esto significa que llega una factura, sus campos se leen automáticamente, se verifican las cifras y el resultado se contabiliza o se envía para su aprobación. Una factura electrónica híbrida es lo que garantiza la fiabilidad de la lectura, ya que los datos están integrados en lugar de recuperarse de una imagen de la página.
Este escenario representa la parte del envío de ese acuerdo. Generar un archivo que el sistema del comprador pueda analizar es lo que permite que sus cuentas por pagar se ejecuten sin supervisión.
¿Puede Airtable crear facturas?
No cumplen con la normativa. Airtable puede almacenar datos de facturas y presentarlos en una interfaz o en una vista imprimible, pero no puede generar un PDF/A-3 que contenga XML conforme a la norma EN 16931, que es lo que exige la normativa de facturación electrónica.
La división que se utiliza en este escenario es la práctica: Airtable es el registro, PDF4me produce el artefacto y este se devuelve al registro como un archivo adjunto.
¿Cómo funciona la automatización de las cuentas por pagar?
Funciona en tres fases: recepción, extracción y contabilización. La recepción consiste en reunir los documentos en un mismo lugar; la extracción los convierte en campos; la contabilización registra esos campos en el libro mayor, generalmente con un control de confianza o aprobación previo.
Las facturas electrónicas híbridas evitan la parte intermedia. Cuando el XML ya está dentro del archivo, la extracción es un análisis sintáctico en lugar de un reconocimiento, razón por la cual las normativas siguen impulsando esa dirección.
¿Qué es la automatización Airtable?
Airtable incluye su propio generador de automatizaciones para activadores y acciones dentro de una base, lo que cubre gran parte del trabajo interno. No puede llamar a una API de documentos y devolver un archivo para un campo de adjunto, que es el paso que requiere este escenario.
Make se sitúa justo al lado por esa misma razón. El disparador sigue monitorizando una tabla Airtable, pero la parte central del escenario puede acceder a servicios a los que las automatizaciones de Airtable no pueden llegar.
Solución de problemas
Abra el paquete de entrada del módulo en el historial de ejecución y léalo como JSON. Una columna vacía Airtable deja una clave vacía, y un valor monetario que conserva sus comillas llega como texto donde se espera un número. Ambos producen un objeto que parece correcto, pero aun así falla la conversión.
Conformance Level determina qué campos requiere el perfil. Si se declara la conformidad con la EN16931 pero el JSON omite claves que el perfil espera, la validación fallará, aunque el archivo se abra correctamente. Proporcione las claves que faltan o utilice un perfil de menor nivel.
Render Invoice on PDF está desactivada y no se proporcionó ningún PDF base, por lo que el XML se insertó sin ningún elemento gráfico. El archivo sigue siendo una factura electrónica válida, pero su parte digital está vacía.
Verifique que Output Mode sea XML With PDF y, a continuación, compruebe que los módulos 3 y 5 obtengan sus datos del módulo 2. Si adjunta cualquier otro archivo, se enviará una página que se verá bien, pero que no contiene nada que su software pueda leer.
Próximos pasos
Un mandato suele presentarse como un problema de formato de archivo. En realidad, se trata de una cuestión sobre dónde se encuentran almacenados los datos de la factura y si algún programa puede leerlos.