n8n-io/n8n · error · UnimplementedError
Node ${edge.to} has more than one edge into input slot ${edg
Error message
Node ${edge.to} has more than one edge into input slot ${edge.inputIndex}; converging branches on one slot is not supported yet What it means
Thrown by validateExecutableGraph() as an UnimplementedError when two or more edges feed the same input slot of one node (same `${to}#${inputIndex}` seen twice). The engine does not yet define convergence semantics for a single input slot (planned under CAT-3982 as concatenation), so it rejects the shape rather than silently picking one input. Over HTTP this becomes 501 {error:'unimplemented', reason:...}. The graph is valid in principle but uses an unsupported topology.
Source
Thrown at packages/@n8n/engine/src/graph/validate-executable-graph.ts:70
}
// TODO(CAT-2874): multi-slot outputs arrive with branching; until then only
// output slot 0 fires, and the runtime can assume single-slot outputs.
for (const edge of graph.edges) {
if (edge.outputIndex !== 0) {
throw new UnimplementedError(
`Edge ${edge.from} → ${edge.to} leaves output slot ${edge.outputIndex}; only output slot 0 is supported yet`,
);
}
}
// TODO(CAT-3982): same-slot convergence gets a defined meaning (concatenation);
// until then it is rejected rather than given accidental semantics.
const seenInputSlots = new Set<string>();
for (const edge of graph.edges) {
const slot = `${edge.to}#${edge.inputIndex}`;
if (seenInputSlots.has(slot)) {
throw new UnimplementedError(
`Node ${edge.to} has more than one edge into input slot ${edge.inputIndex}; converging branches on one slot is not supported yet`,
);
}
seenInputSlots.add(slot);
}
}
View on GitHub (pinned to 5ac6606e81)
Solutions
- Give the converging edges different inputIndex values on the target node (e.g. route branch A into inputIndex 0 and branch B into inputIndex 1) so no slot is hit twice.
- Insert an intermediary node that serializes the branches so only one edge enters each slot.
- Wait for CAT-3982 (same-slot convergence as concatenation) before porting fan-in workflows.
- Pre-validate client-side: build a Set of `${to}#${inputIndex}` and reject duplicates before submitting.
Example fix
// before — two edges into the same input slot 0 of 'merge'
edges: [
{ from: 'branchA', to: 'merge', inputIndex: 0 },
{ from: 'branchB', to: 'merge', inputIndex: 0 }
]
// after — split across distinct input slots
edges: [
{ from: 'branchA', to: 'merge', inputIndex: 0 },
{ from: 'branchB', to: 'merge', inputIndex: 1 }
] Defensive patterns
Strategy: validation
Validate before calling
function assertNoInputSlotConvergence(graph) {
const seen = new Set();
for (const e of graph.edges) {
const slot = `${e.to}#${e.inputIndex ?? 0}`;
if (seen.has(slot)) throw new Error(`Convergence on ${slot}`);
seen.add(slot);
}
} Type guard
function hasNoInputConvergence(graph) {
const seen = new Set();
for (const e of graph.edges) {
const slot = `${e.to}#${e.inputIndex ?? 0}`;
if (seen.has(slot)) return false;
seen.add(slot);
}
return true;
} Try / catch
const res = await fetch('/workflow-executions', { method: 'POST', body: JSON.stringify(payload) });
if (res.status === 501) {
const body = await res.json();
if (body.error === 'unimplemented' && body.reason.includes('converging branches')) {
// reassign one edge to a different inputIndex and resubmit
}
} Prevention
- Give each incoming edge of a target node a distinct inputIndex.
- Build a Set of `${to}#${inputIndex}` locally before submitting.
- Insert an intermediary node to serialize converging branches until CAT-3982 lands.
When it happens
Trigger: POST /workflow-executions with a graph where two distinct source nodes both connect into the same target node's inputIndex 0 (e.g. edges {from:'A',to:'M',inputIndex:0} and {from:'B',to:'M',inputIndex:0}). Common when translating a v1 Merge node or a fan-in pattern where branches reconverge.
Common situations: Porting a v1 workflow that uses a Merge node (multiple inputs converge). Building a fan-in/fan-out pattern in the new engine before CAT-3982 lands. Two trigger-adjacent paths that rejoin at a single node input.
Related errors
- Edge ${edge.from} → ${edge.to} leaves output slot ${edge.out
- unimplemented
- unimplemented
- Edge ${edge.from} → ${edge.to} has slot index ${index}; slot
- invalid_graph
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/965364975c59dffa.
Report an issue: GitHub.