Webhook triggers turn any external event — a form submission, an upstream system hook, a CI/CD step — into a Tale automation run. The external service POSTs JSON to a URL you control; the workflow starts with that payload as its input. This tutorial walks through creating a minimal workflow, exposing its webhook, sending a signed request, and verifying delivery. Reference lives in Webhooks and Triggers.
You need Developer access. A working Tale instance reachable on HTTPS from the external caller is enough — no other setup.
Step 1 — Create a workflow with a webhook trigger
Open Automations in the sidebar and click New workflow. Give it a name (incoming-order-intake) and open the Start step. In Triggers, add a Webhook trigger. Tale generates a unique URL of the form:
https://<your-tale-instance>/api/webhooks/workflow/<workflow-id>
Set a Webhook secret — any high-entropy string. This is the shared secret used to sign and verify requests. Store it in your caller’s secret manager.
Step 2 — Add one step that uses the payload
The webhook body becomes the workflow input. Add an LLM step after Start and reference the input in the prompt:
Classify this order intake as urgent, normal, or follow-up:
{{ trigger.body | json }}
See Workflows for the full step palette and variable syntax.
Save the workflow and toggle Publish so the webhook is live.
Step 3 — Call the webhook from the outside
Tale signs every incoming request with HMAC-SHA-256 if a secret is set. The caller must do the same; Tale rejects unsigned or incorrectly signed requests.
BODY='{"customerId":"c-42","priority":"high","lines":3}'
SIG="sha256=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" | sed 's/.* //')"
curl -X POST "https://<your-tale-instance>/api/webhooks/workflow/<workflow-id>" \
-H "Content-Type: application/json" \
-H "X-Tale-Signature: $SIG" \
-d "$BODY"
Response:
{ "executionId": "exec_..." }
The POST returns immediately with an execution ID — the workflow itself runs asynchronously.
Step 4 — Verify the run
Open the workflow and click the Executions tab. Filter by the execution ID or by timestamp; you will see the trigger payload, every step’s input and output, and the total wall-clock time. This is where you debug failures. See Execution logs for the full view.
Step 5 — Add retries and idempotency (production hardening)
- Retries: Tale retries non-2xx responses with exponential backoff up to five attempts. If your caller retries on its own, make sure each retry sends the same body — otherwise the signature will not match.
- Idempotency: include a stable request ID in the body (
requestId). Your first workflow step can branch on whether that ID has been seen before, so duplicate deliveries do not cause duplicate side effects.
- Secret rotation: change the webhook secret in the Tale UI, roll it through your caller’s config, then redeploy the caller. Brief overlap is unavoidable; fail-open for a short window if that is acceptable.
Troubleshooting
- 401 invalid signature — the signed body is not identical byte-for-byte to what was sent (often due to JSON pretty-printing middleware).
- 404 workflow not found — workflow was deleted or its ID changed; re-copy the URL from the Start step.
- 5xx — check the workflow’s Executions tab for a failing step. The HTTP response body contains the error summary.
Next
- Cross-reference with Webhooks for signature verification code samples in Node and Python.
- Use agent webhooks instead when you want a direct agent reply without the automation layer: Webhooks — Agent webhooks.
Last modified on April 20, 2026