n8n Integration
Erstelle EU-konforme E-Rechnungen automatisch mit n8n und thelawin.dev. Ein HTTP Request Node reicht — JSON rein, PDF/A-3 raus.
Voraussetzungen
- n8n (Self-Hosted oder n8n Cloud)
- thelawin.dev API Key (zum Testen:
env_sandbox_demo)
Workflow: Rechnung auf Knopfdruck
1. Manual Trigger
Erstelle einen neuen Workflow und fuege einen Manual Trigger Node hinzu (oder einen Webhook Trigger, Schedule Trigger, etc.).
2. HTTP Request Node
Fuege einen HTTP Request Node hinzu:
| Feld | Wert |
|---|---|
| Method | POST |
| URL | https://api.thelawin.dev/v1/generate |
| Authentication | Header Auth |
| Header Name | X-API-Key |
| Header Value | env_sandbox_demo |
| Body Content Type | JSON |
| Send Body | On |
JSON Body:
{
"format": "zugferd",
"template": "minimal",
"locale": "de",
"invoice": {
"number": "RE-{{ $now.format('yyyy') }}-{{ String($runIndex + 1).padStart(3, '0') }}",
"date": "{{ $now.format('yyyy-MM-dd') }}",
"due_date": "{{ $now.plus(30, 'days').format('yyyy-MM-dd') }}",
"currency": "EUR",
"seller": {
"name": "Deine Firma GmbH",
"street": "Musterstrasse 1",
"city": "Berlin",
"postal_code": "10115",
"country": "DE",
"vat_id": "DE123456789"
},
"buyer": {
"name": "Kunde AG",
"city": "Muenchen",
"country": "DE"
},
"items": [
{
"description": "Beratungsleistung",
"quantity": 8,
"unit": "HUR",
"unit_price": 150.00,
"vat_rate": 19
}
],
"payment": {
"iban": "DE89370400440532013000",
"terms": "Zahlbar innerhalb 30 Tagen"
}
}
}3. PDF speichern
Die Response enthalt pdf_base64 (das PDF als Base64-String) und filename.
Option A: Als Datei speichern (Write Binary File Node)
Fuege einen Code Node hinzu, um Base64 in eine Datei zu konvertieren:
const pdfBase64 = $input.first().json.pdf_base64;
const filename = $input.first().json.filename;
const binaryData = Buffer.from(pdfBase64, 'base64');
return [{
json: { filename },
binary: {
data: {
data: pdfBase64,
mimeType: 'application/pdf',
fileName: filename,
}
}
}];Danach: Write Binary File oder Send Email (mit Anhang) oder Google Drive Upload.
Option B: Per Email versenden
Fuege nach dem Code Node einen Send Email Node hinzu und haenge die Binary-Datei als Attachment an.
Workflow: Google Sheets → Rechnungen
Lese Rechnungsdaten aus einer Google Sheets Tabelle und generiere Rechnungen automatisch:
- Schedule Trigger — Taeglich um 9:00
- Google Sheets — Lese neue Zeilen (Spalten: Kunde, Beschreibung, Menge, Preis)
- HTTP Request — POST an thelawin.dev mit dynamischen Werten aus der Tabelle
- Google Drive — PDF hochladen
- Gmail — PDF an Kunden senden
Dynamische Werte aus Google Sheets
{
"invoice": {
"number": "RE-{{ $json.Rechnungsnummer }}",
"date": "{{ $now.format('yyyy-MM-dd') }}",
"seller": {
"name": "Deine Firma GmbH",
"vat_id": "DE123456789"
},
"buyer": {
"name": "{{ $json.Kundenname }}",
"city": "{{ $json.Stadt }}",
"country": "DE"
},
"items": [
{
"description": "{{ $json.Beschreibung }}",
"quantity": {{ $json.Menge }},
"unit_price": {{ $json.Preis }},
"vat_rate": 19
}
]
}
}Workflow: Webhook → XRechnung (B2G)
Fuer Behoerden-Rechnungen mit Leitweg-ID:
{
"format": "xrechnung",
"invoice": {
"number": "XR-2026-001",
"date": "2026-01-15",
"leitweg_id": "04011000-12345-67",
"buyer_reference": "PO-2026-123",
"seller": {
"name": "Software GmbH",
"vat_id": "DE987654321"
},
"buyer": {
"name": "Bundesbehoerde"
},
"items": [
{
"description": "Software-Lizenz",
"quantity": 1,
"unit_price": 1000
}
]
}
}Workflow-JSON zum Import
Kopiere diesen JSON-Workflow und importiere ihn in n8n ueber Workflow > Import from URL/File:
{
"nodes": [
{
"parameters": {},
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"position": [250, 300]
},
{
"parameters": {
"method": "POST",
"url": "https://api.thelawin.dev/v1/generate",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"bodyParameters": {
"parameters": []
},
"specifyBody": "json",
"jsonBody": "{\n \"format\": \"zugferd\",\n \"template\": \"minimal\",\n \"invoice\": {\n \"number\": \"RE-2026-001\",\n \"date\": \"2026-01-15\",\n \"seller\": {\"name\": \"Test GmbH\", \"country\": \"DE\"},\n \"buyer\": {\"name\": \"Kunde AG\"},\n \"items\": [{\"description\": \"Service\", \"quantity\": 1, \"unit_price\": 100}]\n }\n}",
"options": {}
},
"name": "Generate Invoice",
"type": "n8n-nodes-base.httpRequest",
"position": [450, 300]
}
],
"connections": {
"Manual Trigger": {
"main": [[{"node": "Generate Invoice", "type": "main", "index": 0}]]
}
}
}Haeufige Fehler
| Fehler | Ursache | Loesung |
|---|---|---|
401 Unauthorized | Kein oder falscher API Key | X-API-Key Header pruefen |
422 Validation Error | Pflichtfelder fehlen | errors[].path in Response pruefen |
402 Quota Exceeded | Monats-Kontingent aufgebraucht | Plan upgraden oder naechsten Monat warten |
| Binary-Datei ist leer | Base64 nicht korrekt dekodiert | Code Node mit Buffer.from(base64, 'base64') verwenden |
Naechste Schritte
- Invoice Formats — Alle 9 Formate im Detail
- Templates — PDF-Layouts anpassen
- Validation — Vor-Validierung ohne PDF-Erzeugung
- API Reference — Alle Request/Response-Felder