Saltar al contenido principal

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

· 25 min de lectura
SEO and Content Writer

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.

El panorama general
1. Watch records
Airtable. Recoge filas en ZUGFeRD Requests donde Status es Nuevo.
2. Create a ZUGFeRD invoice
PDF4me. Convierte el JSON de la factura a XML EN 16931 dentro de un PDF/A-3.
3. Upload an attachment
Airtable. Vuelve a colocar el PDF híbrido en el mismo registro.
4. Update a record
Airtable. Escribe el resultado de vuelta para que la fila diga lo que sucedió.
5. Send an email
Gmail. Envía la factura electrónica al comprador en la fila.
La versión corta

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.

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 fila por factura. Cada columna se convierte en una clave en el JSON que genera el escenario.

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

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 Automations con una tabla llamada ZUGFeRD 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 llamado Document.
  • 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.
Lea primero el artículo completo.
Este es el archivo exacto que generó el escenario capturado para la fila RE-2026-0009. Ábralo en un lector para ver la página y en un validador ZUGFeRD para ver el XML incrustado.
Descargar sample-output-zugferd-re-2026-0009.pdf

Panorama general​

  1. Watch records (Airtable) recogen nuevas filas en ZUGFeRD Requests.
  2. Create a ZUGFeRD invoice (PDF4me) convierte el JSON en un PDF híbrido.
  3. Upload an attachment (Airtable)" lo adjunta al campo Document en la misma fila.
  4. Update a record (Airtable) guarda el resultado.
  5. Send an email (Gmail) entrega la factura electrónica al comprador.

Descripción general completa del escenario​

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

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.

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

Configuración 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 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.

  1. Agregar PDF4me > Create a ZUGFeRD invoice.
  2. 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
  3. 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​

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

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​

CampoValor aquíLo que controla
Input FormatJSONQue proporcione un objeto estructurado en lugar de un XML predefinido o una fila CSV.
Output ModeXML With PDFDevuelve un archivo híbrido. XML Only devuelve el XML de la factura por separado.
ZUGFeRD Version2*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 LevelEN16931El perfil que la factura afirma cumplir y, por lo tanto, qué claves debe proporcionar el JSON.
Render Invoice on PDFYesGenera 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.
DocumentvacíoAquí 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.

  1. Agregar Airtable > Upload an attachment.
  2. Configurar:
    • Base y Table: como en el paso 1
    • Record ID: el id del 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​

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

  1. Agregar Airtable > Update a record.
  2. Configurar:
    • Base y Table: como en el paso 1
    • Record ID: el id del disparador
    • Record: complete solo lo que desea que se escriba, que normalmente es Status y 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

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.

  1. Agregar Gmail > Send an email.
  2. Configurar:
    • To: la columna Email del desencadenador
    • Subject: Your e-invoice más el InvoiceNumber
    • Body type: Raw HTML
    • Content: un breve cuerpo HTML que indica el nombre del comprador, la factura y el total.
  3. 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​

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

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

  1. Save el escenario y ejecútalo una vez.
  2. Agregue una fila a ZUGFeRD Requests con un vendedor, un comprador, un artículo de línea, ambas fechas y Status New.
  3. Los cinco módulos deben informar de una operación cada uno.
  4. Abra la fila: el campo Document debe contener un archivo PDF con el mismo nombre que el número de factura.
  5. 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.
  6. 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​

Facturar más de una línea
LineItems ya es una matriz. Mantén las líneas en una segunda tabla vinculada, obténlas con Search records y crea la matriz con un agregador antes del módulo PDF4me.
Ponlo en tu membrete
La ranura Document del módulo 2 acepta un PDF base. Introduzca una página con su marca y Render Invoice on PDF dibujará la factura en ella en lugar de en una página en blanco.
Mantén el XML separado también.
Algunos compradores desean el archivo estructurado por separado. Ejecute el módulo una segunda vez con Output Mode configurado en XML Only y adjunte ese resultado junto con el PDF.
Cambiar formatos según el comprador
Agregue una columna de formato y un enrutador. Los compradores del sector público en Alemania suelen preferir XRechnung en lugar de un archivo híbrido, y esa es una decisión de enrutamiento, no una reconstrucción.

¿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 datosLo que mantienes
Plataforma de facturación electrónica frente a este escenarioFinanzas, a través de un portalCargas o una integraciónUn contrato por documento y una conexión con el mismo.
Módulo ERP frente a este escenarioFinanzas, dentro del ERPEl libro mayor del propio ERPLicencias y una migración para transferir sus datos.
Biblioteca para desarrolladores frente a este escenarioUn desarrollador, dentro de una aplicaciónTu base de datos, a través del códigoEl código, las actualizaciones del esquema y las versiones
Este escenarioCualquiera que pueda agregar una fila AirtableLa base que el equipo ya mantieneCinco 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​

El módulo rechaza el JSON de la factura.

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.

Un validador rechaza el nivel de conformidad

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.

El PDF se abre en blanco.

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.

El comprador dice que no hay XML en el archivo.

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.