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.

PythonClaude CodeAttio
Dealflow inbox — IMAP
Inbox1
Processed
A founder2h ago
Investor update Q3
Update_Q3.pdf attached
.zip
Data roomYesterday
Deck shared via Papermark
A link, the password in the body
.zip
Polling the inbox…
+
+
+

One orchestrator instead of 53 nodes

53
n8n nodes replaced
1
Orchestrator, cron-driven
3 + 1
Routes, plus a human queue
0
Silent failures in the daily digest

From mail to record

Deterministic signals first, then Claude classifies, then Python rails re-check the route before anything is written.

Inbox mail
"acme-robotics.com" in a WhatsApp intro
PythonSignals
→
ClaudeClassify
→
PythonRails
Attio
Attio record
CompanyAcme Robotics
VerticalRobotics
CountryDE
53 → 1n8n nodes → one orchestrator
3 + 1Routes, plus a human queue
< 0.85Confidence: a person decides
+
+

Attio, exactly once

Every write derives its id from the data itself, so a replay changes nothing.

Attio — Portfolio & Deals
CompanyDomainVerticalCountryIntroduced by
Nordhaus Groupnordhaus.ioClimate techATA partner
Baumann Werkebaumann-werke.chManufacturingCHA founder
Waiting for a routed mail…

Three routes and a human queue

Dealflow, decks and reports go their way. Everything else waits for a person.

DealflowA WhatsApp export or a 1:1 intro
1Extract every line→
2Upsert company and person→
3Link the introducer
DeckA Papermark link
1Open the pages→
2Build the PDF→
3Upload to SharePoint
ReportAn investor update
1Match the portfolio company→
2Summarize→
3File in SharePoint
UnknownConfidence below 0.85
1Stay in the inbox→
2Label: needs attention→
3A person decides
+
+

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

Claude CodeClaude Code
PythonPython
AttioAttio
GmailGmail
SharePointSharePoint
DiscordDiscord

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