Skip to content

Webhooks

Webhooks allow Dialer.CX to send real-time event notifications to your external systems via HTTP POST requests. When something happens in the platform — a call ends, an agent logs in, a lead is updated — the system immediately notifies any registered webhook endpoints, enabling real-time integrations without polling.

System Settings showing the Webhooks configuration panel with endpoint URLs and event subscriptions

EventTriggered WhenTypical Use
call.startedA new call is initiatedLog call start in CRM
call.endedA call completes with dispositionUpdate CRM with outcome, trigger follow-up workflows
agent.loginAn agent logs into the workspaceTrack attendance, update staffing dashboards
agent.logoutAn agent logs outCalculate shift duration, trigger EOD reports
agent.pauseAn agent enters pause stateMonitor break compliance
agent.resumeAn agent returns from pauseTrack break duration
lead.updatedA lead record is modifiedSync lead data to external CRM
recording.readyA recording is available for playbackTrigger transcription in external system
alert.triggeredAn alert threshold is breachedPush to PagerDuty, Slack, or monitoring tools

Navigate to Admin > Settings > Webhooks to manage webhook endpoints:

  1. Click Add Webhook
  2. Enter the destination URL (must be an HTTPS endpoint for production use)
  3. Select which events to subscribe to (you can subscribe to one or all events)
  4. Enable or disable the webhook with a toggle
  5. Click Save

You can create multiple webhook endpoints, each subscribing to different events. For example, one endpoint for your CRM (call events only) and another for your monitoring system (alert events only).

Webhooks deliver a JSON payload via HTTP POST with the Content-Type: application/json header:

{
"event": "call.ended",
"timestamp": "2026-03-07T15:30:00Z",
"data": {
"call_id": "12345",
"agent": "jsmith",
"phone_number": "5551234567",
"duration": 180,
"disposition": "SALE",
"campaign": "Q1-Sales"
}
}

The data object varies by event type. Call events include call metadata, agent events include agent information, and lead events include the changed fields.

Webhook delivery is designed to be reliable even when your endpoint has temporary issues:

  • Retries — failed deliveries are retried 3 times with increasing delays (5s, 30s, 120s)
  • Delivery log — all webhook attempts are recorded with HTTP status codes and response bodies
  • Signature verification — every request includes an X-Webhook-Signature header containing an HMAC-SHA256 signature for payload authentication
  • Timeout — 10-second timeout per delivery attempt to prevent slow endpoints from blocking the queue

Here is an example of signature verification in Node.js:

const crypto = require('crypto');
function verifyWebhook(body, signature, secret) {
const computed = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(computed),
Buffer.from(signature)
);
}
Use CaseIntegrationEvents
CRM SyncPush call data to Salesforce, HubSpot, Zoho, etc.call.ended, lead.updated
NotificationsSend Slack or Teams messages on eventsagent.login, agent.logout, alert.triggered
AnalyticsFeed data to your BI platform (Looker, Tableau, etc.)call.ended, call.started
AutomationTrigger workflows in Zapier or MakeAny event
MonitoringAlert PagerDuty or Opsgenie on operational issuesalert.triggered
ComplianceLog all call activity to an external audit systemcall.started, call.ended, recording.ready

Check webhook delivery history at Admin > Settings > Webhooks by clicking on any webhook endpoint to view its delivery log.

IssueCauseSolution
No deliveries appearingWebhook disabled or no matching eventsVerify the webhook is enabled and subscribed to the right events
All deliveries failing (HTTP 4xx)Endpoint rejecting requestsCheck endpoint URL, authentication requirements, and firewall rules
Intermittent failures (HTTP 5xx)Destination server errorsReview your endpoint’s error logs; the retry mechanism handles transient failures
Signature mismatchWrong secret or body modificationEnsure you are verifying against the raw request body, not a parsed/re-serialized version