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

  1. 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.
  2. Insert an intermediary node that serializes the branches so only one edge enters each slot.
  3. Wait for CAT-3982 (same-slot convergence as concatenation) before porting fan-in workflows.
  4. 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

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


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/965364975c59dffa. Report an issue: GitHub.