Auslöser
Formular-Eingang
Webhook
Der Webhook ersetzt das Mail-Skript des Formulars. Das Formular postet direkt auf die n8n-URL, jede Absendung startet eine Ausführung. n8n gibt sofort einen Status 200 zurück und arbeitet den Rest im Hintergrund ab, damit der Absender nicht auf das LLM warten muss.
Beim Test verwendet n8n eine eigene Test-URL, im Betrieb die Production-URL. Ein häufiger Fehler nach dem Livegang: Das Formular zeigt noch auf die Test-URL, die nur läuft, solange der Editor geöffnet ist.
Soll der Nutzer nach dem Absenden auf eine Danke-Seite landen, kommt hinter den Webhook ein "Respond to Webhook"-Node mit einem 303-Redirect. Dann muss der Response-Modus im Webhook auf "Using Respond to Webhook Node" stehen.
- Methode
- POST
- Pfad
- /webhook/website-lead
- Antwort
- sofort, ohne auf den Ablauf zu warten
Aus der PraxisDie Webhook-URL ist öffentlich erreichbar. Rate-Limit pro IP und Honeypot-Feld gehören deshalb in denselben Workflow, nicht in ein vorgelagertes Skript.
Logik
Felder normalisieren
Edit Fields (Set)
Formulare liefern über die Jahre unterschiedliche Feldnamen: message, nachricht, anfrage. Dieser Node bildet alles auf einen festen Satz von Feldern ab. Alle folgenden Nodes greifen nur noch auf diese Namen zu, damit ein neues Formular kein Umbauen im halben Workflow auslöst.
E-Mail-Adressen werden kleingeschrieben und getrimmt. Das verhindert Dubletten im CRM und Treffer, die beim späteren Abgleich gegen bestehende Kunden ins Leere laufen.
Der Zeitstempel wird hier gesetzt und nicht erst beim Versand. Wenn ein späterer Node fehlschlägt und der Workflow erneut läuft, bleibt der Eingangszeitpunkt der echte Eingangszeitpunkt.
- Ausgabefelder
- name, email, nachricht, quelle, honeypot, eingegangen_am
- Modus
- Manual Mapping
Logik
Pflichtfelder und Spam
If
Drei Bedingungen mit UND-Verknüpfung: Die E-Mail passt auf ein einfaches Muster, die Nachricht hat mindestens 20 Zeichen, das Honeypot-Feld ist leer. Bots füllen unsichtbare Felder aus, echte Absender sehen sie nicht.
Diese Prüfung steht bewusst vor dem LLM. Sie kostet nichts und fängt den größten Teil des automatisierten Spams ab, bevor ein Token verbraucht wird. Umgekehrt würde jede Spam-Mail einen Modellaufruf auslösen.
Die 20 Zeichen sind kein Naturgesetz. Wer ein Formular mit Auswahlfeldern hat, prüft besser auf ausgefüllte Pflichtfelder als auf Textlänge.
- Bedingung 1
- email entspricht Regex
- Bedingung 2
- nachricht.length >= 20
- Bedingung 3
- honeypot ist leer
Aus der PraxisEin Rate-Limit pro IP fehlt in dieser Variante bewusst, weil es je nach Setup unterschiedlich gelöst wird: über einen Reverse Proxy, über n8n-eigene Datentabellen oder über Redis.
Endpunkt
Aussortiert
No Operation
Der falsche Zweig endet hier. Der Node tut nichts, aber die Ausführung bleibt im n8n-Log sichtbar. Damit lässt sich nachträglich prüfen, ob die Filter zu streng sind und echte Anfragen aussortiert wurden.
Wer eine Statistik braucht, ersetzt den Node durch einen Append in eine Tabelle oder einen Zähler. Wichtig ist nur, dass der Zweig nicht ins Nichts läuft: Ein offener Ausgang macht in der Ausführungsansicht nicht sichtbar, ob die Bedingung gegriffen hat.
KI
Anfrage einordnen
Basic LLM Chain
Das Modell bekommt Absender, Quelle und Nachrichtentext und liefert fünf Felder zurück: Kategorie, Dringlichkeit, Thema, Zusammenfassung und Sprache. Es schreibt keine Antwort. Diese Trennung ist der Kern des Workflows: Das Modell entscheidet, welcher Textbaustein passt, aber nicht, was drin steht.
Der Systemprompt definiert die Grenzfälle statt sie offen zu lassen. "Projektanfrage" nur bei erkennbarem Vorhaben, "hoch" nur bei genannter Deadline oder akutem Ausfall. Ohne diese Festlegungen driftet die Einordnung über die Wochen, weil jeder Grenzfall neu geraten wird.
Temperature steht auf 0. Bei einer Klassifizierung ist Varianz kein Feature, sondern der Grund, warum dieselbe Anfrage montags anders behandelt wird als freitags.
- Prompt-Typ
- Define below
- Rückgabe
- kategorie, dringlichkeit, thema, zusammenfassung, sprache
- Kosten
- kleines Modell, deutlich unter einem Cent pro Anfrage
Sub-Node
OpenAI Chat Model
Language Model
Sub-Nodes hängen unter dem Node, den sie versorgen, und laufen nicht als eigener Schritt in der Kette. Ausgetauscht wird hier das Modell, ohne dass sich am Ablauf etwas ändert.
Für eine Klassifizierung mit fünf Feldern reicht ein kleines Modell. Wer die Daten nicht in die USA geben will, hängt stattdessen ein Modell mit EU-Hosting oder ein lokal betriebenes Modell über Ollama an dieselbe Stelle.
- Modell
- gpt-4.1-mini (austauschbar)
- Temperature
- 0
Sub-Node
Antwortformat erzwingen
Output Parser
Der Parser gibt dem Modell ein Schema vor und prüft die Antwort dagegen. Die Kategorien sind als Enum hinterlegt, das Modell kann also keine vierte Kategorie erfinden, auf die der Switch danach nicht vorbereitet ist.
Ohne Parser landet früher oder später ein Fliesstext oder ein JSON mit Codeblock-Zäunen im nächsten Node, und der Switch fällt in den Standard-Ausgang. Genau dieser Fall fällt im Alltag nicht auf, weil trotzdem eine Mail rausgeht - nur die falsche.
- Schema
- manuell, mit Enum für kategorie und dringlichkeit
Logik
Nach Anliegen verteilen
Switch
Der Switch liest die Kategorie aus der Modellantwort und schickt die Anfrage in einen der drei Zweige. Der Fallback-Ausgang zeigt auf "Sonstiges", damit auch eine unerwartete Antwort eine Bestätigung auslöst statt still zu enden.
Drei Kategorien sind Absicht. Jede weitere Kategorie braucht einen eigenen Textbaustein, sonst entstehen Zweige, die nie geprüft werden. Erweitern lohnt sich, wenn die Auswertung im Ausführungslog zeigt, dass ein Anliegen regelmäßig unter "Sonstiges" landet.
- Ausgang 1
- Projektanfrage
- Ausgang 2
- Support
- Ausgang 3
- Sonstiges (auch Fallback)
Logik
Sofort eskalieren?
If
Dieser Zweig hängt am selben Ausgang wie der Switch und läuft parallel. Die Bestätigungsmail wartet also nicht darauf, und eine fehlende Slack-Verbindung verhindert nicht den Versand.
Eskaliert wird nur bei Projektanfrage und Dringlichkeit "hoch". Wer jede Anfrage meldet, hat nach zwei Wochen einen Kanal, den niemand mehr liest. Der Wert der Meldung hängt daran, dass sie selten ist.
- Bedingung
- kategorie = projektanfrage UND dringlichkeit = hoch
Aktion
Team benachrichtigen
Slack
Die Meldung enthält Name, E-Mail, Thema und die Zusammenfassung aus der Klassifizierung. Damit ist im Kanal entscheidbar, wer übernimmt, ohne dass jemand erst das Postfach öffnet.
Slack ist austauschbar. Dieselbe Stelle bedienen Telegram, Microsoft Teams, WhatsApp über die Cloud-API oder schlicht eine zweite Mail an eine interne Adresse.
- Ziel
- Kanal #leads
- Inhalt
- Name, E-Mail, Thema, Zusammenfassung
Logik
Text: Projektanfrage
Edit Fields (Set)
Der Textbaustein liegt als fester Text im Workflow, nicht im Modell. Er nennt einen Zeitrahmen für die persönliche Antwort und bietet einen Terminvorschlag per Rückmail an.
Nur der Vorname wird eingesetzt, aus dem Namensfeld über einen Split am Leerzeichen. Das ist der pragmatische Weg; bei Formularen mit getrennten Feldern für Vor- und Nachname entfällt er.
- betreff
- Deine Anfrage zu {{ thema }}
- antwort
- Fester Text mit Vorname und Thema
Logik
Text: Support
Edit Fields (Set)
Bei Support-Fragen fehlen im ersten Kontakt fast immer dieselben Angaben. Der Baustein fragt sie direkt ab: Shop-URL und Screenshot der Fehlermeldung. Das spart eine komplette Runde Rückfrage und Antwort.
- Zweck
- Fehlende Angaben in derselben Mail nachfordern
Logik
Text: Sonstiges
Edit Fields (Set)
Kurz, ohne Versprechen auf eine inhaltliche Antwort. Der Zweig fängt Bewerbungen, Kaltakquise und Nachrichten ab, die sich nicht sicher zuordnen lassen.
Aktion
Eingangsbestätigung senden
Gmail
Alle drei Textzweige laufen auf diesen einen Node. Betreff und Text kommen aus dem jeweils vorherigen Set-Node, die Empfängeradresse aus dem normalisierten Feld. Ein Versand-Node statt drei bedeutet: eine Stelle für Absenderadresse, Signatur und Fehlerbehandlung.
Versendet wird als reiner Text. Das sieht schlichter aus, kommt aber zuverlässiger an als eine HTML-Mail mit Bildern, und eine automatische Eingangsbestätigung braucht kein Layout.
Gmail ist austauschbar gegen den SMTP-Node, wenn der Versand über das eigene Postfach laufen soll. Wichtig in beiden Fällen: SPF- und DKIM-Einträge der Absenderdomain müssen stimmen, sonst landet die Bestätigung im Spam und der Absender hält die Anfrage für verschwunden.
- Empfänger
- normalisierte E-Mail aus dem Formular
- Format
- Text
- Attribution
- abgeschaltet
Aus der PraxisDie Absenderadresse sollte eine sein, auf die geantwortet werden kann. Eine no-reply-Adresse verschenkt genau die Antworten, wegen denen der Workflow gebaut wurde.