Choose for the life of the system
A prototype can be built almost anywhere. The more important question is who will understand, change, deploy and support it a year later. Consider workflow shape, execution volume, latency, state, testing, team skills, deployment constraints and how frequently business rules change.
The workflow engine is an implementation detail, but representation affects operations. A visible graph is useful when handoffs and integrations are the product. A codebase is useful when domain rules, algorithms or concurrency dominate.
Where n8n fits well
n8n is strong when a process connects several SaaS APIs, runs at moderate volume, benefits from a visible execution history and changes as operations evolve. Webhooks, schedules, branching, mapping and approvals remain legible to technical operators.
Code nodes and sub-workflows can handle small transformations without forcing every integration into a separate service. Self-hosting can fit environments that need more deployment control.
-
Integration-heavy orchestration
-
Human-readable process shape
-
Frequent mapping or routing changes
-
Moderate throughput and latency tolerance
-
Operations teams need run visibility
Where custom code wins
Use a service or worker for intensive computation, complex state machines, unusual protocols, strict latency, high throughput or logic that becomes awkward to test visually. Mature domain logic benefits from types, modules, unit tests, code review and conventional observability.
A thousand-line code node is not a hybrid architecture. It is a hidden service without service boundaries. Extract it when the logic has its own lifecycle or needs independent scaling.
Temporal and durable orchestration
Long-running processes with days of waiting, compensation, many concurrent instances and strict durable-execution needs may warrant Temporal or an equivalent engine. That comes with engineering and operational cost. Use it because failure semantics demand it, not because the project should look sophisticated.
n8n can still initiate or observe a durable service, while the service owns the state machine and exposes safe business-level commands.
The hybrid pattern I use most
Keep triggers, API coordination, human steps and operational routing visible in n8n. Put validation-heavy domain operations behind typed HTTP endpoints or queue workers. Give every call a correlation ID and idempotency key. Return explicit states, not ambiguous prose.
This preserves process visibility while keeping complex logic testable. It also prevents a workflow export from becoming the only source of truth for critical business rules.
A practical scorecard
Score integration density, domain complexity, throughput, latency, long-running state, change ownership, test depth and deployment constraints. A few high code-favouring factors can outweigh many convenient connectors.
Then prototype one representative execution—including a failure—not just the happy path. The architecture should make both success and recovery understandable.
Avoid tool-shaped consulting
If the recommendation is always n8n, the service is selling n8n. If it is always custom code, it is selling engineering hours. The buyer needs a reliable operational system.
My default is the simplest maintainable combination that gives the owner visibility, the engineers testability and the business an acceptable cost per execution.
The practical next step
Map one real execution and one failure.
That will reveal more about the right architecture than a tool comparison or model demo.
Let's build something real