From n8nto Claude Code
An n8n alternative for messy-input pipelines: a 53-node workflow and two SSH triggers became one Python + Claude Code orchestrator. Three routes, a human queue for ambiguous mail, every failure mode prevented instead of watched.
One orchestrator instead of 53 nodes
From mail to record
Deterministic signals first, then Claude classifies, then Python rails re-check the route before anything is written.
Attio, exactly once
Every write derives its id from the data itself, so a replay changes nothing.
Three routes and a human queue
Dealflow, decks and reports go their way. Everything else waits for a person.
Six things that broke in n8n, prevented by design
Duplicates on re-mention
A deterministic id from domain, LinkedIn or name: the same company never lands in Attio twice.
Silent drops in extraction
Every chat line is logged as parsed or dropped, with the reason. Nothing disappears quietly.
Overconfident defaults
“Unknown” is a first-class outcome. Below 0.85 confidence nothing is guessed.
Silent auth failures
A failed downstream call becomes a needs-attention state with a reason, not a quiet skip.
No human in the loop
Ambiguous mail waits in a labelled queue. A person decides, the run resumes.
No replay
Every run is replayable from disk. One command reproduces any outcome.
What runs now
Outgrown your n8n workflow?
This rewrite took about five hours, because the workflow file was already the design document. The full post-mortem is on the blog.
Get in touchRead the post-mortem

