n8n
n8n-nodes-formfeed ist ein Community-Node, den n8n verifiziert hat: zwei Nodes (Formfeed und
Formfeed Trigger) und ein Credential. Auf Formfeed-Seite braucht es nur einen API-Schlüssel.
Der Node ist englischsprachig; die englischen Namen von Operationen und Feldern stehen hier so, wie n8n sie anzeigt.
Installation
Aus dem Nodes-Panel (n8n Cloud und selbst gehostetes n8n): Öffnen Sie das Nodes-Panel, suchen
Sie nach Formfeed (er trägt das Verifiziert-Abzeichen von n8n), öffnen Sie ihn und klicken Sie
auf Install node. Der Owner oder ein Admin der Instanz installiert ihn einmal, für alle Mitglieder.
Findet die Suche ihn nicht, sind verifizierte Community-Nodes abgeschaltet: in n8n Cloud in den
Instanz-Einstellungen der Cloud-Konsole, in einem selbst gehosteten n8n durch
N8N_VERIFIED_PACKAGES_ENABLED=false.
Über den Paketnamen (selbst gehostetes n8n): Einstellungen → Community-Nodes → Installieren,
Paketname n8n-nodes-formfeed. Alternativ führen Sie npm install n8n-nodes-formfeed im
n8n-Benutzerordner (~/.n8n/nodes) aus und starten n8n neu.
Ohne den Formfeed-Node ruft der Node HTTP Request die API auf (siehe Rendern), und der AI-Agent-Node von n8n kann den gehosteten MCP-Endpunkt nutzen.
Credential
Erstellen Sie in der App unter API-Schlüssel einen API-Schlüssel und
tragen Sie ihn im Credential Formfeed API ein. Nutzen Sie beim Bauen einen ff_test_-Schlüssel:
Diese Renderings sind kostenlos (im Free-Plan mit Wasserzeichen). Der Test des Credentials liest
GET /account.
| Feld | Bedeutung |
|---|---|
| API Key | ff_live_… oder ff_test_… |
| Region | Europe (Frankfurt), die Vorgabe, oder United States. Lassen Sie Europe stehen: Jeder Workspace liegt heute in der EU |
| Custom Base URL | Leer lassen. Eine Adresse, die Ihnen der Formfeed-Support nennt, etwa ein Staging-Gateway, mit /v1; sie geht der Region vor |
Die Vorgabe-Scopes eines neuen Schlüssels (render:create, render:read, template:read,
account:read) decken den Test des Credentials und jede Operation für Renderings, Vorlagen und Jobs
ab. Die übrigen brauchen einen weiteren Scope, den ein neuer Schlüssel
nur hat, wenn Sie ihn ankreuzen:
| Operation | Scope |
|---|---|
| Render → Delete Outputs | file:delete |
| File → Upload | file:write |
| File → Get Many | file:read (in file:write enthalten) |
| File → Delete | file:delete |
| Formfeed Trigger | webhook:manage |
Node „Formfeed“
| Ressource | Operationen |
|---|---|
| Render | Erstellen (Create, aus Vorlage, rohem HTML oder URL), E-Rechnung erstellen (Create E-Invoice), Abrufen (Get), Mehrere abrufen (Get Many), Ausgaben löschen (Delete Outputs) |
| Template | Mehrere abrufen (Get Many), Abrufen (Get), Schema abrufen (Get Schema) |
| Job | Abrufen (Get: Batch-Fortschritt und Zip) |
| File | Upload (aus einem Binärfeld in die Dateibibliothek), Get Many (optional ein Ordner), Delete |
| Convert Office Document (eine Word-, Excel-, PowerPoint-, OpenDocument- oder RTF-Datei aus einem Binärfeld oder das Rendering einer Word- oder PowerPoint-Vorlage als PDF; ab dem Starter-Tarif) |
Die Operationen Get Many liefern bis zu Limit Ergebnisse (höchstens 100) oder mit Return All alle.
Render → Create
Source wählt, was gerendert wird: Template, HTML (mit Engine: Jinja2, die Vorgabe, Liquid oder Handlebars) oder URL (eine öffentliche Seite).
Bei einer Vorlage ordnet Fields die Daten zu: Fügen Sie ein Feld hinzu, wählen Sie seinen Namen
aus der Liste und setzen Sie den Wert. Die Liste kommt aus dem Datenschema
der Vorlage oder, wenn sie keines hat, aus ihren Beispieldaten; verschachtelte Objekte erscheinen als
Namen mit Punkt (invoice.number, customer.name), * markiert ein Pflichtfeld, der Typ folgt in
Klammern. Eine Liste oder ein freies Objekt erscheint als ein Feld, dessen Wert aus einer Expression
kommt, oder gehört in Data (JSON). Data (JSON) wird Wert für Wert über die zugeordneten Felder
gelegt: Ein Objekt ergänzt die zugeordneten Felder an derselben Stelle, ein Wert ersetzt den
zugeordneten, und eine Liste ersetzt die ganze Liste. Die Vorlagenliste zeigt die Vorlagen des
Workspace mit Name und Art (bis zu 100); rendern lassen sich nur veröffentlichte.
Output ist voreingestellt As the Template: PDF bei einer PDF-Vorlage, ihr Bildformat bei einer Bildvorlage, die Vorgabe einer Word- oder PowerPoint-Vorlage und PDF bei HTML und URLs. Word-Vorlagen rendern DOCX oder PDF, PowerPoint-Vorlagen PPTX oder PDF.
Mit Download File (voreingestellt an) hängt der Node das Dokument als Binärdaten an, bereit für
Gmail, Google Drive, S3 oder einen HTTP-Request. Sein Name folgt der Ausgabe, aus dem Dateinamen
offer wird also offer.docx oder offer.pdf; ohne Dateinamen heißt es <Rendering-ID>.<Ausgabe>.
Die Options:
| Option | Bedeutung |
|---|---|
| Filename | Name des Dokuments |
| Locale | Ersetzt die Locale der Vorlage, etwa de-DE |
| Mode | Wait for the Document (die Vorgabe) oder Queue and Return Immediately, siehe unten |
| Settings (JSON) | Papier, Ränder, Kopf- und Fußzeile, wie unter Einstellungen pro Anfrage überschreiben |
| Version | Der Release Channel, der gerendert wird (Vorgabe published), oder eine Versionsnummer als Expression |
| Webhook URL | Eine Adresse, die das Ereignis render.completed oder render.failed genau dieses Renderings erhält, siehe Webhook-URLs pro Rendering |
Mode: Wait for the Document fragt das Dokument synchron an. Ein Rendering, das länger als eine
Minute dauert, läuft im Hintergrund weiter, und der Node liefert es dann mit status: queued und ohne
Datei. Für lange Dokumente setzen Sie Queue and Return Immediately: Der Node liefert das eingereihte
Rendering sofort, und entweder der Trigger-Node oder ein späteres Get meldet das Ergebnis.
E-Rechnungen
Render → Create E-Invoice erzeugt eine ZUGFeRD- / Factur-X-E-Rechnung:
ein PDF/A-3, das die Rechnung als XML trägt und vom Validator geprüft ist, bevor der Node es erhält.
Statt der Felder einer Vorlage fragt der Node die Rechnung selbst ab: Nummer, Rechnungsdatum und
Währung, Verkäufer und Käufer, die Positionen, die Aufschlüsselung der Umsatzsteuer, die fünf Summen
und die Zahlung. Er sendet sie als _invoice-Block, und die Vorlage druckt denselben Block, sodass
jeder Wert nur einmal zugeordnet wird. Das Beispiel „E-Rechnung“ der Galerie in der App ist eine
solche Vorlage.
Berechnet wird nichts: Summen und Aufschlüsselung sind die, die Ihr System angibt, und eine Rechnung, deren Summen nicht auf den Cent aufgehen, wird mit jedem Feld und der Regel abgelehnt, die es verletzt. Was die Felder nicht anbieten (die Rechnung, auf die sich eine Gutschrift bezieht, Nachlässe und Zuschläge, die Lieferung, ein Lastschriftmandat, die französischen Pflichtangaben), gehört mit den Namen der Feldreferenz in Invoice (JSON) und wird über die Felder gelegt. Die Optionen wählen das Profil (EN 16931 oder Basic), den Namen der Spezifikation (Factur-X oder ZUGFeRD; die Datei ist dieselbe), ob das XML zusätzlich als eigene Datei gespeichert wird und ob ein Wert, den das PDF nicht zeigt, das Rendering scheitern lässt, statt gemeldet zu werden.
Die Ausgabe des Nodes trägt den Bericht des Validators als einvoice. Live-E-Rechnungen setzen den
Starter-Plan oder höher voraus; Test-Schlüssel erzeugen eine begrenzte Zahl am Tag, jede mit der
Testmarkierung (im Free-Plan bis zu 20, siehe Tarife und Einheiten).
Wenn die API eine Anfrage ablehnt
Ab Version 0.3.20 hält eine abgelehnte Anfrage den Node mit dem Satz der API an, der das Feld und die
verletzte Regel nennt (_invoice.lines[0].tax.rate is 0: … (BR-S-05)); vorher zeigte der Node den
Satz von n8n zum Statuscode („Your request is invalid or could not be processed by the service“).
Mit On Error → Continue (using error output) in den Einstellungen des Nodes verlässt das Item
stattdessen den Fehlerausgang, mit den Feldern, mit denen es kam, und zwei weiteren: error, diesem
Satz, und details, dem ganzen Problem, mit dem die API geantwortet hat. Sein
code benennt das Problem, und bei einer abgelehnten E-Rechnung
listet errors jeden Befund mit path und rule, sodass ein Workflow sie dorthin zurückschreiben
kann, woher die Daten kamen.
Als Tool für einen KI-Agenten
Ab Version 0.3.11 lässt sich der Formfeed-Node mit dem Eingang Tools des AI-Agent-Nodes von n8n
verbinden. Der Agent wählt dann die Operation und füllt ihre Felder aus: Er listet die Vorlagen,
liest das Schema einer Vorlage und rendert sie. Ein aktuelles n8n bietet den Node ohne weitere
Einstellung als Tool an (gesehen in n8n 2.42); ältere selbst gehostete Versionen taten das nur, wenn
die Instanz N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true setzte. Geben Sie dem Node beim Ausprobieren ein Credential mit einem ff_test_-Schlüssel. Agenten außerhalb
von n8n nutzen den MCP-Server.
Node „Formfeed Trigger“
Registriert beim Aktivieren des Workflows einen Webhook-Endpunkt in Ihrem Workspace und entfernt ihn
beim Deaktivieren wieder; solange es ihn gibt, steht er in der App unter Webhooks als n8n.
Events (Pflicht, voreingestellt render.completed): render.completed, render.failed,
job.completed, job.failed, quota.warning, quota.exceeded. Er löst für Renderings von Live- wie
von Test-Schlüsseln aus. Der Ereignis-Body entspricht dem unter Webhooks.
Der Node prüft die Signatur der Zustellung nicht: Die Adresse, die n8n für den Webhook erzeugt, ist selbst geheim, und ein Rendering aus einem Ereignis lässt sich mit Render → Get zurücklesen, wenn ein Workflow sich darauf verlassen muss.
Beispiel
- Schedule Trigger jeden Morgen.
- Postgres-Node: die Rechnungen von gestern.
- Formfeed: Render → Create, Vorlage
invoice-de,invoice.numberundcustomer.nameaus der Zeile zuordnen, Positionen ins JSON-Feld, Download File an. - Gmail: die Binärdatei als Anhang versenden.
Für hunderte Dokumente rufen Sie POST /renders/batch mit dem HTTP-Request-Node auf und lassen den
Formfeed Trigger auf job.completed warten, statt ein Rendering pro Zeile zu erzeugen. Siehe
Async und Batch.