In n8n version 1.0 and higher, the expression engine relies on paired-item data resolution. Unlike legacy versions where node executions passed arbitrary flat arrays, modern n8n enforces strict item-to-item mapping:
1. The $json Namespace
The $json variable is shorthand for the current item currently flowing through the executing node:
{{ $json.user.profile.id }}
2. Referencing Predecessor Nodes
To access data produced by upstream nodes without breaking item pairing, use the node selector function:
{{ $('Webhook_Trigger').item.json.body.lead_score }}
By using .item rather than .first(), n8n maintains item lineage across multi-item iterations.