Blog18.07.2026 · 5 Min. Lesezeit

Ausdrücke in n8n: Daten aus vorherigen Schritten nutzen

Ausdrücke in n8n verstehen: mit $json aufs aktuelle Item zugreifen, mit $('Name') auf frühere Schritte – und den Fehler „Can't get data“ vermeiden.

Wer zum ersten Mal einen Workflow in n8n baut, stolpert fast immer an derselben Stelle: Im dritten Schritt soll die E-Mail-Adresse aus dem ersten Schritt landen – aber wie kommt der Wert dorthin? Die Antwort sind Ausdrücke. Sie sind das Bindeglied, das Daten von einem Node zum nächsten trägt, und der Punkt, an dem eine Automatisierung entweder sauber läuft oder mit einer roten Fehlermeldung stehenbleibt. Dieser Artikel erklärt das Referenzierungs-Modell dahinter – für alle, die selbst an Workflows bauen oder verstehen wollen, was unter der Oberfläche passiert.

Was ein Ausdruck in n8n ist

Jedes Eingabefeld in n8n kennt zwei Modi. Im Modus Fixed tragen Sie einen festen Wert ein, etwa eine gleichbleibende Betreffzeile. Schalten Sie per Umschalter auf Expression, wird das Feld dynamisch: n8n wertet den Inhalt bei jeder Ausführung neu aus. Ein Ausdruck ist dabei JavaScript, das Sie in doppelte geschweifte Klammern setzen – {{ ... }}. Alles zwischen den Klammern wird berechnet, alles außerhalb bleibt Text. So mischen Sie Festes und Dynamisches in einem einzigen Feld:

Hallo {{ $json.vorname }}, Ihre Bestellung {{ $json.bestellnr }} ist unterwegs.

Die offizielle Ausdrucks-Referenz listet alle Variablen und Methoden auf, die innerhalb der Klammern zur Verfügung stehen. Die zwei wichtigsten – und die, an denen die meiste Verwirrung hängt – sind $json und $('Node-Name').

$json: das aktuelle Datenpaket

Daten fließen in n8n als Items durch den Workflow – kleine JSON-Pakete, die von Node zu Node weitergereicht werden. $json greift auf das Item zu, das der aktuelle Node gerade bearbeitet; laut Dokumentation ist es die Kurzform für $input.item.json. An ein einzelnes Feld kommen Sie per Punktnotation:

{{ $json.email }}
{{ $json.kunde.plz }}

Der erste Ausdruck liest das Feld email, der zweite steigt in ein verschachteltes Objekt hinab. Hat ein Feldname ein Leerzeichen oder Sonderzeichen, funktioniert die Punktnotation nicht – dann greifen Sie mit eckigen Klammern zu: {{ $json['E-Mail Adresse'] }}. Das ist einer der häufigsten Gründe, warum ein scheinbar korrekter Ausdruck undefined zurückgibt.

Auf frühere Schritte zugreifen: $('Node-Name')

$json reicht nur bis zum unmittelbar vorherigen Node. Sobald der Wert, den Sie brauchen, mehrere Schritte zurückliegt und die Nodes dazwischen ihn nicht mitgeschleppt haben, brauchen Sie den gezielten Zugriff auf einen benannten Node. Die Syntax dafür ist $('Node-Name') – der Name in Anführungszeichen ist exakt die Beschriftung, die der Node im Canvas trägt.

Dahinter hängen Sie eine Methode, die bestimmt, welches Item Sie meinen:

  • $('Trigger').item – das verknüpfte Item: genau der Datensatz aus dem benannten Node, aus dem das aktuelle Item entstanden ist.
  • $('Trigger').first() – das erste Item, das der Node ausgegeben hat.
  • $('Trigger').last() – das letzte Item.
  • $('Trigger').all() – alle Items als Liste, etwa um sie zu zählen oder zu durchsuchen.

Der Unterschied zwischen .item und .first() sieht winzig aus, entscheidet aber darüber, ob Ihr Workflow stabil läuft – und ist das Thema des nächsten Abschnitts.

Der häufigste Fehler: „Can't get data for expression“

.item verlässt sich auf das sogenannte Item Linking. Jedes Item, das ein Node ausgibt, merkt sich, aus welchem Eingangs-Item es entstanden ist – über eine Verknüpfung namens pairedItem. Die meisten Nodes setzen diese Verknüpfung automatisch, sodass n8n die Kette rückwärts verfolgen kann. Genau diese Kette läuft $('Node').item entlang, wenn es das „passende“ Item aus einem früheren Schritt sucht.

