Webhook Trigger Node
Trigger workflows from external incoming HTTP webhooks.
The Webhook Trigger node turns a workflow into an HTTP entrypoint. When you create the trigger, Builder Studio provisions a secret-protected endpoint. Any inbound request that authenticates with that secret starts an execution of the workflow downstream of the node, seeding the request method, URL, headers, query, and body into the graph.
Create the endpoint
Add a Webhook Trigger node
Place the node on the canvas. Before you create an endpoint it shows a “No webhook configured” state with a Create webhook endpoint button.
Create the webhook endpoint
Editors with edit access click Create webhook endpoint. Builder Studio registers a webhook trigger for this canvas and node, and generates the bearer secret used to authenticate inbound calls.
Copy the cURL command
The copy button writes a ready-to-run cURL command that targets the endpoint with an
Authorization: Bearerheader. The endpoint URL is shown in the node, but the secret is only included in the copied command and is hidden from viewers without edit access.Send a test request
Post an event to the endpoint. The node status row updates and records the last-triggered time when a request successfully starts an execution.
Endpoint and authentication
All triggers for a deployment share one stable path, /webhook/trigger, on the Convex site URL. The secret in the request identifies which trigger (and therefore which canvas and node) to run, so the secret is the credential — treat it like a password.
- Send the secret as
Authorization: Bearer <secret>or as anx-webhook-secretheader. - Passing the secret as a
?secret=query parameter is rejected with a 400 so it cannot leak into request logs. - A missing or unrecognized secret returns 400 or 404. Revoking the endpoint invalidates the secret immediately.
curl -X POST "https://<your-convex-site>/webhook/trigger" \ -H "Authorization: Bearer <webhook-secret>" \ -H "Content-Type: application/json" \ -d '{"event":"order.created","orderId":"1234"}'Accepted requests
| Aspect | Behavior |
|---|---|
| Methods | GET, POST, PUT, PATCH, and DELETE. Other methods return 405. |
| Body types | JSON objects and application/x-www-form-urlencoded bodies are parsed. The raw body is always preserved separately. |
| Body size | Requests larger than roughly 512 KB are rejected with 413. |
| Rate limiting | Each endpoint is rate limited per trigger. Over-limit requests return 429 with a Retry-After header. |
What downstream nodes receive
The node has no inputs. It exposes the request to the rest of the workflow through six text output ports. Connect the ports you need to downstream nodes.
// Output ports exposed to downstream nodes (all text):method-out // request method, e.g. "POST"url-out // sanitized request URL (secret query param stripped)headers-out // request headers as JSON (auth/cookie headers redacted)query-out // query string params as JSON (secret stripped)body-out // parsed JSON/form body re-serialized (callbackUrl removed)raw-body-out // the raw request body text as receivedauthorization, cookie, andx-webhook-secret headers from headers-out, and removes a secret query param from the URL and query outputs, before the workflow sees them.Idempotency and provider hints
The trigger can deduplicate retries so a re-delivered event does not run the workflow twice.
- Send an
Idempotency-Key(orx-idempotency-keyheader, oridempotencyKeybody field) to make a request idempotent. A replay returns the original response with anIdempotency-Replayed: trueheader; a key reused with a different body returns 409. - Known provider headers are recognized to infer a provider and event id automatically, including GitHub (
x-github-delivery), Shopify, OpenAI, and Stripe. When a provider and event id are present, the trigger derives an idempotency key for you. - Include a
callbackUrlin the JSON body to have the execution post results back. The callback URL must resolve to a public host or the request is rejected with 400.
Status, revoke, and cleanup
- The status row reflects configuration state (Not configured, Loading, Ready) and execution state (Idle, Running, Triggered, Error), plus the last-triggered time.
- Revoke removes the endpoint and its secret. The node returns to the unconfigured state, and you can create a new endpoint with a fresh secret.
- If the underlying node is deleted or its type changes, the stale trigger is cleaned up and further calls return 404.
Was this page helpful?