DenchClaw + Zapier: Connect to 5,000 Apps
Connect DenchClaw to Zapier via webhooks — trigger Zaps on CRM changes, push form and calendar data into DuckDB, and automate cross-app workflows.
DenchClaw + Zapier: Connect to 5,000 Apps
DenchClaw's native integrations (Gmail, Calendar, Slack, GitHub, Apollo, LinkedIn) cover most of what sales teams need. But there will always be tools it doesn't connect to natively — your specific form builder, your scheduling tool, your event platform. That's where Zapier comes in. Via webhooks, DenchClaw can both send data to Zapier when something changes in your CRM and receive data from Zapier to create or update CRM records.
Here's how to wire it up.
DenchClaw's Webhook System#
DenchClaw exposes two webhook interfaces:
Outbound (DenchClaw → Zapier): When something happens in DenchClaw (new contact created, deal stage changed, etc.), DenchClaw fires a webhook to a URL you provide — including a Zapier catch hook URL.
Inbound (Zapier → DenchClaw): Zapier can send data to DenchClaw's webhook endpoint, triggering DenchClaw to create or update records in DuckDB.
Both run over HTTP. DenchClaw runs a local server (default http://localhost:3456) that handles inbound webhooks.
Exposing DenchClaw to the internet for Zapier#
Zapier needs to reach your DenchClaw webhook endpoint over the public internet. Since DenchClaw runs locally, you need to expose the local port. The simplest way:
# Using ngrok (free tier works)
ngrok http 3456
# DenchClaw can do this automatically
npx denchclaw webhook exposeDenchClaw will show you a public URL like https://abc123.ngrok.io. Use this as the base URL for your Zapier inbound webhooks.
For a more permanent setup, configure your router's port forwarding or use a static tunnel service. DenchClaw will remember your public URL and use it in outbound webhook notifications.
Setting Up a Zap Triggered by CRM Changes#
Step 1: Get DenchClaw's outbound webhook URL#
Tell DenchClaw what event you want to trigger on:
"Create a webhook for when a deal moves to the Proposal stage"
DenchClaw responds with an outbound configuration. You'll need to provide a Zapier webhook URL for it to fire to.
Step 2: Create a Zap with Webhook trigger#
In Zapier:
- Click "Create Zap"
- Choose "Webhooks by Zapier" as the trigger
- Select "Catch Hook"
- Copy the webhook URL Zapier provides
Step 3: Configure DenchClaw to fire to that URL#
npx denchclaw webhook add \
--name zapier-proposal-trigger \
--url https://hooks.zapier.com/hooks/catch/12345/abcdef/ \
--trigger deal_stage_change \
--filter "deal_stage = 'Proposal'"Or via natural language:
"When a deal reaches Proposal stage, fire a webhook to https://hooks.zapier.com/hooks/catch/12345/abcdef/"
Step 4: Test the trigger#
Move a test deal to Proposal stage in DenchClaw. Zapier should receive the webhook within a few seconds.
What the webhook payload looks like#
When DenchClaw fires an outbound webhook, it sends a JSON payload:
{
"event": "deal_stage_change",
"timestamp": "2026-03-26T10:30:00Z",
"contact": {
"id": "c_abc123",
"name": "Sarah Chen",
"email": "sarah@acme.com",
"company": "Acme Corp",
"phone": "+1-555-0100",
"title": "VP of Engineering",
"linkedin_url": "https://linkedin.com/in/sarahchen"
},
"deal": {
"stage": "Proposal",
"previous_stage": "Discovery",
"value": 24000,
"owner": "mark",
"changed_at": "2026-03-26T10:30:00Z"
},
"metadata": {
"source": "denchclaw",
"workspace": "my-workspace"
}
}You can use any field from this payload in your Zap actions.
Pushing Data From Zapier Into DenchClaw#
The inbound direction: something happens in an external tool (Typeform submission, Calendly booking, etc.), Zapier captures it, and sends it to DenchClaw to create or update a CRM record.
Setting up DenchClaw's inbound webhook endpoint#
npx denchclaw webhook create-endpoint --name zapier-inbound --action create_contactDenchClaw returns an endpoint URL like:
https://abc123.ngrok.io/webhooks/zapier-inbound
Use this URL in Zapier as the webhook destination.
Expected inbound payload format#
DenchClaw accepts incoming webhooks with contact or deal data in this format:
{
"name": "John Martinez",
"email": "john@globex.com",
"company": "Globex",
"phone": "+1-555-0200",
"title": "Head of Product",
"source": "typeform",
"status": "Lead",
"notes": "Interested in enterprise plan. Filled out pricing inquiry form.",
"custom_fields": {
"form_response_id": "resp_abc123",
"interested_in": "Enterprise Plan",
"company_size": "50-200"
}
}Fields not matching standard DenchClaw fields go into custom_fields and DenchClaw creates dynamic fields for them.
Inbound webhook actions#
DenchClaw supports these actions on inbound webhooks:
create_contact— create a new contact entryupdate_contact— update an existing contact (matched by email)upsert_contact— create if not exists, update if existscreate_deal— create a deal linked to a contactlog_interaction— log an interaction to an existing contacttrigger_enrichment— enrich the contact from Apollo or LinkedIn
Configure the action when setting up the endpoint:
npx denchclaw webhook create-endpoint \
--name zapier-typeform \
--action upsert_contact \
--default-status Lead \
--default-source typeformCommon Zapier + DenchClaw Workflows#
Typeform → CRM#
Use case: Someone fills out your "Request a Demo" form on your website. Typeform captures the response, Zapier sends it to DenchClaw.
Zap:
- Trigger: Typeform — New Entry
- Action: Webhooks — POST to DenchClaw inbound endpoint
DenchClaw receives:
{
"name": "{{Typeform.Name}}",
"email": "{{Typeform.Email}}",
"company": "{{Typeform.Company}}",
"notes": "Demo request: {{Typeform.What are you looking to solve?}}",
"status": "Lead",
"source": "typeform-demo-form"
}DenchClaw creates the contact entry and optionally triggers LinkedIn/Apollo enrichment automatically.
Calendly → CRM#
Use case: Someone books a discovery call in Calendly. You want a CRM contact created and a meeting logged automatically.
Zap:
- Trigger: Calendly — Invitee Created
- Action: Webhooks — POST to DenchClaw inbound endpoint
{
"name": "{{Calendly.Invitee Name}}",
"email": "{{Calendly.Invitee Email}}",
"status": "Prospect",
"source": "calendly",
"notes": "Booked: {{Calendly.Event Name}} on {{Calendly.Start Time}}"
}HubSpot form → CRM#
Use case: You're migrating off HubSpot but still have HubSpot forms on your site.
Zap:
- Trigger: HubSpot — New Form Submission
- Action: Webhooks — POST to DenchClaw inbound endpoint
Map HubSpot fields to DenchClaw fields in the Zapier action step.
New Stripe customer → CRM#
Use case: Someone signs up for your SaaS product. Create a "Customer" record in DenchClaw automatically.
Zap:
- Trigger: Stripe — New Customer
- Action: Webhooks — POST to DenchClaw inbound endpoint
{
"name": "{{Stripe.Customer Name}}",
"email": "{{Stripe.Customer Email}}",
"status": "Customer",
"source": "stripe",
"deal_stage": "Closed Won",
"custom_fields": {
"stripe_customer_id": "{{Stripe.Customer ID}}"
}
}Limitations vs. Native Integrations#
Zapier gives you breadth, but there are trade-offs vs. DenchClaw's native integrations:
| Feature | Native Integration | Zapier |
|---|---|---|
| Latency | Immediate (direct) | 1-15 minute delay (free plan) |
| Cost | Free | Zapier subscription |
| Reliability | High | Depends on Zapier uptime |
| Data depth | Full context | Limited to Zap fields |
| Bidirectional | Yes | Requires separate Zaps for each direction |
| Browser-based enrichment | Yes (Apollo, LinkedIn) | Not available via Zapier |
| Natural language control | Full | No |
Use native integrations where they exist (Gmail, Calendar, GitHub, Slack, Apollo, LinkedIn, Stripe). Use Zapier for everything else.
Frequently Asked Questions#
How do I secure my DenchClaw webhook endpoint?
Configure a secret token:
npx denchclaw webhook create-endpoint \
--name zapier-inbound \
--secret my-webhook-secret-tokenDenchClaw then validates the X-Webhook-Secret header on all inbound requests. Set the same value in Zapier's webhook header configuration. Requests without the correct token are rejected with a 401.
What happens if DenchClaw is offline when Zapier fires a webhook?
Zapier retries failed webhook deliveries up to 3 times over several hours. If DenchClaw's local server is down, the events will be retried when it comes back up. For critical workflows, consider running DenchClaw on a server that stays online 24/7.
Can I use Zapier's "Filters" to only trigger DenchClaw for specific contacts?
Yes. Add a Zapier filter step between your trigger and the DenchClaw webhook action. For example: "Only continue if email contains @enterprise.com." This way, DenchClaw only receives the events you care about.
Does DenchClaw deduplicate inbound contacts from Zapier?
Yes, when using the upsert_contact action. DenchClaw checks for an existing contact with the same email address. If found, it updates the existing record. If not found, it creates a new one. Use create_contact if you explicitly want duplicates prevented at the Zapier level instead.
What Zapier plan do I need?
The free Zapier plan supports up to 100 tasks/month and 5 Zaps with 2-step workflows. For production use (multi-step Zaps, higher volume), you'll need a paid Zapier plan. DenchClaw itself has no per-webhook fees.
Ready to try DenchClaw? Install in one command: npx denchclaw. Full setup guide →
