Build1 publisher3 min readPublished
Five bots posted hundreds of closed positions while the broker rejected every sell, and the only record that knew the difference was the account balance, which nothing in the pipeline was wired to read.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
In n8n, a leading `=` marks a field as an expression, and interpolating a variable inside it still needs `{{ }}` around the reference. The swing bot's close-position step sent an order body of `"=$json.ticker"` with no braces, so the broker received the seven literal characters `$json.ticker` as the instrument and rejected the order, every time, for months [4].
That is an ordinary templating mistake with an ordinary blast radius, right up to the two flags on the node. `onError: continueRegularOutput` and `alwaysOutputData: true` mean the node hands an item to the next step even when the call failed, and the workflow continues down its success path [5]. The Discord step downstream tested nothing about a fill. An item arrived, so it posted "Position Closed", and it did that hundreds of times [6]. The author's own verdict on this is worth keeping: an error handler that swallows the error and continues is a machine for manufacturing false confidence [15].
Three other failures in the same system share one shape, which is a value computed and never consumed. The safety node calculated `circuitBreakerTriggered` and `pauseReason` on every run, no downstream node referenced either, and all four rules were unreachable code [8]. A second bot's breaker read its state file off an NFS mount with `cat ... 2>/dev/null`, so a dead mount returned empty and the breaker failed open [11]. The "autonomous trader" was handing qwen2.5:7b roughly 2.4 KB of copy-pasted JavaScript in place of a prompt, which is why the model never saw the research, the portfolio, or the cash balance [9]. Its only limits were `amount > 0` and `amount <= cash`, applied per trade rather than in aggregate, so five proposals could each spend all the cash [10].
Then the arithmetic on the one bot that was actually trading. It carried no target allocations and no drift thresholds; it took the LLM's suggested amounts, kept only their ratios, pro-rated those across all free cash, and sold a whole position to raise that cash first [12]. The cron was meant to be weekly and ran every weekday at 07:30 [13]. Five weekday runs against one intended run is five times the liquidation frequency [16].
None of this was visible from inside the pipeline, because the pipeline's only evidence of a sale was the output of the node that attempted it. The evidence that mattered sat on the broker: April and May positions still open in July, with the comforting "+£324 unrealised gain" attached to two stocks the bot was structurally unable to sell [7]. Realised P&L on the demo account was -£424 [2]. The live account held £4.83 and had seen no bot-initiated trade in months [3].
Reading back is a second integration, not a config change. After each order you query fills or positions, diff them against the intent that produced the order, and let the notifier speak only from the broker's answer. That buys an extra API call per trade, a stored representation of intent, and somewhere for mismatches to land. What it removes is the ability to generate a green tick by merely continuing to execute.
The figures here are one person's account and transfer nowhere [1]. The mechanism transfers under one condition: your success notification is built from the output of the call rather than from the system of record. Had the Discord message been rendered from a positions query, this stays a rejected order in a log. As supplied, the writeup breaks off while describing the rebalancing bot and contains no implemented verification layer, so what it documents is the diagnosis [18].
Ranked by verification strength, evidence, and original report placement.
The author built an automated trading system of five bots wired together in n8n, with a couple of local LLMs making decisions, Trading 212 for execution, and Discord for notifications.
Realised P&L on the demo account was -£424.
The live account balance was £4.83, with no bot-initiated trade on it in months.
The swing-trading bot's close-position step POSTed an order body of "=$json.ticker"; the leading = marks an n8n expression but without {{ }} the field was not interpolated, so the literal seven characters $json.ticker were sent to the broker's API and every sell the bot attempted was rejected, for months.
The node was configured with onError: continueRegularOutput and alwaysOutputData: true, so when the broker rejected the order the workflow carried on to the next step as if it had succeeded.
The step after the rejected order posted "Position Closed" to Discord, producing a channel full of hundreds of successful sales that never happened.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Checkable mechanism, unaudited money
Two different standards of proof are mixed here. The mechanical claims stand on their own — n8n really does send a bare leading = as literal text, and a node set to continue on error really does hand a failed HTTP call to the next step, so any reader can reproduce the core bug. The financial side is one person reading their own statements and logs: −£424 realised, £4.83 live, five forced-sale losses down to −£114.82, none of it shown or corroborated. The account also stops mid-sentence while listing the shared failure characteristics, leaving the diagnosis finished but no remedy written down.
One rig, one operator
What is on the record is a single personal deployment: five workflows on one person's server, a local 7B model, and a brokerage account that had effectively stopped being traded. There is no second installation, no user count, no team using the pattern. The one incident-shaped fact — a live API key and webhook token sitting in the workflow JSON — is also self-reported and self-discovered.
Diagnosis reaches past its sample
The headline and the receipts line up — the bots did post closes for orders the broker refused, and the author's own money is the evidence rather than the pitch. The stretch is at the end, where the shared signature is generalised to any pipeline that reports its own results. That is a plausible reading of five workflows on one server, offered without a second case, and it is the one sentence in the story doing more work than its sample supports.
Nothing on sale
No vendor, no launch, no consultancy attached. The author's exposure runs the other way: he publishes his own losses and admits leaving a live broker key in a JSON file. The residual pull is the ordinary reward a developer platform gives a tidy failure narrative, which favours the single-signature framing over the duller possibility that some of these bots were simply abandoned and never revisited.
Coherent, single-voiced
The technical detail is specific enough to be wrong in checkable ways, and it is internally consistent: the rejected sells explain the stuck April positions, which explain the phantom +£324. Verification is what is missing. One voice, no broker records, no response from either platform involved, and a text that ends partway through its own conclusion. The configuration lesson is solid enough to act on, though the loss ledger still needs independent verification before anyone treats it as established.
build
85% of failures alerted nobody: what an opt-in safety net costs at 225 workflows1 publisher
build
n8n execution traces can prove less about branch coverage than the tooling assumes1 publisher
build
A service name missing from one shell variable kept the scheduler two weeks behind1 publisher
build
DOMPurify's svg profile strips the foreignObject carrying Mermaid labels in four of five diagram types1 publisher
Publishers with included, body-backed reporting in this cluster.
1 article · September 6, 2026