n8n 1.123.73 - VM Expression Engine Default


n8n tagged [email protected] on 19 August 2026. The patch makes the VM expression engine the default on the 1.x line. The same tag also acquires an expression isolate when a node issues a dynamic parameter request, which is how option lists and remote metadata get filled from credentials and upstream items.

The full release notes and downloads are on the GitHub release page.

The published compare range is only two commits. That is a narrow tag. The default engine switch is still a behavior change on a maintenance line, so treat it as more than a quiet bugfix.

Commit 75bedd8 (issue 36498) makes the VM expression engine the default on 1.x. n8n workflows interpolate values with expressions such as {{ $json.email }} inside node parameters, credentials fields, and routing logic. Those strings are the mapping layer between HTTP payloads, database rows, queue messages, and whatever the next node expects.

A default switch means new 1.x processes evaluate those strings on the VM path unless an operator has already pinned a different engine. The notes do not name a config key, a CLI flag, or a rollback switch. They also do not list expression syntax that used to parse and now fails. The change is still the one that can alter production output. Two evaluators can disagree on empty values, missing properties, and which helpers exist in scope. The result is a different field, a skipped branch, or an empty request body, not a crashed process.

This is a patch tag, not a major. Operators who treat 1.123.x as a quiet train should not assume expression results stay bit identical after this bump. Isolation is the gain. Silent mapping drift is the cost.

Commit 4ee48e6 (issue 36494) acquires an expression isolate for dynamic node parameter requests.

Dynamic parameters are the loaders that fill resource lists at edit time and at run time: tables in a warehouse, sheets in a drive, queues on a broker, indexes in a search cluster. The node sends a request, often with expressions in the payload, and the core returns options. If those expressions now run on the VM engine, that path has to hold an isolate the same way a normal node execute does.

The notes do not describe a crash, a timeout, or an error string. The commit title is the evidence. That request type did not acquire an isolate before. After the default flip, the gap matters. A parameter request that evaluates {{ $credentials.host }} or {{ $json.dataset }} without an isolate is on a different evaluation path from ordinary node execute.

For pipeline operators this is the editor as much as the worker. A workflow that looks idle still evaluates expressions when someone opens a node and the UI asks for a fresh list of collections. If that call is wrong, the run can still succeed while the node is pointed at a stale or empty resource id. Check saved executions and the parameter reload path.

The notes do not publish migration steps, a deprecation window, or an opt out flag. Read that as no documented escape hatch, not as no behavior change. There is no data store migration in this tag. Workflow JSON on disk or in the database does not need a rewrite. The evaluator that reads those strings is what changed.

Roll the tag to one worker or one editor instance first. Exercise the dynamic parameter loaders on the nodes you actually run. Then rerun scheduled workflows that map fields with expressions. Before this tag leaves a canary, sample workflows that:

  • Interpolate nested JSON from HTTP nodes into SQL, file, or warehouse nodes
  • Build URLs, headers, or auth tokens from credentials plus $json
  • Use dynamic resource pickers whose options come from a live API
  • Branch on expression results rather than on static values

Compare item output, not just run status. A successful execution with a null field is the failure mode an engine switch produces. If you promote by image digest alone, keep a known workflow fixture and diff its JSON output against a 1.123.72 run.

If a mapping regresses, the compare range is small. 75bedd8 is the first suspect. Look at 4ee48e6 if the failure is limited to option lists and resource ids.