Tool note
n8n: When It Is the Wrong Tool
The boundary is not complexity. It is whether correctness depends on canvas geometry, in-memory data, or a cursor saved out of band.
“Should this be n8n, or should this be code?” gets argued as ideology and answered badly. Engineers say a workflow tool is a toy. The person who built the workflow says it has run for a year without touching it. Both are describing something real and neither is describing the boundary.
The boundary is specific, and it is not complexity. It is whether the correctness of the thing depends on something the canvas stores as geometry, as in-memory data, or as a cursor saved out of band. Below that line a workflow tool is equivalent to code and far faster to change. Above it, you are relying on properties the tool never promised.
Why this exists
Nobody rewrites in month one. The cost of getting this wrong is paid in month nine, with the thing in production, a client depending on it, and no clean seam to cut along.
So answer it by symptom, early, while a rewrite is still a morning’s work rather than a project nobody will fund.
How to use it
Match the symptom, then make the move. These are the ones that recur:
- You are moving large files and hitting memory errors. The default binary data mode keeps binary data in memory. It is configurable — filesystem, S3, Azure, database — but if you never configured it, that is your answer. Change the mode deliberately, or move file handling out entirely.
- Duplicate or skipped records would be unacceptable. A polling trigger keeps a cursor in the workflow’s static data, saved separately from the execution it produced. If the instance crashes between those two saves, items get skipped or processed twice. If you are moving payments or clinical messages, do not ask the tool for exactly-once delivery. Put idempotency in the destination, keyed on something the source guarantees.
- Correctness depends on which branch runs first. Branch order comes from position on the canvas, topmost first. Ordering stored as geometry is ordering a colleague can change by tidying up.
- You cannot say what the tests are. Not “the tests are failing” — you cannot name them at all. That is a signal about the thing’s maturity, and it gets more expensive every month you leave it.
- Nested conditionals past two levels. A Switch whose branches all do nearly the same thing is a function with parameters, drawn.
The inverse matters just as much. Stay in n8n when the value is in the connection rather than the computation, when the logic changes monthly and somebody non-technical needs to see it, and when OAuth against three vendors is the actual work. Rewriting that as a service buys you nothing and costs you the visibility that made it useful.
Where it goes wrong
In a small shop the more common and more expensive error is rewriting too early. A workflow you can open and read on a Tuesday afternoon has real value that shows up in no architecture comparison. Moving it into a repository means a deploy path, somewhere to run it, monitoring, and dependency updates — all of which are now yours forever. Count that before you start.
“It isn’t real engineering” is not a symptom. Neither is a hiring plan, nor a conference talk. If you cannot name which of the failures above you are currently experiencing, you are not ready to move it.
The usual right answer is a hybrid, and people skip straight past it: keep n8n as the trigger, the glue and the visible sequence, and call out to one small service for the part that needs real code. You keep the thing a human can read, and you stop asking the canvas for guarantees it never offered. n8n’s own guidance on breaking workflows into smaller parts is the first step in that direction, and often enough on its own.
Last, be honest that the line moves with who maintains it. I work alone, so a workflow I can see is worth more to me than a service I have to keep alive. A team with an on-call rotation should draw this further toward code than I do — and should say why out loud, rather than inheriting somebody else’s boundary from a blog post.
Copy and Clear become available when the worksheet is ready.
IS THIS THE WRONG TOOL? - A SYMPTOM SHEET
n8n. Diagnose by symptom, not by ideology.
THE ONE-LINE TEST
Does the correctness of this workflow depend on:
(a) where nodes sit on the canvas,
(b) data being held in memory, or
(c) a cursor saved separately from the work it describes?
If YES to any, you are relying on something the tool does not
promise. That is the boundary. Complexity is not.
SYMPTOMS THAT MEAN "MOVE IT"
SYMPTOM Memory errors while moving files
WHY The default binary data mode keeps binary data in
memory
MOVE Set the binary data mode deliberately (filesystem, S3,
Azure, database), or move file handling out
SYMPTOM Duplicates or skipped records would be unacceptable
WHY A poll trigger's cursor is stored in static data and
saved separately from the execution. A crash between
the two saves skips or repeats items
MOVE Put idempotency in the DESTINATION, keyed on something
the source guarantees. Do not expect exactly-once
SYMPTOM Behavior changed after somebody tidied the canvas
WHY Branch order comes from canvas position, topmost first
MOVE Remove the ordering dependency, or move the ordered
part into one node or one service
SYMPTOM You cannot name what "the tests" are
WHY There is no seam to test against
MOVE Extract the decision logic to something callable and
test that. Leave the glue in n8n
SYMPTOM Nested conditionals past two levels
WHY That is a function with parameters, drawn
MOVE One node, or one service, that takes the inputs and
returns the decision
SYMPTOM Nobody can answer "what changed last Tuesday?"
WHY No reviewable history of the logic
MOVE Put the logic where changes can be diffed and reviewed
SYMPTOMS THAT MEAN "STAY"
THREE QUESTIONS BEFORE ANY REWRITE
- Which symptom above am I actually experiencing?
- What breaks TODAY because of it, in one sentence?
- Who maintains the replacement in eighteen months?
If (1) is blank, do not rewrite. "It is not real engineering"
is not a symptom.
If (3) is you, alone, weigh the deploy path, the hosting, the
monitoring and the dependency updates. All of it is now
permanent work.
THE HYBRID PEOPLE SKIP
Most of the time the right answer is not either/or:
n8n keeps the trigger
the credentials
the glue between vendors
the visible sequence a human can read
A service the computation
takes the part that needs tests
the part that must not lose a record
Migrate in this order, smallest blast radius first:
- The pure computation with no side effects
- The part that writes to the system of record
- The scheduling, only if you must
Stop after step 1 if the symptom goes away. It usually does.