The Wallboard Realtime feed
The Wallboard realtime feed is optimized for using in wallboards like Geomant Wallboard product.
The schema is split into two major categories, the Now KPIs and the Today KPIs. Both present similar data structures but with different aggregation schemes.
The latest feed schema version is v3
.
Now KPIs
Now KPIs are split into 2 groups, Now Summaries and Now Queues.
Now summaries
The Now summaries schema consist of the following structures:
"nowSummary": {
"availableAgents": 1, // agents available now
"loggedInAgents": 1 // total logged in agents now
}
"nowVoiceSummary": {
"longestWaitTime": "00:00:00", // current longest wait time
"connectedConversations": 0, // current count of conversations connected to an agent
"waitingConversations": 0 // current count of conversations waiting in voice queues
}
"nowChatSummary": {
"longestWaitTime": "00:00:00", // current longest wait time
"connectedConversations": 0, // current count of conversations connected to an agent
"waitingConversations": 0 // current count of conversations waiting in chat queues
}
Now queues
Listed by their unique ID, the Queue specific Now KPIs are presented here.
"queues": {
"jQgXH7P5c9RhHXJ4Fh3dE": {
"queueName": "My queue name", // the name of the queue
"longestWaitTime": "00:00:00", // longest wait time now
"connected": 0, // current count of conversations connected to an agent originating from this queue
"availableAgents": 0, // count of available agents having the attributes required to handle conversations from this queue
"loggedInAgents": 0, // count of logged in agents having the attributes required to handle conversations from this queue
"waiting": 0 // Count of conversations waiting in the queue
}
}
Today KPIs
Similarly to Now KPIs, Today KPIs are also split into Summary and Today Queues.
Today summary
The Today summaries schema contains the following structures:
"todayVoiceSummary": {
"slaPercentage": 0, // the SLA of all the conversations handled today so far
"handledWithinSla": 0, // conversations handled within the SLA target set on the queues
"handledOutOfSla": 0, // conversations handled but not within the SLA target set on the queues
"abandonedWithinSla": 0, // customer disconnected while within the SLA target set on the queues
"avgHandlingTime": "00:00:00", // average task handling time. Avg = Sum of all task handle time / count of tasks
"avgWrapUpTime": "00:00:00", // average task wrap up time. Avg = Sum of all task wrap-up time / count of tasks
"inboundConversationCount": 0, // count of inbound conversation for today so far
"outboundConversationCount": 0, // count of outbound conversation for today so far
"queuedConversationCount": 0, // count of conversation queued for today so far
"totalAbandonedCount": 0, // count of conversations abandoned today so far
"totalHandlingTime": "00:00:00" // the summary of the handling times of all conversations for today so far
}
"todayChatSummary": {
"handledWithinSla": 0, // conversations handled within the SLA target set on the queues
"handledOutOfSla": 0, // conversations handled but not within the SLA target set on the queues
"handledOutboundCount": 0, // count of outbound conversation that got handled today so far
"handledInboundCount": 0, // count of inbound conversation that got handled today so far
"totalHandlingTime": "00:00:00", // the summary of the handling times of all conversations for today so far
"inboundConversationCount": 0, // count of inbound conversation for today so far
"outboundConversationCount": 0 // count of outbound conversation for today so far
}
"todayEmailSummary": {
"handledWithinSla": 0, // conversations handled within the SLA target set on the queues
"handledOutOfSla": 0, // conversations handled but not within the SLA target set on the queues
"handledOutboundCount": 0, // count of outbound conversation that got handled today so far
"handledInboundCount": 0 // count of inbound conversation that got handled today so far
}
"todayExternalTasks": { // tasks launched in lookup against a customer record, with scripting executed and scripting data stored
"count": 0, // number of external tasks handled today so far
"avgHandlingTime": "00:00:00", // average external task handling time for today so far
"totalHandlingTime": "00:00:00" // the total external task handling time for today so far
}
Today queues
Listed by their unique ID, the queue specific KPIs are presented here.
"queues": {
"jQgXH7P5c9RhHXJ4Fh3dE": {
"queueName": "My queue", // the name of the queue
"slaPercentage": 0, // Calculated service level percentage. Formula: (Number of call answered within the SL threshold set on the queue/number of calls offered) * 100.
"handledWithinSla": 0, // conversations handled within the SLA target set on the queue
"handledOutOfSla": 0, // conversations handled but not within the SLA target set on the queue
"abandonedWithinSla": 0, // customer disconnected while within the SLA target set on the queue
"totalAbandonedCount": 0 // the count of all abandoned conversations today so far
}
}
Transform or extend wallboard data feed using JSONata
The existing KPI list can be extended or transformed through JSONata, a lightweight query and transformation language for JSON data, supported by the Buzzeasy realtime feed.
This section of the article will guide you through the process of extending the KPI list with a new calculated KPI.
Construct/get the original data stream url that you plan to transform/extend
- Example:
https://realtime.buzzeasy.com/wallboard/v2/?tenantId=YOUR_TENANT&key=API_KEY
- Example:
Construct your jsonata expression that will transform the data
- Grab the json data that is returned by the original url
- Paste into jsonata editor: https://try.jsonata.org/ (this is only needed to help you debug your jsonata)
- Write your jsonata expression using the editor. Results are visible immediately.
- JSONata official docs: https://docs.jsonata.org/overview.html
Construct the transform url
- Add the /transform at the start of your original url
- Provide your jsonata expression via the jsonata query parameter
- Encode the expression itself before adding to the url: https://www.urlencoder.org/
- Example:
https://realtime.buzzeasy.com/transform/wallboard/v2/?tenantId=YOUR_TENANT&key=API_KEY&jsonata=YOUR_JSONATA
Thats it! You can use the constructed transform url directly as your wallboard data feed.
JSONata expression example (using the transform operator)
While JSONata itself has plenty of features (query expressions, operators and functions) to query and manipulate the data, it has one particular solution which is worth to highlight: the Transform operator.
The main benefit of the transform operator is that it can easily extend the data feed without changing anything on the original data itself.
Below are a few practical examples:
Add static property to nowSummary:
$ ~> | now.nowSummary | { "hello": "World!" } |
Add simple calculated column to nowSummary:
$ ~> | now.nowSummary | { "underUtilization": availableAgents / loggedInAgents } |
Add new column to nowSummary with zero division check, rounding and percentage calculation:
$ ~> | now.nowSummary | { "underutilizationPercentage": $boolean(loggedInAgents) ? $round((availableAgents / loggedInAgents) * 100) : 0 } |
Add the same calculated column to all queues (calculation happens for each queue) under the Now section:
$ ~> | now.queues.* | { "underutilizationPercentage": $boolean(loggedInAgents) ? $round((availableAgents / loggedInAgents) * 100) : 0 } |