One dictionary, growing
A payload is a set of key-value pairs. The trigger creates it; each node adds its own keys and passes the whole thing on. Merging is last-write-wins, so a node only replaces keys it writes itself. Wire two nodes into one and that node waits for both, then merges both payloads.
Reading a value with {{ }}
Write {{key}} in almost any text field. At run time it becomes that key's value; a missing key becomes an empty string, never an error.
A dot path walks into structured values: {{response.data.name}} reaches a nested key, and a numeric segment indexes a list, so {{results.0.snippet}} is the first result's snippet. An index past the end resolves to empty.

The last segment can be a transform instead: length, count, uppercase, lowercase, trimmed, reversed, isEmpty, first, last, lines, words, keys, values.
Values keep their shape
A key holds text, a number, true/false, an object, a list, a file path, or nothing. JSON from an AI node, an Apple Notes result list and an API Request body arrive as real objects you can navigate into — a model's markdown fence is stripped first. Prose and bare numbers stay text. Drop a whole object into a text field and it renders as compact JSON.
{{payload}} dumps everything. In most fields it expands to the whole payload as pretty-printed JSON — the fastest way to see what a node received.
A few fields differ. Interpolation is written per node, not once centrally: Condition's value and Notification's title and body resolve {{key}} and dot paths, but not {{payload}}.