We build automations both ways: visual pipelines in n8n and custom services in Node.js or Python. Clients often arrive with a strong opinion about one or the other. Here is the honest decision framework we actually use.
Where n8n wins
- Speed to first value. A working pipeline in days, not weeks.
- Legibility. Non engineers can open the canvas and see what happens, which builds trust and makes handover easier.
- Integration breadth. Hundreds of prebuilt connectors: email, CRMs, sheets, messaging, webhooks.
- Cheap iteration. Changing a step is a drag and drop, not a deployment.
Where custom code wins
- Complex logic. Branching that would become spaghetti on a canvas stays clean in code, with tests.
- Performance and scale. High volume, low latency, or heavy data processing.
- Deep product integration. When the automation is part of your platform, not beside it.
- Fine grained control. Retries, queues, observability, and security exactly how you need them.
The hybrid pattern we use most
In practice, most of our client systems are hybrid: n8n handles the orchestration and integrations at the edges, and the genuinely hard steps call a small custom service, an AI agent with tools, a document processor, a scoring model. Each part does what it is best at.
Three questions that settle it
- Who maintains this in a year? If the client's ops team should own it, we lean n8n. If their engineers will, code is fine.
- How complex is the hardest step? One hard step inside a simple flow means hybrid. Hard logic everywhere means code.
- What volume must it survive? Thousands of runs a day is fine for n8n. Millions is not.
The tool is never the point. The point is a workflow that used to eat human hours, now running by itself, in a way its owners can understand and maintain.