DenchClaw Webhooks: Connect to Any External Service
How DenchClaw webhooks let you trigger external services when CRM events happen — Slack alerts, Zapier flows, custom integrations.
DenchClaw Webhooks: Connect to Any External Service
DenchClaw's webhook system lets your workspace send HTTP requests to external services when CRM events happen — and receive incoming webhooks from external services to trigger AI actions. Connect DenchClaw to Slack, Zapier, Make, Linear, GitHub, or any service with a webhook interface, without writing custom integration code.
Outbound Webhooks: DenchClaw → External Services#
Outbound webhooks fire when something happens in your DenchClaw workspace. Configure them in Settings → Integrations → Webhooks, or via the AI.
Setting Up an Outbound Webhook#
"Send a Slack message to #sales-wins whenever a deal status changes to 'Closed Won'."
DenchClaw sets up a webhook listener for the entry:updated event on the Deals object where Status = "Closed Won", then fires a POST request to your Slack webhook URL.
Or configure directly:
# In workspace/webhooks.yaml
outbound:
- name: Slack Sales Wins
trigger:
event: entry:updated
object: deals
conditions:
- field: Status
operator: equals
value: Closed Won
url: https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
method: POST
payload_template: |
{
"text": "🎉 Deal closed: {{entry.Deal Name}} — ${{entry.Deal Value}} with {{entry.Company}}"
}
enabled: trueSupported Trigger Events#
Events that can trigger outbound webhooks:
| Event | Description |
|---|---|
entry:created | New entry created in an object |
entry:updated | Entry field value changed |
entry:deleted | Entry deleted |
entry:status_changed | Entry status/stage changed |
document:updated | Entry document edited |
cron:completed | Scheduled task finished |
agent:task_completed | Subagent task finished |
app:event | Custom event from a Dench App |
Payload Templates#
Outbound webhook payloads use Handlebars-style templates:
{
"deal_name": "{{entry.Deal Name}}",
"value": "{{entry.Deal Value}}",
"company": "{{entry.Company}}",
"stage": "{{entry.Stage}}",
"closed_at": "{{entry.updated_at}}",
"workspace": "{{workspace.name}}"
}Available template variables:
{{entry.*}}— any field value from the triggering entry{{object.name}}— object name (e.g., "deals"){{event.type}}— event type that triggered{{workspace.name}}— your workspace name{{timestamp}}— ISO 8601 current timestamp
Common Outbound Webhook Integrations#
Slack notifications:
URL: https://hooks.slack.com/services/...
Event: entry:created on leads
Payload: {"text": "New lead: {{entry.Full Name}} from {{entry.Company}}"}
Zapier trigger:
URL: https://hooks.zapier.com/hooks/catch/XXXXXXX/
Event: entry:status_changed on deals
Payload: full entry data (omit payload_template for full JSON)
Linear issue creation:
URL: https://linear.app/api/webhook
Event: entry:created on projects
Payload: {"title": "New project: {{entry.Project Name}}", "teamId": "..."}
GitHub issue:
URL: https://api.github.com/repos/org/repo/issues
Event: entry:created on bugs
Headers: {"Authorization": "token YOUR_GITHUB_TOKEN"}
Payload: {"title": "{{entry.Bug Title}}", "body": "{{entry.Description}}"}
Inbound Webhooks: External Services → DenchClaw#
DenchClaw can also receive webhooks from external services. Each inbound webhook has a unique URL that external services POST to.
Create an inbound webhook:
"Create an inbound webhook so that when a new form submission comes in from my Typeform, it creates a new lead in DenchClaw."
DenchClaw generates a unique URL:
https://YOUR_DENCHCLAW_INSTANCE/webhooks/inbound/abc123
Configure Typeform (or any form tool) to POST to this URL on submission. DenchClaw receives the payload and the AI processes it:
inbound:
- name: Typeform Lead Capture
slug: abc123
action: |
Parse the incoming Typeform payload.
Create a new lead entry in the People object with:
- Full Name from field "name"
- Email from field "email"
- Company from field "company"
- Source = "Typeform"
- Status = "Lead"
enabled: trueInbound Webhook Processing#
The AI processes each inbound webhook payload according to your configured action. It can:
- Create new CRM entries
- Update existing entries
- Trigger AI analysis
- Send notifications
- Trigger cron tasks
Because the action is written in natural language and executed by the AI, it handles messy real-world webhook payloads gracefully — field name variations, nested JSON, missing values, and so on.
Webhook Authentication#
Outbound Authentication#
Configure headers for authenticated outbound webhooks:
outbound:
- name: GitHub Integration
url: https://api.github.com/repos/org/repo/issues
headers:
Authorization: "token ${GITHUB_TOKEN}"
Content-Type: application/jsonEnvironment variables (like GITHUB_TOKEN) are stored in your workspace's .env file, not directly in the YAML.
Inbound Security#
DenchClaw verifies incoming webhook authenticity via:
- HMAC signature verification — for services that sign payloads (GitHub, Stripe, Shopify)
- Secret token — a shared secret passed in the request header
- IP allowlist — restrict to known source IP ranges
Configure in the inbound webhook settings.
Using dench.webhooks in Apps#
Trigger webhooks from custom Dench Apps:
// Trigger an outbound webhook
await dench.webhooks.trigger("slack-sales-wins", {
dealName: "Apex Corp",
value: 25000
});
// Create a temporary inbound webhook
const webhook = await dench.webhooks.createInbound({
name: "Temp Lead Capture",
expiresIn: 3600000, // 1 hour
action: "Create a lead from the incoming data"
});
console.log(webhook.url); // Use this URL in your formSee also: DenchClaw Event System for internal event handling, and DenchClaw Cron Scheduling for event-triggered scheduled tasks.
Frequently Asked Questions#
Can webhooks trigger AI tasks in DenchClaw?#
Yes. Inbound webhook actions are processed by the AI and can include any natural language instruction — create records, update fields, send notifications, trigger analysis, spawn subagents.
How do I debug a webhook that isn't firing?#
Check the webhook logs in Settings → Integrations → Webhooks → Logs. Each webhook event shows the trigger condition evaluation, the outbound request, and the response status code. For inbound webhooks, logs show the received payload and action execution result.
Can I test a webhook without a real event?#
Yes. In the webhook management panel, click "Send test event" to fire the webhook with sample data. Inbound webhooks have a "Test with payload" input where you can paste a sample payload and see how DenchClaw processes it.
Is there a rate limit on webhooks?#
DenchClaw doesn't impose rate limits on webhook processing. If you're triggering thousands of webhook events per minute (e.g., bulk imports), DenchClaw queues them and processes at a sustainable rate. External services may have their own rate limits.
How do I secure my inbound webhook URLs?#
Don't share inbound webhook URLs publicly. Each URL includes a random token in the path. For additional security, add HMAC signature verification matching your external service's signing method. DenchClaw supports SHA-256 HMAC verification with a configurable signing secret.
Ready to try DenchClaw? Install in one command: npx denchclaw. Full setup guide →
