Create ZUGFeRD Invoice in Make
What this module does
PDF4me — Create a ZUGFeRD invoice generates hybrid e-invoices directly inside your Make scenario. Supply invoice data as CSV, JSON, or XML — the module produces a PDF/A-3 document with a machine-readable ZUGFeRD XML file embedded inside it, or an XML-only output for ERP systems that handle their own rendering. The result aligns with the EN 16931 European e-invoicing standard and is accepted as Factur-X in France and across EU markets. Conformance levels and specification version are configurable to match exactly what your buyer or public-sector recipient requires.
Authenticating Your API Request
Every PDF4me module in Make requires a valid Connection. Create or select one that holds your PDF4me API key so the scenario can call the invoice generation service securely.
Important Facts You Should Not Miss
The hybrid output is a PDF/A-3 document — the ZUGFeRD XML is embedded as a compliant attachment inside the file. ERP systems extract the XML automatically; humans can still open and read the PDF in any standard viewer. Set Render Invoice on PDF to Yes to have invoice line items drawn visually on the page.
Version 1.0 supports BASIC, COMFORT, EXTENDED. Version 2+ expands to MINIMUM, BASICWL, BASIC, EN16931, EXTENDED, XRECHNUNG. XRECHNUNG and EN16931 are required for public-sector invoicing in Germany. Always match the version and level to what the buyer system expects.
Selecting XML shows the Invoice XML Data field; JSON shows Invoice JSON Data; CSV shows Invoice CSV Data. Only populate the field that matches your chosen format. When using XML format, the module also exposes a File radio so you can pull the XML from Dropbox directly or map it from a prior module.

Start with Connection, then map the base PDF (File Name, Document) and set Input Format (here XML).

With File = Map, map Invoice XML Data, set Output Mode (XmlWithPdf or XmlOnly), then choose zugferd Version (e.g. 1.0).
Parameters
Required: Connection, Input Format, Output Mode, zugferd Version. The invoice data field (Invoice XML Data, Invoice JSON Data, or Invoice CSV Data) appears dynamically based on your Input Format selection — only the matching field needs to be populated.

