Most n8n workflows break at exactly one node: If. Not because the logic is hard, but because the node evaluates something different from what you think it evaluates.

Here are the three ways an If node silently does nothing — and the fix for each.

1. Comparing a string to a number

You check {{ $json.order_total }} is bigger than 100. The webhook gave you "120" — a string, with quotes.

n8n will either coerce it or skip the comparison, depending on the node version. The branch goes wrong and nothing appears in the error log.

Fix: never rely on implicit conversion. In If v2 turn on Convert types where required and be explicit about the type you expect, or cast yourself:

{{ Number($json.order_total) }} 

If a field can arrive as "120", 120, or "1,20", normalise it in a Set node before the If. One Set node beats five If nodes full of casts.

2. The expression that never renders

{{ $json.email }} inside the Right Value field, when you meant to type a literal.

The If node evaluates the string {{ $json.email }} — which is truthy every single time — so the true branch fires for every item. It looks like the condition is ignored because it is.

Fix: literal goes in as a literal, no braces. Use the expression editor (the ⚙ → Add Expression) only when you actually want a value from the data. If you see green braces in a field you meant as a constant, that's the bug.

3. AND where you needed OR

Two conditions in one If node are combined with AND by default. A filter like "status = paid" AND "status = refunded" matches nothing, forever.

Fix: for OR logic, either switch the combinator or split it: one If node per condition, then a Merge node. Two Ifs plus a Merge is more readable than a six-condition If nobody dares touch again — and you can attach an error branch to each one.

The rule that ties them together

An If node is a function: two values in, one boolean out. If you can't say out loud what the left side's type is and what the right side literally is, the node is a coin flip.

Test it the cheap way: put a Set node before it that outputs the resolved value, run the workflow once, look at the actual JSON. Ten seconds, and it kills all three bugs above.

I turned this exact trigger → condition → action logic into a browser game with 38 puzzles — you build the flow, the game tells you why it's wrong. 4 levels are free, no signup: nodequest.io