Die Kette reißt, wenn ein Node die Zahl der Items verändert oder komplett neue Items erzeugt – klassisch im Code-Node, aber auch nach manchem Merge oder wenn Daten aus mehreren Zweigen zusammenlaufen. Kann n8n das aktuelle Item keinem Eingangs-Item mehr zuordnen, erscheint die rote Meldung „Can't get data for expression“ mit dem Hinweis, dass mehr Informationen aus einem bestimmten Node nötig seien.

In n8n merkt sich jedes Datenpaket, aus welchem vorherigen Datensatz es entstanden ist. .item folgt dieser Spur und liefert den passenden Datensatz aus einem früheren Schritt. Reißt die Spur – weil ein Node die Zahl der Datensätze verändert –, hilft .first(): Es greift ohne Verknüpfung auf das erste Item zu und umgeht so den Fehler „Can't get data for expression“.

Der Ausweg ist meist simpel. Brauchen Sie ohnehin nur einen einzelnen, immer gleichen Wert – etwa die Absenderadresse aus einem Trigger, der pro Ausführung nur ein Item liefert –, nehmen Sie statt .item einfach .first(). Das verlangt keine Verknüpfung und liefert zuverlässig das erste Item. Wo Sie die Zuordnung wirklich Datensatz für Datensatz brauchen, sorgen Sie im Code-Node dafür, dass pairedItem mitgesetzt wird; die Doku beschreibt das im Abschnitt zum Item Linking.

Eingebaute Variablen, die Arbeit sparen

Neben dem reinen Datenzugriff bringt n8n eine Reihe von Variablen und Hilfsfunktionen mit, die man schätzen lernt, sobald man sie einmal gebraucht hat:

  • $now und $today – der aktuelle Zeitpunkt beziehungsweise der heutige Tag als Datum. Die Zeit- und Zeitzonen-Fallen dahinter habe ich im Beitrag Datum und Zeitzonen in n8n ausführlich behandelt.
  • $if(bedingung, dann, sonst) – ein Kurz-Wenn direkt im Feld, etwa {{ $if($json.betrag > 1000, 'Freigabe', 'ok') }}.
  • $ifEmpty(wert, ersatz) – liefert einen Ersatzwert, wenn das Feld leer ist. Praktisch gegen Lücken in Quelldaten.
  • $vars – zentral hinterlegte Workflow-Variablen, damit eine Basis-URL oder ein Schwellwert nicht in zwanzig Feldern klebt.
  • $jmespath(objekt, ausdruck) – zieht Werte aus tief verschachtelten Strukturen, ohne dass Sie sich durch fünf Ebenen Punktnotation hangeln.

Dazu kommen Umwandlungs-Methoden, die n8n direkt an Werte anhängt: .toNumber(), .toDateTime(), .split() oder .toUpperCase() erledigen kleine Formatierungen mitten im Ausdruck – ganz ohne Code-Node.

Ausdruck oder Code-Node?

Ein Ausdruck wertet immer einen Wert für ein Feld aus. Das hält den Datenfluss übersichtlich, setzt ihm aber Grenzen: echte Schleifen, mehrere Zwischenschritte oder verzweigte Logik gehören nicht in ein Ausdrucksfeld. Meine Faustregel aus Gesprächen mit Betrieben: Sobald Sie in den geschweiften Klammern anfangen zu programmieren – Ternär-Operatoren stapeln, eigentlich Hilfsvariablen bräuchten –, ist der Code-Node die wartbarere Wahl. Und wenn es nur ums Umbenennen und Mappen von Feldern geht, nimmt Ihnen der Edit-Fields-Node die meiste Ausdrucks-Arbeit sogar per Klick ab.

Der ehrliche Nutzen

Ausdrücke sind kein Nebenthema, sondern das Fundament, auf dem jeder n8n-Workflow steht. Wer $json vom $('Node-Name')-Zugriff unterscheiden kann und weiß, warum .first() den paired-item-Fehler umgeht, baut Automatisierungen, die auch beim fünfhundertsten Datensatz nicht stillstehen – statt bei jeder Schnittstelle neu auf Fehlersuche zu gehen.

Wenn Sie gerade eine n8n-Umgebung sauber aufsetzen oder einen hakeligen Workflow zum Laufen bringen wollen, schauen wir uns Ihren konkreten Fall in einem kostenlosen Prozess-Check gemeinsam an. Den passenden Rahmen für die Umsetzung finden Sie in der n8n-Beratung.

Kostenloses Erstgespräch

Diesen Prozess bei Ihnen umsetzen? Prozess-Check

Sie beschreiben 1–2 Prozesse, ich sage Ihnen ehrlich, was Automatisierung bringt – und was nicht.

Kostenlosen Prozess-Check anfragen

DSGVO-konform · 100 % vertraulich · Keine Kosten