Lower part of the module: Output Mode, zugferd Version, Conformance Level, Render Invoice on PDF, and language (typical XmlWithPdf setup). The table below lists every field in order.
| Parameter | Required | What it does | Example / Options |
|---|---|---|---|
| Connection | Yes | PDF4me API connection used to authenticate invoice generation requests. Click Add and paste your API key if connecting for the first time. | Your PDF4me connection |
| File | Conditional | Source of the base PDF where the ZUGFeRD invoice will be embedded (when Output Mode is XmlWithPdf). Radio button with two options: Dropbox - Download a File (pulls directly from a Dropbox account without a prior download step) or Map (supplies the PDF from a prior module — Dropbox, Google Drive, OneDrive, HTTP, etc.). Choose Map for the most flexible workflow. When Map is selected, the two sub-fields below appear. | Map |
| File → File Name | Conditional | Sub-field of File (visible when Map is selected). Filename of the base PDF including the .pdf extension. Map from the prior module's filename output — for example, the File Name field of a Dropbox or Google Drive Download module. | 1. File Name |
| File → Document | Conditional | Sub-field of File (visible when Map is selected). Binary PDF content where the ZUGFeRD XML will be embedded. Map from the prior module's binary data field — typically the Data field of Dropbox, Google Drive, or OneDrive download modules. Hint shown in module: "PDF file where Zugferd invoice should be added". | 1. Data |
| Input Format | Yes | Format of the invoice data being supplied. Use XML for existing ZUGFeRD XML; JSON or CSV for structured data. Hint: "Format of the invoice data being supplied. Use XML for existing ZUGFeRD XML, JSON or CSV for structured data." | XML sampleJSON sampleCSV sample |
| Invoice XML Data | Conditional | The ZUGFeRD XML invoice content to embed. Appears when Input Format = XML and File = Map. Hint: "Use when inputFormat is XML, please refer to our Create a ZUGFeRD invoice for guidelines." Map from a prior Dropbox download or HTTP module output. | XML sample3. Data (mapped) |
| Invoice JSON Data | Conditional | Structured invoice data in JSON format. Appears when Input Format = JSON. Map a JSON string from a Google Sheets, Airtable, or HTTP module. See sample JSON below. | JSON sample(mapped JSON string) |
| Invoice CSV Data | Conditional | Invoice row data in CSV format. Appears when Input Format = CSV. Map a CSV row from an iterator, Google Sheets, or file download module. See sample CSV below. | CSV sample(mapped CSV row) |
| Output Mode | Yes | XmlWithPdf returns a PDF/A-3 file with ZUGFeRD XML embedded inside, the standard hybrid e-invoice. XmlOnly returns only the XML invoice file without a PDF wrapper. Hint: "XmlWithPdf returns a PDF with embedded ZUGFeRD XML. XmlOnly returns only the XML invoice file." | XmlWithPdf |
| zugferd Version | Yes | ZUGFeRD specification version. Set to match what the recipient ERP or buyer system expects. Hint: "ZUGFeRD specification version." Version 1.0 and 2+ have different conformance level sets (see table below). | 1.0 / 2+ |
| Conformance Level | No | ZUGFeRD conformance profile. Available levels differ by version; see the Conformance Level Reference table below. Hint: "ZUGFeRD conformance level." Defaults to BASIC if not specified. | BASIC |
| Render Invoice on PDF | No | When set to Yes, invoice line items are drawn visually on the PDF pages. Applies only when Output Mode is XmlWithPdf. Options: Yes, No, Empty. Hint: "Render invoice data visually on PDF pages. Applies only when outputMode is XmlWithPdf." | Yes |
| language | No | Two-letter locale code for invoice label localisation. Supported: de, en, fr, it, es, nl, pl, pt, cs. Hint: "Language code for invoice localisation (e.g. de, en, fr, it, es, nl, pl, pt, cs). Defaults to de if not specified." | de |
Conformance Level Reference
The available conformance levels differ by zugferd Version. Always match the level to what your buyer or ERP system requires.
| Level | Use when |
|---|---|
BASIC | Mandatory EN 16931 fields only. Widest compatibility, safe default. |
COMFORT | Adds optional fields for line-item detail and additional references. |
EXTENDED | Full field set for complex B2B invoices with delivery, allowances, and charges. |
| Level | Use when |
|---|---|
MINIMUM | Absolute minimum fields. Buyer reference and totals only. |
BASICWL | BASIC without line items. Header-level data only. |
BASIC | Mandatory EN 16931 fields. Recommended starting point. |
EN16931 | Full EN 16931 compliance for cross-border and public sector. |
EXTENDED | Full field set including German-specific extensions. |
XRECHNUNG | German public-sector e-invoice mandate (XRechnung profile). |
Sample Invoice Files
Use these sample files to test the module with each input format before connecting your live data source. Each file represents the same invoice in a different format so you can compare the structure.
ZUGFeRD-invoice-sample.xmlsample-invoice.jsontest-invoice.csvCSV Column Reference
The CSV input must follow this exact column order. Each row produces one invoice.
| Column | Description | Example |
|---|---|---|
InvoiceId | Unique invoice identifier | INV-2025-001 |
IssueDate | Invoice issue date (YYYY-MM-DD) | 2025-01-15 |
SellerName | Seller company name | Test Company |
SellerStreet | Seller street address | 123 Main St |
SellerCity | Seller city | Test City |
SellerPostalCode | Seller postal / ZIP code | 12345 |
SellerCountry | ISO 3166-1 alpha-2 country code | DE |
SellerVatId | Seller VAT registration number | DE123456789 |
BuyerName | Buyer company or person name | Customer Inc |
BuyerStreet | Buyer street address | 456 Oak Ave |
BuyerCity | Buyer city | Customer City |
BuyerPostalCode | Buyer postal / ZIP code | 67890 |
BuyerCountry | ISO 3166-1 alpha-2 country code | DE |
ProductName | Line item product or service name | Test Product |
Quantity | Quantity of the line item | 10.0 |
UnitPrice | Net unit price | 9.90 |
TaxPercent | VAT / tax percentage | 19.0 |
Currency | ISO 4217 currency code | EUR |
PaymentReference | Payment reference string | PAY-REF-001 |
IBAN | Payee IBAN for bank transfer | DE08700901001234567890 |
BIC | Payee bank BIC / SWIFT code | GENODEF1M04 |
JSON Invoice Structure
When using Input Format: JSON, the payload must include the following top-level keys. All nested objects and arrays follow the structure shown in the sample file.
| Key | Type | Description |
|---|---|---|
InvoiceId | String | Unique invoice number, e.g. "471102" |
IssueDate | String (ISO 8601) | Invoice date, e.g. "2013-03-05T00:00:00" |
InvoiceType | String | Document type label, e.g. "RECHNUNG" |
TypeCode | String | UN/EDIFACT document type code — 380 for standard invoice |
IsTest | Boolean | true for test runs, false / omit for production |
Notes | Array of strings | Free-text notes shown in the invoice header (payment terms, GLN, etc.) |
Seller | Object | Seller party: Name, Address (Street, City, PostalCode, Country), TaxId, VatId, GLN |
Buyer | Object | Buyer party: Name, Address (Street, City, PostalCode, Country, LineTwo), GLN |
Payment | Object | Payment details: PaymentReference, Currency, IBAN, BIC |
DeliveryDate | String (ISO 8601) | Actual delivery date, e.g. "2013-03-05T00:00:00" |
LineItems | Array of objects | Invoice lines — each with Quantity, UnitCode, UnitPrice, LineTotal, ProductName, GTIN, SellerProductId |
Totals | Object | Monetary totals: LineTotal, ChargeTotal, AllowanceTotal, TaxBasisTotal, TaxTotal, GrandTotal, TaxPercent, Currency |
Quick Setup
- Add PDF4me → Create a ZUGFeRD invoice to your scenario.
- Select Connection (or click Add to create one with your API key).
- Choose Input Format — XML, JSON, or CSV. The data field that appears depends on this selection.
- Set File to Map and connect the invoice data field (Invoice XML Data / JSON Data / CSV Data) from the prior module output. Or choose Dropbox - Download a File to pull the file directly from Dropbox.
- Set Output Mode to XmlWithPdf for a hybrid PDF/A-3 invoice, or XmlOnly for XML only.
- Set zugferd Version (1.0 or 2+) then pick Conformance Level from the version-appropriate set — start with BASIC.
- If using XmlWithPdf: set Render Invoice on PDF to Yes to draw line items visually, and set language to your target locale (e.g.
de,en,fr). - Save and click Run once. Route the Document Data output to Dropbox, Google Drive, an ERP webhook, or an email module.
Output Fields
| Field | Type | What it contains |
|---|---|---|
Document Name | String | Filename of the generated invoice file — e.g. invoice-471102.pdf or invoice-471102.xml. |
Document Data | Buffer | Binary content of the ZUGFeRD hybrid PDF/A-3 or XML file. Map into an upload, email attachment, or ERP HTTP module for the next step in your scenario. |
Workflow Examples
Workflow ExamplesCommon Make scenario patterns using Create ZUGFeRD Invoice for automated e-invoicing.
- An order is marked as shipped in your ERP or Airtable — the scenario triggers.
- Line items, pricing, buyer address, and tax data are fetched and assembled into a JSON payload.
- Create ZUGFeRD invoice runs with Input Format JSON, Output Mode XmlWithPdf, version 2+, Conformance Level BASIC, language
de. - The hybrid PDF is emailed to the buyer via Gmail and a copy uploaded to the invoices archive in Google Drive.
- Accounting drops a CSV file of monthly invoices into Dropbox.
- A Watch Files trigger detects the new file and an Iterator processes each row.
- Create ZUGFeRD invoice runs per row with Input Format CSV, generating one hybrid PDF per invoice.
- All PDFs are uploaded to a structured archive folder and a completion summary email is sent to the finance team.
- A government contract invoice is triggered from an Airtable record.
- Create ZUGFeRD invoice runs with Input Format JSON, Output Mode XmlOnly, version 2+, Conformance Level XRECHNUNG.
- The XML file is POST-ed directly to the buyer's Peppol-compatible ERP API via an HTTP module.
- A success or error response is logged to a Google Sheet for the finance team to review.