Skip to content
DWKD

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

  1. Which symptom above am I actually experiencing?

  1. What breaks TODAY because of it, in one sentence?

  1. 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:

  1. The pure computation with no side effects
  2. The part that writes to the system of record
  3. The scheduling, only if you must

Stop after step 1 if the symptom goes away. It usually does.