Duplicate alerts and missed webhooks: what a router should do
Short answer
A router should refuse to fill the same alert twice, cap a script that fires in a loop, say why an alert stopped, and never re-send a new trade that did not land. Shifu does all four: an exact repeat counts as one; a per-minute cap stops a runaway script; every refusal is on the Alerts page with its reason; an entry that does not land is skipped, never retried at a worse price. Only an exit keeps trying for a few seconds, since a late close beats an open trade. An alert missing from that page never left TradingView.
Updated: September 18, 2026
| What happened | What Shifu does | What you do |
|---|---|---|
| The same alert arrives twice (a retrigger, a double delivery) | An exact repeat of the same alert is treated as one; the second gets the first’s result instead of a second fill | Keep the "time": "{{timenow}}" line in the message so each real alert is unique |
| A tick-triggered alert fires many times inside one bar | The bot’s per-minute cap refuses the burst and records it | Set the alert to “Once Per Bar Close”; raise the cap only if the burst was intended |
| A hand-off to the broker does not land in time | An entry is skipped and recorded with the reason — never sent again seconds later at a worse price. An exit keeps trying for a few seconds, then is recorded if it still did not land | For a missed exit, check the position at your broker; the next alert routes normally |
| The alert is not on the Alerts page at all | Nothing — it never reached Shifu | Check the webhook URL and the alert’s status in TradingView’s alert log; fire a test from the Setup tab |
| The message is not JSON, or a field is wrong | Refused with the reason and the message quoted back | Paste the ready-made message from the Setup tab; fix the named field |
| The message is over 8 KB | Refused for size before it is read | Trim it to the fields Shifu reads |
Every line is written on the alert itself. None of it is an opinion about your trade.
Make every alert unique
The time line is what tells a retrigger from a new signal. Use "time": "{{timenow}}" on every alert, and add "order_id": "{{strategy.order.id}}" on a strategy alert. A fixed value there makes every alert after the first look like a duplicate.
Fire once per bar close
An alert left on “Once Per Bar” or a tick trigger can send the same signal many times inside one bar. “Once Per Bar Close” makes one closed bar one order; the cap is the safety net, not the plan.
Let the bracket carry the exit
If a later exit alert is ever missed, a resting take-profit and stop at the broker still close the trade. Put them on the entry and the exit no longer depends on a second delivery.
Questions people ask
What if TradingView delivers the same alert twice?
With a unique key per alert, the second delivery carries the same key as the first and is treated as one. It is recorded as a duplicate of the first, with no second fill.
Does Shifu ever retry an order?
Only exits. If a new trade’s hand-off to the broker does not land within its budget, it is skipped and recorded, and it is never sent again later at a worse price. An exit keeps trying for a few seconds, because a late close beats an open trade.
Could a missed alert leave me in a trade with no exit?
Not if the entry carried a bracket: the take-profit and stop rest at the broker from the fill. On paper and Tradovate, a later entry also flattens the old position first.
How do I see that a duplicate was caught?
On the Alerts page the second alert is marked as a duplicate of the first and shows the first’s result. Nothing was placed twice.
