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