Why Send test does not verify your automation
You created the alert, pasted the webhook URL, clicked Send test, and the workspace shows one unrecognized row instead of a verified automation. Nothing is broken. Send test sends the message exactly as written, placeholders included.
What Send test sends
A strategy alert's message is a template. TradingView fills the {{...}} placeholders when a bar fires the alert. Send test fires nothing on any bar, so it posts the template itself: the receiving side gets the literal text {{strategy.order.action}} instead of buy, {{strategy.order.contracts}} instead of a quantity, {{strategy.position_size}} instead of a position.
The same happens to a JSON message Claude gave you to paste: the fields arrive with their placeholders unfilled. A rule-based adapter for alert() or alertcondition() scripts receives whatever text your script formats, which under Send test is usually the raw template too.
What Pineflows records
The alert reaches your webhook URL, the adapter finds no action, quantity or position, and the row is logged as unrecognized with the raw body kept for review (truncated to 2 KB). Nothing is placed, in any mode, and the automation is not marked verified.
Send test proves one thing: the URL in the alert is right and TradingView can reach it. That row is the receipt. It does not prove the message parses or that the order would be the one you expect.
What verifies
One real alert, fired by your strategy on the chart, parsed by the adapter into the signal you expected. When it arrives, the signal log shows the parsed order (for example market buy 2 SPY) and the automation is marked verified. Every automation starts in test mode, so the verifying alert costs nothing and places nothing.
To get one quickly: keep the strategy applied to a chart it trades often, leave the alert open-ended, and wait for the next fill. If the strategy fires rarely, a smaller timeframe on the same ticker fires sooner. Test mode records; it never places.
The placeholders, and the one Pineflows acts on
TradingView's default message for a strategy() script is:
Order {{strategy.order.action}} @ {{strategy.order.contracts}} filled on {{ticker}}. New strategy position is {{strategy.position_size}}
{{strategy.order.action}}:buyorsell, the side of the order the strategy just filled.{{strategy.order.contracts}}: the quantity of that order.{{ticker}}: the chart symbol. It must match the automation's instrument; any other symbol is recorded aswrong_instrumentand never executed.{{strategy.position_size}}: the position after the fill. Positive is long,0is flat, negative is short. This is the field Pineflows acts on. The order it computes is the target minus what the account owns, with sells capped at what is owned. A negative value is clamped to0because the account is long only.
Keep the default message unless Claude handed you a template. Editing the text by hand is the second most common reason an alert comes back unrecognized.
When the webhook "does not work"
- A paid TradingView plan with two-factor authentication on. The Webhook URL field is not shown otherwise.
- The URL under the Notifications tab, pasted whole, no trailing space. It ends in
/api/webhooks/tv/<token>; the token is the secret, see Webhook URLs. - Expiration set to open-ended. An expired alert stops sending silently.
- The message untouched from the default, or exactly what Claude gave you.
- One real fired alert, then read that row in the signal log. Ask Claude for the automation status if you would rather not open the workspace.
The full alert setup is in TradingView alert. The guide that walks the whole path from script to order is Connect TradingView alerts to Robinhood.