Automations
Webhooks
Build automated workflows and business logic.
Webhooks let your automations send data out to any external service. When an automation fires, the Send Webhook action POSTs a payload you define to the URL you configure.
The Send Webhook action
A Send Webhook action is configured with the fields below. These exact field names matter — the automation engine reads them directly, so a webhook configured under any other keys is ignored and never sends.
| Field | Required | Description |
|---|---|---|
webhook_url | Yes | The destination URL the request is sent to. |
webhook_method | No | HTTP method. Defaults to POST. |
webhook_headers | No | An object of custom headers, sent exactly as written (use this for an auth token or shared secret). Content-Type: application/json is added automatically. |
webhook_body | No | A JSON object sent as the request body. Its values can contain the template variables listed below. |
{
"webhook_url": "https://api.example.com/webhook",
"webhook_method": "POST",
"webhook_headers": {
"X-Webhook-Secret": "your-shared-secret"
},
"webhook_body": {
"event": "new_lead",
"lead_id": "${trigger.record.id}",
"name": "${trigger.record.name}",
"email": "${trigger.record.email}"
}
}Field names are exact
The action only recognises webhook_url, webhook_method, webhook_headers and webhook_body. Configurations that use other keys (such as url or body) are ignored, and the webhook silently never sends.
Template variables
Inside webhook_body values, these placeholders are replaced with live data when the automation runs:
| Variable | Resolves to |
|---|---|
${trigger.record.id} | The ID of the record that triggered the automation. |
${trigger.record.<field>} | Any field on the trigger record — e.g. ${trigger.record.email}. The field's original value type is preserved. |
${uuid()} | A newly generated UUID. |
${today()} | The current date. |
${now()} | The current timestamp. |
Supported Methods
| Method | Use Case |
|---|---|
| POST | Send data to create resources (most common) |
| PUT | Update existing resources |
| PATCH | Partial update of resources |
| DELETE | Remove external resources |
What gets sent
The request body is exactly the webhook_body you configured, with every template variable resolved to its live value. For the example above, a new lead would send:
{
"event": "new_lead",
"lead_id": "8f3c1e7a-2b9d-4c1a-9f6e-1d2c3b4a5e6f",
"name": "Jane Smith",
"email": "jane@example.com"
}There is no automatic envelope or metadata wrapper — the payload shape is controlled entirely by your webhook_body.
Retry policy
Outbound webhooks are dispatched by a background worker and retried automatically on failure, up to 5 attempts, before being marked failed. A webhook is treated as failed if the target returns a non-2xx status code or the request errors.
Common Integrations
- Slack — Post notifications to channels using Slack webhook URLs
- Zapier — Trigger Zapier workflows from Kantos events
- Make (Integromat) — Build complex multi-app workflows
- Custom APIs — Sync data with your internal systems
Slack example
{
"webhook_url": "https://hooks.slack.com/services/T000/B000/XXXX",
"webhook_method": "POST",
"webhook_body": {
"text": "New high-value lead: ${trigger.record.name} (${trigger.record.company})"
}
}Debugging
Check the automation execution logs for webhook details:
- Request URL — Where the webhook was sent
- Request body — The payload that was sent
- Response status — HTTP status code from the target
- Response body — What the target returned
- Retry attempts — How many times the request was retried
Test with RequestBin
Use a service like RequestBin or webhook.site to inspect webhook payloads during development before connecting to your real endpoints.
Next Steps
- Actions — All available action types
- Triggers — Events that start automations
- API Webhooks — Webhook events from the Kantos API