How is it possible for one node not to execute?

Describe the problem/error/question
I have a node that fans out into two parallel branches. Each branch starts with a Data Table “Get” node, and both Get nodes get the exact same input item from the shared parent node.
One of these parallel Get nodes runs fine. The other one just does not execute at all. The funny thing is that the only difference between the two nodes is the table they point to. Everything else is identical, same input, same operation, same settings.
I have already checked the obvious things:

  • The table the failing node points to is verified to exist.
  • The data inside that table is verified, it is there.
  • I added a condition (filter) to the node, did not help.
  • I tried relocating the node on the canvas, did not help.
  • I suspected the node simply did not have enough time to run (some kind of timing/race), so I checked that carefully. That is not it.
  • I recreated the node from scratch, did not help.
  • I reconnected it to the table, did not help.
  • I changed the table selection from “Choose from list” to “By ID”, and also to “By name”, did not help.

The one thing that somehow did make it run was moving the node much further down the chain, roughly 10 nodes later. I then tried moving it only 5 nodes down, and 1 node back, and it stopped working again. So the position in the chain seems to matter, which I do not understand for a node that just reads a table.

This becomes a real failure when a downstream node references the node by name with $('Get node B').all(). Since that node never executed, the reference returns nothing, while the sibling Get node on the same input works perfectly.
Why would one parallel Get node refuse to execute while its sibling with the same input runs fine, and why does only moving it far down the chain fix it?

What is the error message (if any)?
No error on the Get node itself, it simply does not run. The downstream node then fails because the referenced node was never executed.

Share the output returned by the last node

(Get node A: returns its rows as expected. Get node B, same input: no execution, no output.)

Information on your n8n setup

  • n8n version: 2.25.7
  • Database (default: SQLite): default n8n
  • Running n8n via (Docker, npm, n8n cloud, desktop app): n8n cloud
  • Operating system: n8n cloud

@pohgen it’s not the node, it’s n8n’s branch execution order. Since v1.0, n8n runs parallel branches one at a time, top-to-bottom by canvas position, finishing one fully before the next.

Validate Input fans out to three Gets. n8n runs the top, then the middle (Get Routing Rows) and all of its downstream including the node doing $(‘Get Email Aliases’).all(), and only then the bottom branch. So that reference fires before Get Email Aliases has run, returns empty, and the node looks like it never executed. Moving it ~10 nodes down puts it in the main branch ahead of the reference, so it runs first, that’s the position effect.

Fix: don’t reference across parallel branches. Put Get Email Aliases inline upstream of where you use it, or add a Merge node so all branches finish before anything downstream runs, which n8n’s docs recommend for this.

Hi @pohgen

To fix this properly and keep your workflow clean, you must explicitly tell n8n that the data from the parallel branches is required by joining them back together.

  1. Add a Merge node after your parallel branches.
  2. Connect the output of your “working” branch (e.g., Get All Candidate Templates) to the first input of the Merge node.
  3. Connect the output of your “failing” branch (e.g., Get Routing Rows) to the second input of the Merge node.
  4. Set the Merge node mode to “Wait for all inputs to arrive” (or “Combine” if you are merging data).
  5. Place your downstream node after this Merge node.

By doing this, you create a physical connection that “protects” the branch from being pruned, ensuring the engine recognizes it as a necessary part of the execution.

Does that help?