Zapier
Audience: Sales, management, support, engineering · Where in app: Settings → Integrations → Zapier (and Settings → Webhooks) · Plan availability: All plans (verify)
Zapier is the "glue everything together without code" option. Knock Knock fires events (new visitor, hot lead, booking, chat ended, …); a Zapier "Zap" catches each event and does whatever the customer wants with it — add a row to Google Sheets, post to Slack, add to a Mailchimp list, create a task. It's the easiest path for non-technical admins who want to fan an event out to several destinations.
What it does
Subscribes Zapier webhooks to Knock Knock events. Since cb83986ec (2026-09-07) Zapier and custom webhooks share one catalogue and one dispatch (app/configs/webhookEvents.js, WebhookHelper.dispatch → BullMQ tenant-webhooks): all nine events — new_session, new_user_identified, new_lead, lead_score_update, chat_transcript, new_booking, call_completed, booking_rescheduled, booking_cancelled — are Zapier triggers. The Zapier payload is the bare event data with a prepended id (the delivery id, stable per identical payload) so Zapier dedups; samples use sample-<event>. Zapier app version 1.1.0 is invite-only via a version-specific link (promotion is blocked), which is what the Zapier modal links to.
How it works
Auth model: webhook URL + shared secret (company ID + secret pair). In Settings → Integrations → Zapier, Knock Knock generates a Zapier secret — a 20-byte hex string stored at company.zapier.secret (with secret_generated_at). Each Zap registers a webhook subscription, stored in company.zapier.webhooks[]:
{ url, event, zap_id }
Direction: outbound only. When a subscribed event occurs, Knock Knock POSTs the event payload to the Zap's URL.
Inbound auth (Zapier → Knock Knock): Zapier's management calls (subscribe/unsubscribe/test/sample) authenticate with two headers — X-Company-Id and X-Company-Secret (matched against company.zapier.secret). There is no HMAC signature on outbound deliveries; the secret-pair identifies the tenant.
Example payload (new_lead)
{
"user_session": { "...full session object..." },
"contact_information": {
"name": "...",
"email": "...",
"phone": "..."
}
}
lead_score_update instead carries a lead_score object (lead_event, event_score, total_score); new_session carries only user_session.
A typical Zap
- Trigger: "When new lead in Knock Knock"
- Action 1: Add row to Google Sheets
- Action 2: Post to Slack
- Action 3: Add to Mailchimp list
Configuration & options
- Generate/rotate the Zapier secret:
GET /zapier/generate-secret(Settings → Integrations → Zapier). - Zapier registers subscriptions via
POST /zapier/subscribe-webhook(and removes viaDELETE /zapier/unsubscribe-webhook); sample data comes fromGET /zapier/webhook-sample-data?event=.... - Manage native event delivery alongside Zapier under Settings → Webhooks.
Zapier vs native webhooks
| Use Zapier when… | Use native webhooks when… |
|---|---|
| You want no-code | You're sending to your own API |
| You need to fan out to 3+ destinations | You need HMAC-signed delivery |
| You want filters / transformations | You want max throughput / no Zapier task limit |
Behaviors & edge cases
- Delivery audit: every attempt lands in
webhook_logswithwebhook_id = zapier:<hook _id>— same retries (4 attempts, 30-min cap) as native webhooks; a hook answering410is$pulled fromcompany.zapier.webhooks. Subscribe is idempotent (200 on a duplicate URL); unsubscribe accepts a 24-hex hook id or the URL (c9022f647); hook URLs must be onhooks.zapier.com; rotating the secret clears the hooks. - Latency: Zapier delivery is typically a few seconds — not real-time enough for "while the visitor is still on the page" use cases. Use native webhooks (or Slack) for that.
- Task limits: Zapier's free tier has low task limits; high-volume tenants burn through them quickly. Native webhooks are more durable.
Plan & limits
- Available on all plans (verify exact tier gating).
- The binding limit is Zapier's own per-plan task quota, not Knock Knock.
Technical implementation
- Owning service:
backend. Subscriptions stored oncompanies.zapier(secret,webhooks[]); deliveries flow through the same webhook delivery + audit path as native webhooks (WebhookQueueService,webhook_logs).ZapierHelper.sendZapierWebhookand its 1,650-line sample blob were deleted. - See Webhooks for the underlying delivery, signing, and retry mechanics.
What Nox can tell you
- Which Zaps are active.
- Recent deliveries (success / failure) via
webhook_logs. - Whether Zapier is processing events at the expected rate.