What A Good Receiver Does
A reliable webhook receiver should:- accept HTTPS
POSTrequests - verify the signature before trusting the payload
- acknowledge quickly
- move slow work to your own background jobs
- handle duplicate deliveries safely
- log enough detail to debug failures later
The Recommended Flow
Receive the request
Accept the raw request body exactly as delivered. Do not parse and reserialize before signature verification.
Verify the signature
Compute the HMAC using your webhook secret and compare it to the signature header.
The Core Event Lifecycle
For many conversation workflows, you will care about three events:conversation.startedconversation.endedconversation.analysis.completed
How to think about them
| Event | Best use |
|---|---|
conversation.started | Start tracking, create live session state, or log that the conversation began |
conversation.ended | Final call outcome, duration, transcript-adjacent data, and end-of-call processing |
conversation.analysis.completed | Goal results, gathered insights, and post-call evaluation data |
Practical rule
If your downstream system needs insight or scoring results, do not stop atconversation.ended. Wait for conversation.analysis.completed.
Minimal Receiver Example
Idempotency And Duplicate Safety
Design your receiver so the same event can be processed safely more than once. Good patterns:- store processed
event_idvalues - make downstream writes idempotent where possible
- avoid side effects before signature verification
- CRM updates
- ticket creation
- billing or usage updates
- task creation
Logging Recommendations
Log enough data to trace failures without leaking secrets. Good fields to log:- event ID
- event type
- account or organization identifier
- delivery timestamp
- verification result
- your internal processing outcome
- raw signing secrets
- full authorization headers
- sensitive payload content unless your compliance rules allow it
Common Implementation Mistakes
Parsing the body before signature verification
Parsing the body before signature verification
Always verify against the raw request body. Re-serializing JSON can change the byte representation and break signature checks.
Doing slow work in the request thread
Doing slow work in the request thread
Do not block the webhook response while you call other systems or run heavy processing. Acknowledge first, then continue in your own queue.
Treating `conversation.ended` as the final analysis event
Treating `conversation.ended` as the final analysis event
conversation.ended tells you the call finished. conversation.analysis.completed is the better event for post-call scoring and insight-driven workflows.Debugging Checklist
- Confirm the webhook subscription is active.
- Confirm the destination URL is reachable from the public internet.
- Confirm you are using the current signing secret.
- Confirm your receiver reads the raw body before parsing.
- Confirm the subscribed event type matches the workflow you are testing.
- Check your own application logs for event ID, verification result, and processing outcome.
Next Steps
Webhooks
Configure webhook subscriptions in the dashboard
Webhook Events
Review payload fields and event types
Integration Testing
Validate your end-to-end event handling
Secrets
Store reusable credentials safely