01-13-2023 10:36 AM
Hello,
We are developing a live dashboard for WebEx Contact Center utilizing the Webhooks Subscription API. We noticed a quirk when it comes to Courtesy Callbacks.
Issue #1:
When the Caller calls in and a new TaskID is generated, we receive the "task:new" and "task:parked" Webhooks as expected. What we think is missing in the case of Courtesy Callbacks is another Webhook event (that does not exist currently) that indicates that the Caller requested a Callback. Without an indication that a Callback was requested, we can only treat the TaskID as a "Live" call when it really is not "Live" while it sits in the Queue waiting for an Agent. We do not know it's a Callback until we receive the "task:connect" Webhook with the "direction" and "outboundType" keys set to "OUTBOUND" and "COURTESY_CALLBACK" respectively. The gap between "parked" and "connect" can be 15+ minutes.
A new Webhook type for "Caller hung up, but is waiting for a Callback" would be helpful.
Issue #2:
We noticed a separate issue where we receive several "task:ended" Webhooks if the Caller is not answering their phone (Caller RONA). The Callback TaskID reenters the Queue, but order of the Webhooks received is: "connect" -> "parked" -> "ended". This makes the TaskID appear to be complete, but it's actually still in the Queue waiting for another Agent to attempt to connect to the Caller. This is a easier to handle on our side because we can look at the "terminatingParty" and "reason" keys for "System" and "RONA Timer Expired" respectively. The TaskID isn't truly ended until either: we receive the "capture:available" Webhook (if captures are enabled) or we receive a "task:ended" with "terminatingParty" and "reason" keys of "Agent|Customer" and "<Agent|Customer> Left" respectively.
Sample data below: RowID is simply the order we received the Webhooks and inserted them into a SQLite database. Actual IDs/Numbers redacted for privacy.
Normal Callback:
type | rowid | createdTime | taskID | WebHookID | origin | destination | queueId | direction | outboundType | terminatingParty | reason |
task:new | 23130 | 2022-10-14 21:06:51.000 | TaskID_01 | WebhookID_01 | Caller_Number_01 | CC_Number_01 | NULL | INBOUND | NULL | NULL | NULL |
task:parked | 23154 | 2022-10-14 21:07:08.000 | TaskID_01 | WebhookID_01 | Caller_Number_01 | CC_Number_01 | QueueID_01 | INBOUND | NULL | NULL | NULL |
task:connect | 24628 | 2022-10-14 21:22:54.000 | TaskID_01 | WebhookID_02 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 24629 | 2022-10-14 21:22:54.000 | TaskID_01 | WebhookID_02 | CC_Number_01 | Caller_Number_01 | QueueID_01 | NULL | NULL | NULL | NULL |
task:connected | 24634 | 2022-10-14 21:22:57.000 | TaskID_01 | WebhookID_03 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
task:connected | 24653 | 2022-10-14 21:23:05.000 | TaskID_01 | WebhookID_04 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 24654 | 2022-10-14 21:23:05.000 | TaskID_01 | WebhookID_04 | CC_Number_01 | Caller_Number_01 | QueueID_01 | NULL | NULL | NULL | NULL |
task:ended | 25013 | 2022-10-14 21:28:13.000 | TaskID_01 | WebhookID_05 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | Agent | Agent_Left |
agent:state_change | 25014 | 2022-10-14 21:28:14.000 | TaskID_01 | WebhookID_05 | CC_Number_01 | NULL | QueueID_01 | NULL | NULL | NULL | NULL |
capture:available | 25017 | 2022-10-14 21:28:17.000 | TaskID_01 | WebhookID_06 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
agent:state_change | 25083 | 2022-10-14 21:29:14.000 | TaskID_01 | WebhookID_07 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
Callback with multiple Caller RONAs:
type | rowid | createdTime | taskID | WebHookID | origin | destination | queueId | direction | outboundType | terminatingParty | reason |
task:new | 5584 | 2022-10-14 18:34:03.000 | TaskID_01 | WebhookID_01 | Caller_Number_01 | CC_Number_01 | NULL | INBOUND | NULL | NULL | NULL |
task:parked | 5658 | 2022-10-14 18:34:45.000 | TaskID_01 | WebhookID_01 | Caller_Number_01 | CC_Number_01 | QueueID_01 | INBOUND | NULL | NULL | NULL |
task:connect | 7585 | 2022-10-14 18:49:28.000 | TaskID_01 | WebhookID_02 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 7586 | 2022-10-14 18:49:28.000 | TaskID_01 | WebhookID_02 | CC_Number_01 | Caller_Number_01 | QueueID_01 | NULL | NULL | NULL | NULL |
task:parked | 7613 | 2022-10-14 18:49:44.000 | TaskID_01 | WebhookID_02 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 7614 | 2022-10-14 18:49:44.000 | TaskID_01 | WebhookID_02 | CC_Number_01 | NULL | QueueID_01 | NULL | NULL | NULL | NULL |
task:ended | 7615 | 2022-10-14 18:49:44.000 | TaskID_01 | WebhookID_03 | CC_Number_01 | Caller_Number_01 | NULL | OUTBOUND | COURTESY_CALLBACK | System | RONA_Timer_Expired |
task:connect | 7903 | 2022-10-14 18:52:19.000 | TaskID_01 | WebhookID_04 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 7904 | 2022-10-14 18:52:19.000 | TaskID_01 | WebhookID_04 | CC_Number_01 | Caller_Number_01 | QueueID_01 | NULL | NULL | NULL | NULL |
agent:state_change | 7945 | 2022-10-14 18:52:35.000 | TaskID_01 | WebhookID_04 | CC_Number_01 | NULL | QueueID_01 | NULL | NULL | NULL | NULL |
task:parked | 7946 | 2022-10-14 18:52:35.000 | TaskID_01 | WebhookID_04 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
task:ended | 7947 | 2022-10-14 18:52:35.000 | TaskID_01 | WebhookID_05 | CC_Number_01 | Caller_Number_01 | NULL | OUTBOUND | COURTESY_CALLBACK | System | RONA_Timer_Expired |
task:connect | 7996 | 2022-10-14 18:52:51.000 | TaskID_01 | WebhookID_06 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 7997 | 2022-10-14 18:52:51.000 | TaskID_01 | WebhookID_06 | CC_Number_01 | Caller_Number_01 | QueueID_01 | NULL | NULL | NULL | NULL |
task:parked | 8024 | 2022-10-14 18:53:07.000 | TaskID_01 | WebhookID_06 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 8025 | 2022-10-14 18:53:07.000 | TaskID_01 | WebhookID_06 | CC_Number_01 | NULL | QueueID_01 | NULL | NULL | NULL | NULL |
task:ended | 8026 | 2022-10-14 18:53:07.000 | TaskID_01 | WebhookID_07 | CC_Number_01 | Caller_Number_01 | NULL | OUTBOUND | COURTESY_CALLBACK | System | RONA_Timer_Expired |
task:connect | 8132 | 2022-10-14 18:54:03.000 | TaskID_01 | WebhookID_08 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 8133 | 2022-10-14 18:54:03.000 | TaskID_01 | WebhookID_08 | CC_Number_01 | Caller_Number_01 | QueueID_01 | NULL | NULL | NULL | NULL |
task:parked | 8161 | 2022-10-14 18:54:19.000 | TaskID_01 | WebhookID_08 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
task:ended | 8162 | 2022-10-14 18:54:19.000 | TaskID_01 | WebhookID_09 | CC_Number_01 | Caller_Number_01 | NULL | OUTBOUND | COURTESY_CALLBACK | System | RONA_Timer_Expired |
agent:state_change | 8163 | 2022-10-14 18:54:19.000 | TaskID_01 | WebhookID_08 | CC_Number_01 | NULL | QueueID_01 | NULL | NULL | NULL | NULL |
task:connect | 8219 | 2022-10-14 18:54:47.000 | TaskID_01 | WebhookID_10 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 8220 | 2022-10-14 18:54:47.000 | TaskID_01 | WebhookID_10 | CC_Number_01 | Caller_Number_01 | QueueID_01 | NULL | NULL | NULL | NULL |
task:connected | 8224 | 2022-10-14 18:54:49.000 | TaskID_01 | WebhookID_11 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
task:connected | 8240 | 2022-10-14 18:55:05.000 | TaskID_01 | WebhookID_12 | CC_Number_01 | Caller_Number_01 | QueueID_01 | OUTBOUND | COURTESY_CALLBACK | NULL | NULL |
agent:state_change | 8241 | 2022-10-14 18:55:05.000 | TaskID_01 | WebhookID_12 | CC_Number_01 | Caller_Number_01 | QueueID_01 | NULL | NULL | NULL | NULL |
agent:state_change | 8331 | 2022-10-14 18:56:03.000 | TaskID_01 | WebhookID_13 | CC_Number_01 | NULL | QueueID_01 | NULL | NULL | NULL | NULL |
agent:state_change | 8339 | 2022-10-14 18:56:05.000 | TaskID_01 | WebhookID_14 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
task:ended | 8568 | 2022-10-14 18:58:02.000 | TaskID_01 | WebhookID_15 | CC_Number_01 | Caller_Number_01 | NULL | OUTBOUND | COURTESY_CALLBACK | Customer | Customer_Left |
capture:available | 8569 | 2022-10-14 18:58:03.000 | TaskID_01 | WebhookID_16 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
Solved! Go to Solution.
01-17-2023 02:59 PM
Hello BlakeR,
Issue - 1)
For courtesy callback The webhook events will follow the below sequence.
Line 16: type: 'task:new',
Line 37: type: 'task:parked',
Line 58: type: 'task:connect',
Line 78: type: 'task:connected',
Line 120: type: 'task:ended',
// There will not be any event between parked and connect because the call is still active in the system even though the caller left.
The same architecture is followed on the analyzer as well. the task shows 'parked' in the analyzer while caller is waiting for callback.
For issue 2)
I do see an ended event is sent when the agent is going RONA, Below is the sequence.
Line 16: type: 'task:new',
Line 37: type: 'task:parked',
Line 58: type: 'task:connect',
Line 79: type: 'task:parked',
Line 101: type: 'task:ended',
Line 122: type: 'task:connect',
Line 142: type: 'task:connected',
Line 162: type: 'task:connected',
Line 184: type: 'task:ended',
// We should not be sending ended event when agent goes to RONA, we will open a bug for the same.
01-17-2023 02:59 PM
Hello BlakeR,
Issue - 1)
For courtesy callback The webhook events will follow the below sequence.
Line 16: type: 'task:new',
Line 37: type: 'task:parked',
Line 58: type: 'task:connect',
Line 78: type: 'task:connected',
Line 120: type: 'task:ended',
// There will not be any event between parked and connect because the call is still active in the system even though the caller left.
The same architecture is followed on the analyzer as well. the task shows 'parked' in the analyzer while caller is waiting for callback.
For issue 2)
I do see an ended event is sent when the agent is going RONA, Below is the sequence.
Line 16: type: 'task:new',
Line 37: type: 'task:parked',
Line 58: type: 'task:connect',
Line 79: type: 'task:parked',
Line 101: type: 'task:ended',
Line 122: type: 'task:connect',
Line 142: type: 'task:connected',
Line 162: type: 'task:connected',
Line 184: type: 'task:ended',
// We should not be sending ended event when agent goes to RONA, we will open a bug for the same.
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide