Build1 publisher3 min readPublished
An enrichment filter that errors hands the paid step every candidate it was rejecting
Ussama Assad, who builds and repairs n8n lead pipelines, says almost nobody has specified what a filter or a budget check does when it throws. The answer you get for free is that the run keeps going and the paid step keeps spending.
The Engineer · Build desk

What happened
- Ussama Assad, an n8n automation consultant, says almost every lead generation workflow contains guards and almost nobody has specified what a guard does when the guard itself breaks.
- Two answers exist, fail open and fail closed, and fail open is almost always the accidental default because it is what writing no error handling at all gives you.
- A filter that normally rejects nine candidates in ten does not quietly reject zero when it breaks; it passes all ten through to the paid step behind it.
- A guard wrapped in its own fail-safe can throw on every run, be caught, be swallowed and report clean, saving nothing for days while the dashboard stays green.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- cost The failure mode of a spend guard is spend at full rate, and the enrichment plan owner pays the difference between one candidate and ten.
- decision Each guard needs its error path chosen at build time, because declining to choose it selects fail open by omission.
- exposure The finite monthly allowance behind email finding and verification is the resource that drains, and it surfaces as thin pipeline output that someone has to go looking for.
- constraint A green run is not evidence a guard ran, so monitoring has to assert on the guard's own output instead of node status.
Take the nine-in-ten filter literally. Working, it passes one candidate in ten to the paid lookup behind it. Erroring, with nothing written to catch it, it passes all ten, so the paid step runs at ten times the volume it was sized for [6][7]. That multiple is a property of one consultant's workflow. For it to transfer, your filter's real reject rate has to sit near nine in ten, and the step behind it has to have no per-run cap of its own. Assad's post does not include counts of workflows diagnosed or spend figures [18].
Fail open is not a setting anyone selected. Assad, who builds these systems and says he spends more time diagnosing broken ones than building new ones, describes the two deliberate answers as fail open, where the workflow carries on without the check, and fail closed, where it refuses to proceed past it [1][4]. He tells readers to put one question to whoever built theirs: "What happens to the run when that check throws an error?" [3]
The fail-open version survives in production because the money leaves quietly. Email finding, enrichment and verification each draw on a finite monthly allowance, and if nothing counts consumption as the run proceeds, you learn the allowance is gone when the pipeline output drops and somebody asks why [8]. Green does not distinguish "found nothing" from "could not look" [9].
Assad documents his own. He built a spend cap that recorded spend only when a run wrote a result, so a run killed halfway through wrote nothing, cost real money, and never reached the cap [10]. A guard of his skipped its check whenever a required field was simply absent from the record, because the field was missing, so the condition was never true and the check passed [11]. "Absence was read as permission," he wrote [12]. He also projected a run's cost from one narrow sample, launched on that projection, and killed the run three calls in when the real rate came back several times higher, in the same week he had written the rule against extrapolating from unrepresentative samples [17].
Ordering is the cheap half of the repair. Workflows get assembled in the order data becomes available, so the judgment about whether a company was worth contacting at all lands last, after the enrichment and the verification that cost money; every rejection at that step is correct and every one is too late [14]. Assad puts a small model on the original trigger signal instead, which can usually decide "not a fit" for a fraction of a penny before a single paid lookup fires [15]. That holds until the small model times out. If its fallback is enrich everything anyway, the result is worse than having no filter, since a missing filter is a gap you can see and budget around [16].
In my view fail closed is the right default for any guard whose job is to suppress spend, and a cap should write a reservation when a run starts, not a total when it finishes. Both choices cost something. Fail closed turns a flaky enrichment API into a stopped pipeline, and somebody has to be on call for a stopped pipeline [4].
What to watch
- Whether n8n adds a per-node setting that stops a run when a guard node throws, instead of requiring a hand-wired error branch on every check.
- Enrichment and verification vendors returning remaining-quota data a workflow can read mid-run, so a cap can count consumption before the write.
- A measured population: reject rates and per-run spend from more than one consultant's practice.