TradingView Webhook Not Working: Diagnose Every Error Boundary
A symptom-led troubleshooting guide for alerts that never trigger, webhook delivery errors, invalid JSON, HexTrade route validation, and broker rejections.
Why is a TradingView webhook not working?
Most failures belong to one of four boundaries: the TradingView alert never triggered, the HTTP request could not reach or satisfy the endpoint, the receiver rejected the payload or route, or the broker rejected the resulting order. Start with the alert log and move forward once. Do not edit every layer simultaneously or resend while the first order's state is unknown.
A chart marker is not proof that a running alert emitted, and an alert event is not proof that a webhook arrived. Likewise, a successful HTTP response may mean accepted for processing rather than broker-filled. Build a timeline from evidence owned by each system. Record the chart symbol and timeframe, alert name and creation version, trigger time, Webhook status, sanitized payload, receiver result, connected account, and broker state. The first missing or contradictory artifact identifies the narrowest useful investigation.
This method prevents common category errors. Rewriting JSON cannot fix an expired alert. Recreating an alert cannot fix an incorrect `accountId`. Retrying a valid request cannot fix an unavailable contract or an account restriction. Most importantly, a sender timeout cannot safely be treated as no order. Pause automation and reconcile downstream state whenever delivery or submission might have occurred but final evidence is missing.
- No alert-log event: investigate Pine, realtime conditions, alert status, expiry, snapshot, and frequency.
- Alert event with delivery error: investigate URL, port, DNS, TLS, redirect, timeout, and response status.
- Receiver rejection: investigate JSON, access, documented fields, account, platform, symbol, and controls.
- Receiver success with no fill: investigate broker authorization, session, limits, order semantics, and final state.
What should you check when the alert never fired?
Confirm that a running, unexpired alert exists for the intended script trigger, symbol, timeframe, and inputs. Pine code only exposes trigger events; it does not create the server-side alert. Remember that alerts execute on realtime bars and preserve a snapshot from creation. After changing code, inputs, or chart context, delete and recreate the alert before testing again.
Open the alert manager and log before touching the webhook body. If there is no event, test whether the condition actually became true in realtime and whether the selected trigger matches the code. `alertcondition()` creates selectable triggers only for indicators; it has no alert-trigger effect in strategies. `alert()` requires its guarded code path to execute and its frequency to permit emission. Strategy order-fill events require the alert dialog to include order fills, and a custom `alert_message` requires the corresponding placeholder.
Frequency and repainting explain many timing disputes. Fluid values can satisfy a condition during an open realtime bar and no longer satisfy it after refresh. Once-per-bar-close improves confirmation at the cost of waiting for the bar. TradingView also documents that if more than fifteen alerts occur within three minutes, further alerts are halted. Treat a burst as a script-state problem to correct, not as a reason to create more duplicate alerts.
- 1
Verify the running instance
Check active status, expiration, condition selection, notification setting, chart symbol, and timeframe.
- 2
Verify the Pine path
Prove the relevant branch executes in realtime and that its frequency permits the expected event.
- 3
Verify the snapshot
Recreate the alert after reviewed changes to code, inputs, symbol, timeframe, or message.
How do you interpret TradingView webhook delivery errors?
Read the Webhook status in TradingView's alert log and classify the result. A 3xx indicates redirection; 4xx means the receiver rejected the request; 5xx means the receiver could not process a valid request; timeout means no response arrived within three seconds. Invalid URLs, private addresses, TLS failures, refused connections, and invalid responses each require different fixes.
For 3xx, correct the alert URL rather than relying on a redirect to another path or login page. For 4xx, inspect endpoint existence, authentication, content type, body format, required fields, and any rate limit. For 5xx, inspect service health and processing errors. TradingView resends only qualifying 500–599 responses other than 504, after five seconds, for up to four total deliveries. Your investigation must therefore anticipate duplicates whenever that rule was entered.
A timeout is especially ambiguous. TradingView cancels a request when the remote server takes longer than three seconds, but that fact alone does not say whether downstream work began. DNS or connection failures may prevent arrival; slow application processing may occur after arrival. Compare receiver access and application records before manual action. If the URL resolves to a local or private address, uses an unsupported port, or has broken TLS, fix the public endpoint rather than changing trading fields.
| Status or symptom | Likely boundary | First check |
|---|---|---|
| 3xx | URL or proxy | Exact endpoint path, redirect target, and accidental authorization page |
| 4xx | Request or access | JSON validity, content type, authentication, required fields, and rate limits |
| 5xx | Receiving service | Service health, application error, and duplicate-safe retry handling |
| Timeout | Network or slow receiver | Three-second timeline plus evidence of whether the body arrived |
| URL/TLS/connection | Public transport | DNS, HTTPS configuration, allowed port, public address, and server availability |
How do you fix JSON and HexTrade route rejections?
Capture the rendered non-sensitive message, parse it as JSON, then compare each field with the HexTrade documentation. Use a lowercase supported `platformType`, the exact `accountId` shown in Accounts, the destination account's symbol, a supported buy or sell field, and a valid quantity. Test with `dryRun: true` before attempting another live order.
TradingView sends `application/json` only when the complete message is valid JSON. Dynamic Pine strings can fail because of missing quotes, trailing commas, raw line breaks, unescaped labels, or invalid numeric text. Placeholders can also be quoted inconsistently. Parsing a copied rendered sample exposes syntax before it reaches a trading route. Never paste the private webhook URL, broker credentials, or account secrets into a public validator or support message; sanitize the body and retain only fields required to reproduce formatting.
Once syntax passes, validate semantics. HexTrade's troubleshooting docs identify inactive alerts, invalid JSON, wrong lowercase platform slug, account mismatch, and symbol mismatch as common causes. A futures account might expect `NQ`, while a CFD account might expect `NAS100`. The chart symbol and payload symbol can differ, and `symbolOverride` is documented for that purpose. Change one field at a time and preserve each dry-run response so the corrected boundary is obvious.
{
"ticker": "MNQ",
"action": "buy",
"quantity": "1",
"platformType": "projectx",
"accountId": "replace_with_exact_account_id",
"strategyName": "webhook-diagnostic-v1",
"dryRun": true
}Do not debug by exposing the endpoint
Redact the private webhook URL in screenshots and support messages. If it has been disclosed, regenerate it in Accounts before resuming tests.
What if the webhook arrived but no broker order filled?
Separate receiver validation from broker execution. Confirm whether the service merely accepted the request, attempted submission, received a broker rejection, or obtained an accepted order that remained unfilled. Check account authorization, destination symbol or contract, session availability, size, balance or margin, broker order support, and applicable prop-firm rules. Never label HTTP acceptance as a fill.
HexTrade's troubleshooting documentation points to balance, limits, and session hours as common broker-rejection areas. Those categories are starting points, not proof of a specific cause. Read the actual broker-facing result and compare it with the connected account. Futures contracts expire and roll, so a symbol that worked previously can become unavailable or map differently. A chart on a continuous contract does not guarantee that the destination accepts the same identifier at that moment.
An accepted marketable order can still fill at an unexpected price, while a limit or stop order can remain working or never fill. Partial execution is also different from rejection. Your incident record should preserve requested versus accepted quantity, order type if supported, broker identifier if available, and final status. If the status is unknown, freeze retries and inspect the destination account directly. The cost of waiting for evidence is usually lower than an accidental second futures position.
- Authorization: the connected account and session remain valid.
- Instrument: the exact contract or broker symbol is available on that account.
- Risk: quantity, margin, account limits, and firm rules permit the request.
- State: accepted, working, partially filled, filled, cancelled, rejected, and unknown are different outcomes.
What is the fastest safe troubleshooting runbook?
Freeze repeated live attempts, write one event timestamp, and walk the evidence chain in order: Pine condition, running alert, alert-log event, Webhook status, sanitized rendered body, receiver record, and broker state. Fix only the first failed boundary, rerun with dry mode or smallest approved size, and close the incident only after the destination account reconciles.
Start a simple incident note before changing anything. Screenshots taken after an alert is recreated can erase the original context, and chart refreshes can alter repainting evidence. Record the alert's creation version and current snapshot assumptions. If TradingView shows no event, stay in the Pine and alert layer. If it shows a transport error, stay in URL, request, or receiver health. If HexTrade validates but a broker rejects, stop changing JSON syntax and inspect the account-facing reason.
When the immediate issue is fixed, add a prevention control. That may be a payload parser test, `allowedSymbols`, `maxQty`, a clear `strategyName`, a bar-close rule, a route checklist, or a credential-redaction rule. Recreate the alert if its script, input, chart, or message snapshot changed. Then perform one controlled test and monitor the first live fills. Do not use a successful later order to assume an earlier unknown attempt vanished; reconcile both separately.
- 1
Stop creating new evidence
Pause manual resends and automation until potentially submitted orders are reconciled.
- 2
Locate the first gap
Move through sender, transport, receiver, and broker records without skipping ahead.
- 3
Apply one correction
Change the smallest responsible configuration and preserve the before-and-after payload or status.
- 4
Retest under control
Use dry run first, then the smallest permitted live size, and verify final broker state.
Sources and methodology
HexTrade Research uses official product, exchange, regulator, and vendor documentation. Policies and platform behavior can change; follow the linked source and verify current terms before trading.
- 1.What webhook errors mean — TradingView, accessed Aug 30, 2026
- 2.How to configure webhook alerts — TradingView, accessed Aug 30, 2026
- 3.Webhook resubmission — TradingView, accessed Aug 30, 2026
- 4.Pine Script alerts FAQ — TradingView, accessed Aug 30, 2026
- 5.Webhook troubleshooting — HexTrade Docs, accessed Aug 30, 2026
- 6.Symbol mapping — HexTrade Docs, accessed Aug 30, 2026
Frequently asked questions
Why does the chart show a signal but the alert log is empty?
The running alert may be inactive, expired, configured for another trigger, based on an older snapshot, or blocked by Pine frequency or runtime behavior. Chart plots are not server-side alert evidence. Check the active alert and realtime code path before investigating the webhook URL.
What does a TradingView 4xx webhook error mean?
It means the receiver rejected the request because of access, endpoint, parameters, data, format, or possibly a receiver rate limit. Validate the exact URL and rendered JSON, then compare documented fields. A 4xx does not qualify for TradingView's documented 5xx resubmission.
Why does HexTrade accept a dry run but the broker rejects live?
Dry run validates and plans the request without sending an order. It cannot prove live authorization, current contract availability, margin, account limits, session rules, prop policy, broker order support, or a fill. Use the broker-facing result and destination account as the live evidence.
Should I resend after a TradingView timeout?
Not until you know whether the receiver or broker acted. A timeout only proves the three-second response deadline was missed. Inspect receiving and destination records first. If the initial state remains unknown, escalating for reconciliation is safer than creating a potentially duplicate position.
Can I post my webhook URL when asking for support?
No. Keep the complete private URL and all credentials out of chat, screenshots, tickets, and public validators. Share a redacted body and timestamps instead. If the URL has leaked, regenerate it from Accounts and update the TradingView alert before further testing.
Next step
Put the research into a controlled workflow
Start small, verify the broker and account rules, and keep risk controls between every signal and live order.
Explore webhook automationContinue reading
Educational content only. Futures are leveraged products and can produce losses greater than the amount you expected to risk. This article is not financial, legal, or prop-firm compliance advice.