Ring Groups webhooks - missed calls and unanswered failover
Premium Ring Group webhooks notify you when a call starts, is answered, is missed, is abandoned, or ends. If nobody answers, Crazytel sends ring_group.missed, then ring_group.completed with failover status.
Where to set it up
- Go to Premium Features > Ring Groups and open the group you want to edit.
- Open the Alerts & Webhooks tab.
- In the HTTP Webhooks card, turn Send call webhooks on.
- Enter your address in Webhook URL. It must start with
https://. - Optional: enter a Signing secret (up to 64 characters).
- Click Save Alerts & Webhooks.
Click Webhook Docs on the same tab for example messages. Turning webhooks off also stops transcription and Call Insights events.
Events you will receive
All of these events are sent when webhooks are on. You cannot switch individual events off.
| Event | When it is sent |
|---|---|
ring_group.started | A call has reached the Ring Group. |
ring_group.answered | A team member answered (and pressed 1, if that is required) and was connected to the caller. |
ring_group.missed | The group rang and nobody answered. The call is now going to your no-answer destination. |
ring_group.abandoned | The caller hung up before anyone answered and before no-answer routing started. |
ring_group.completed | The call ended. Status is answered if a member took it, or failover if nobody answered. |
ring_group.transcription_completed | The call transcript is ready (only if transcription is turned on). |
ring_group.insights_completed | Call Insights are ready (only if Insights are turned on). |
What happens when nobody answers
An unanswered call that rang your team sends three messages, in this order:
ring_group.startedring_group.missedring_group.completedwith statusfailoverwhen the call ends
After-hours or holiday routing (nothing rings) sends started then completed with status failover. There is no missed event in that case.
If the caller hangs up while members are ringing, you get started then abandoned. A hang-up after no-answer routing has already started (for example while leaving a voicemail) is not abandoned. That call still uses missed and completed with status failover.
missed and abandoned are never both sent for the same call. Do not treat status failover as answered. Talk time is empty on those completed events.
Sending to a chat app
If your URL is a Slack, Discord, Microsoft Teams or Google Chat incoming webhook address, Crazytel sends a short, easy-to-read message instead of the full JSON. Start with a chat URL if you only want alerts. Switch to your own HTTPS address when you want to automate.
Example: nobody answered
{
"event": "ring_group.missed",
"occurred_at": "2026-10-06T05:41:35Z",
"account_code": "295327",
"caller_id": "61411222333",
"original_did": "61299998888",
"ring_group": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Sales",
"route_token": "rg_c75ed0c15973"
},
"call": {
"uuid": "9f1e77a2-6a1b-4c33-b0f1-2b1c0a44e881",
"route_token": "rg_c75ed0c15973",
"status": "missed",
"caller_id": "61411222333",
"original_did": "61299998888",
"started_at": "2026-10-06T05:41:05Z",
"ring_duration_sec": 30
}
}
Example: the unanswered call ended
{
"event": "ring_group.completed",
"occurred_at": "2026-10-06T05:41:53Z",
"account_code": "295327",
"caller_id": "61411222333",
"original_did": "61299998888",
"ring_group": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Sales",
"route_token": "rg_c75ed0c15973"
},
"call": {
"uuid": "9f1e77a2-6a1b-4c33-b0f1-2b1c0a44e881",
"route_token": "rg_c75ed0c15973",
"status": "failover",
"caller_id": "61411222333",
"original_did": "61299998888",
"started_at": "2026-10-06T05:41:05Z",
"ring_duration_sec": 30,
"talk_duration_sec": null,
"total_duration_sec": 48
}
}
| Field | What it means |
|---|---|
call.uuid | A unique ID for the call. The same ID is used on every event for that call. |
call.status | ringing, answered, missed, failover or abandoned. |
call.ring_duration_sec | How long the group rang before answer, miss or abandon. |
call.talk_duration_sec | How long someone talked. Empty (null) when nobody answered. |
call.member_uuid | On ring_group.answered, which member took the call. |
abandon_stage | On ring_group.abandoned, pre_ring (nothing had started ringing yet) or ringing. |
caller_id / original_did | Who called and the number they dialled, when known. Use the top-level value if both are present. |
The missed event does not name your no-answer destination. Open the call in Ring Group call history if you need that detail.
Security
If you set a secret, each request includes:
X-CrazyRingGroup-Signature: <signature>
User-Agent: CrazytelRingGroup/1.0
The Ring Groups signature is plain hexadecimal, without the sha256= prefix used by some other features. See Verifying webhook signatures.
Delivery and retries
- Your server should reply with a
2xxstatus within about 10 seconds. - If it does not, Crazytel tries again after 5 minutes, 15 minutes, 1 hour, 4 hours, then every 12 hours, up to 8 attempts in total.
- Events can arrive out of order after a retry. Use
occurred_atfor order, and ignore duplicates of the same event pluscall.uuid. - In the call history, a call's activity shows Webhook queued and Webhook delivered entries.
Shared delivery rules are in Things every webhook has in common. Setup across features is in Webhooks quick comparison.
Cost
Webhooks are included at no platform charge. SMS alerts on the same group are billed per message segment.
