With our release launched on January, 18th 2024, we introduced Data Aggregations which are exposed via our OData interface and can be used in your Workforce Management (WFM) software system to calculate the usage of services and plan for future staffing.
The following aggregations have been added:
- UserStatesAggregates
- UserSessionsAggregates
- ServiceSessionsAggregates
Aggregates in your historic data
☝️Please note:
- Data prior to the Nimbus Update in January was not aggregated retroactively.
- The aggregation is done every 15 minutes.
- Both ServiceSession and UserSession both get Static Dimensions aggregations per timeslot (Modality=0) and additionally per modality (i.e. Audio=1, Instant Messaging=2, External Task=3, Email=4). This means that in extreme cases you have 5 records per service, per timeslot and can choose what you need.
In this scenario we expose the aggregated data via the OData Interface which can be loaded and transformed according to the requirements of your Workforce Management System:
Related Information
This article will heavily lean into Data tables described in the Nimbus Reporting Model page.
Furthermore, OData URLs are mentioned with a {{ODataAPI}} placeholder which you need to replace according to your data cluster:
INC Nimbus OData Connector URLs
Switzerland 01 | https://api.ch-01.luware.cloud/v1/odata |
---|---|
Switzerland 02 | https://api.ch-02.luware.cloud/v1/odata |
Germany 01 | https://api.dewe-01.luware.cloud/v1/odata |
Germany 02 | https://api.dewe-02.luware.cloud/v1/odata |
United Kingdom 01 | https://api.ukso-01.luware.cloud/v1/odata |
Australia 01 | https://api.aue-01.luware.cloud/v1/odata |
West Europe 01 | https://api.euwe-01.luware.cloud/v1/odata |
East United States 01 | https://api.use-01.luware.cloud/v1/odata |
✅ Make sure to configure your web proxies to allow access to these domains or whitelist the complete *.luware.cloud domain.
🔎 This page will showcase filtering examples. You can find a description how to filter OData on Odata.org.
User States Aggregates
Returns a list of entries containing aggregated time values per state for a user within an interval of 15 minutes starting at a given date time.
Aggregated User States Example
On January 11th from 14:15 pm to 14:30 pm Agent Nicole Roberts worked with the Contact Center (SumWorkTime) the whole timespan of 15 minutes. She took a break for 4.3 minutes (SumPause) and was ready for taking calls for 10.7 minutes in total (SumReadyTime). She was also in a waiting state for the same amount of time (SumWait). We can conclude that she hasn't taken any call within that time span.
{
"DateFrom": "2024-01-11",
"TimeFrom": "14:15",
"Id": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"Interval": 15,
"UserId": "xxxxxxx-xxxx -xxxx-xxxx-xxxxxxxxxxxxxx",
"UserUpn": "nroberts@yourtenant.com",
"UserDisplayName": "Nicole Roberts",
"UserOrganizationUnitId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"TenantId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
"SumWorkTime": 15.0,
"SumReadyTime": 10.7,
"SumConnectedTime": 0.0,
"SumAcwTime": 0.0,
"SumPause": 4.3,
"SumOffDuty": 0.0,
"SumWait": 10.7
}
The User States Aggregates can be called via the following GET statement:
https://{{ODataAPI}}/v1/odata/UserStatesAggregates
The following parameters can for example be used to filter the data:
Parameter | Description | Example |
---|---|---|
DateFrom | Select the Start Date | 2024-01-15 |
TimeFrom | Select the Start Time (UTC) | 13:15 |
Interval | Select the duration | 15 |
UserId | Select the Office 365 UserId | xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx |
UserUpn | Select the Nimbus User UPN | your.user@yourtenant.com |
Example with filter:
https://{{ODataAPI}}/v1/odata/UserStatesAggregates?$filter=DateFrom gt 2024-01-28 AND DateFrom le 2024-01-29
🔎 You can find a description how to filter OData on Odata.org.
The User States Aggregates will return a list of entries containing the following data:
Field | Description | Formula |
---|---|---|
Id | Generated ID of the Record | |
DateFrom | Date (UTC) of interval (start) in the format YYY-MM-dd | |
TimeFrom | Time (UTC) of the interval (start) in the format hh:mm | |
Interval | Interval duration in minutes | |
UserId | O365 User Id of the Nimbus User | |
UserUpn | UPN of the Nimbus User | |
UserDisplayName | Displayname of the Nimbus User | |
UserOrganizationUnitId | Organization Unit Id of the Nimbus User | |
TenantId | O365 Tenant Id of the Nimbus Tenant | |
SumWorkTime | Expected worktime of the user (not offline and not offDuty) in minutes | SUM(UserStateTime WHERE UserStateType != 1 OR UserStateType != 2) |
SumReadyTime | Time user is either waiting for calls or handling tasks (selectable or ringing or connected or ACW) in minutes | SUM(UserStateTime WHERE UserStateType = 3 OR UserStateType = 5 OR UserStateType = 6 OR UserStateType = 7 OR UserStateType = 10) |
SumConnectedTime | Sum of time in which the user is handling a task in minutes | SUM(UserStateTime WHERE UserStateType = 6) |
SumAcwTime | Sum of ACW/wrap up time in minutes | SUM(UserStateTime WHERE UserStateType = 7) |
SumPause | Sum of time, the user is not working although it is in worktime (Not available / RONA) in minutes | SUM(UserStateTime WHERE UserStateType = 4 OR UserStateType = 9) |
SumOffDuty | Sum of OffDuty time in minutes | SUM(UserStateTime WHERE UserStateType = 2) |
SumWait | Sum of time in which the user has been selectable | SUM(UserStateTime WHERE UserStateType = 3) |
The UserStateType is defined as follows:
Id | Name | Description |
---|---|---|
1 | Offline | User is not signed in |
2 | OffDuty | User has a OffDuty profile selected |
3 | Selectable | The user is selectable for Nimbus |
4 | Not Selectable | The user is not selectable for Nimbus |
5 | Ringing | The call is signalled to the user |
6 | Connected | The user is handling a task |
7 | After Call Work | The user is in After Call Work (ACW) or wrap-up time |
9 | Rona | The user has the state “RONA” |
10 | Dialing Out | An outbound call is being established (Call on behalf/Outbound Call) |
Please refer to the tables in Nimbus Reporting Model
User Sessions Aggregates
Returns a list of entries containing aggregated time values for of all user service sessions within an interval of 15 minutes starting at a given date time.
Aggregated User Sessions Example
On January 11th from 14:15pm to 14:30 pm, Agent Nicole Robert worked with the Contact Center. During these 15 minutes, she accepted 9 calls (CntAccepted). She did not accept 7 calls (CntNotAccepted). She did not transfer (CntTransferred) or did not try to consult a colleague (CntConsulted). Her overall connection time has been 283 seconds (SumConnectedTime). The average connected time per call was 31,4 seconds (AvgConnectedTime). After Call Work time was not configured for Nicole Roberts.
{
"DateFrom": "2024-01-11",
"TimeFrom": "14:15",
"Id": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"Interval": 15,
"ServiceName": "Demo Service",
"ServiceUpn": "demo.service@yourtenant.com",
"ServiceId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"TenantId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"ServiceOrganizationUnitId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"OrganizationUnitId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"Modality": 1,
"UserId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"UserUpn": "nroberts@yourtenant.com",
"UserDisplayName": "Nicole Roberts",
"UserOrganizationUnitId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"CntAccepted": 9,
"CntNotAccepted": 7,
"CntTransferred": 0,
"CntConsulted": 0,
"AcceptanceRate": 0.562,
"TransferredRate": 0.0,
"ConsultedRate": 0.0,
"SumConnectedTime": 283.0,
"SumAcwTime": 0.0,
"AvgConnectedTime": 31.4,
"AvgAcwTime": 0.0
}
The User Sessions Aggregation can be called via the following GET statement:
https://{{ODataAPI}}/v1/odata/UserSessionsAggregates
The following parameters can for example be used to filter the data:
Parameter | Description | Example |
---|---|---|
DateFrom | Select the Start Date | 2024-01-15 |
TimeFrom | Select the Start Time (UTC) | 13:15 |
Interval | Select the duration | 15 |
ServiceId | Select the Nimbus Service Id | xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx |
ServiceUpn | Selected Nimbus Service UPN | your.service@yourtenant.com |
UserId | Select the Office 365 UserId | xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx |
UserUpn | Select the Nimbus User UPN | your.user@yourtenant.com |
Modality | Select the modality | 1 (Audio), 0 (All modalities) |
Example with filter:
https://{{ODataAPI}}/v1/odata/UserSessionsAggregates?$filter=DateFrom gt 2024-01-20 AND DateFrom le 2024-01-29 AND UserUpn eq 'your.user@yourtenant.com' AND Modality eq 1
🔎 You can find a description how to filter OData on Odata.org.
The UserServicesAggregation returns a list with entries containing the following values:
Field | Description | Formula |
---|---|---|
Id | Generated ID of the Record | |
DateFrom | Date (UTC) of interval (start) in the format YYY-MM-dd | |
TimeFrom | Time (UTC) of the interval (start) in the format hh:mm | |
Interval | Interval duration in minutes | |
Service Name | Displayname of the Nimbus Service | |
Service UPN | UPN of the Nimbus Service | |
Service Id | Internal ID of the Nimbus Service | |
TenantId | O365 Tenant Id of the Nimbus Tenant | |
Service OrganizationUnitId | Id of the Service Organization Unit | |
OrganizationUnitId | Id of the Parent Organization Unit of the Service | |
Modality | Id of the ModalityType; 0 = All Modalities combined | |
User Id | O365 User Id of the Nimbus User | |
User UPN | UPN of the Nimbus User | |
User Displayname | Displayname of the Nimbus User | |
User OrganizationUnitId | Organization Unit Id of the Nimbus User | |
CntAccepted |
Count of all UserSessions which have been accepted by the user. The following user session outcomes apply:
|
Count(Accepted) |
CntNotAccepted |
Count of all UserSessions which have not been accepted by the user after being offered. This means the following user session outcome apply: · Declined · Ignored · Cancelled · Outbound Not Accepted (If the user accepted, but the customer/target didn’t count it as Accepted) |
Count(NotAccepted) |
CntTransferred |
Count of UserSessions which have been accepted and then transferred by the user. This means the following user session outcomes apply: · Transferred Internally · Transferred Externally |
Count(Transferred) |
CntConsulted |
Count of UserSessions which have been accepted and then needed consultation by the user. This means the following user session outcomes apply: · Consulted Transferred · Consulted Merged |
Count(Consulted) |
AcceptanceRate | Rate of all accepted user session compared to all user sessions in % (1.0 = 100%) | CntAccepted/TotalUserSessions |
TransferredRate | Rate of all transferred user session compared to all accepted user sessions in % (1.0 = 100%) | CntTransferred/CntAccepted |
ConsultedRate | Rate of all consultated user session compared to all accepted user sessions in % (1.0 = 100%) | CntConsulted/CntAccepted |
ConnectedTime | Sum of all connected times for all user sessions in the interval in sec |
SUM(ConnectedTime)
|
SumACWTime | Sum of all acw times for all user sessions (incl. ExtendedACW if used) in the interval in sec | SUM(ACWTime) |
AvgConnectedTime | Average connected time for all user sessions in the interval being connected in sec |
SUM(ConnectedTime)/SUM(UserSessions WHERE ConnectedTime > 0)
|
AvgACWTime | Average ACW / wrapup time for all user session (incl. ExtendedACW if used) in the interval in sec | SUM(ACWTime)/SUM(UserSessions WHERE ACWTime > 0) |
Service Sessions Aggregates
Returns a list of aggregated data entries about service SLA's Counts, Sums, Averages and Maximums for a given modality on all tasks within an interval of 15 minutes starting at a given date time.
Aggregated Service Session Example
This dataset returns metrics on all calls (Modality=1) that went through a service called Demo Service on January the 11th from 15:00 pm to 15:15 pm.
We see that calls were queued for 1782 seconds (SumQueueTime) and the sum of ACW time is 0 (SumAcwTime), maybe ACW is not enabled for this service. The longest call took 49 seconds to handle (MaxHandlingTime). 44 times an agent has been involved in call handling (CntUsersInvolved). 44 Sessions (CntSessionsQueued) have been queued. All accepted calls together have been queued for 889 seconds (SumQueueTimeAccepted).
{
"DateFrom": "2024-01-11",
"TimeFrom": "15:00",
"Id": "70933980.01dcb441-8b28-4f8e-8a82-a62659c83d7f.1",
"Interval": 15,
"ServiceName": "Demo Service",
"ServiceUpn": "demo.service@yourtenant.com",
"ServiceId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"TenantId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"ServiceOrganizationUnitId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"OrganizationUnitId": "xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx",
"Modality": 1,
"AcceptanceSla": 1.0,
"HangupSla": 1.0,
"Reachability": 0.614,
"AvgQueueTimeAccepted": 32.9,
"AvgQueueTimeAbandoned": 26.5,
"AvgQueueTime": 40.5,
"AvgHandlingTime": 31.6,
"AvgAcwTime": 0.0,
"CntSessionsAbandoned": 2,
"CntSessionHangupByCustomerBeforeSla": 2,
"CntSessionHangupByCustomerShort": 0,
"CntUsersInvolved": 44,
"CntSessionsQueued": 44,
"CntSessionsAccepted": 27,
"CntSessionsAcceptedInSla": 27,
"CntOverflowSessionsIn": 0,
"CntOverflowSessionsOut": 0,
"SumQueueTimeAccepted": 889.0,
"SumQueueTimeAbandoned": 53.0,
"SumQueueTime": 1782.0,
"SumHandlingTime": 853.0,
"SumAcwTime": 0.0,
"MaxQueueTimeAccepted": 45.0,
"MaxQueueTimeAbandoned": 36.0,
"MaxHandlingTime": 49.0,
"MaxAcwTime": 0.0
}
The Service Sessions Aggregates can be called via the following GET statement:
https://{{ODataAPI}}/v1/odata/ServiceSessionsAggregates
The following parameters can for example be used to filter the data:
Parameter | Description | Example |
---|---|---|
DateFrom | Select the Start Date | 2024-01-15 |
TimeFrom | Select the Start Time (UTC) | 13:15 |
Interval | Select the duration | 15 |
ServiceId | Select the Nimbus Service Id | xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx |
ServiceUpn | Selected Nimbus Service UPN | your.service@yourtenant.com |
UserId | Select the Office 365 UserId | xxxxxxxx.xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx |
UserUpn | Select the Nimbus User UPN | your.user@yourtenant.com |
Modality | Select the modality | 1 (Audio), 0 (All modalities) |
Example with filters:
https://{{ODataAPI}}/v1/odata/ServiceSessionsAggregates?$filter=DateFrom gt 2024-01-20 AND DateFrom le 2024-01-29 AND ServiceUpn eq 'MyExample@nimbus-service.de' AND Modality eq 1
🔎 You can find a description how to filter OData on Odata.org.
The UserServicesAggregation returns a list with entries containing the following values:
Field | Description | Formula |
---|---|---|
Id | Generated ID of the Record | |
DateFrom | Date (UTC) of interval (start) in the format YYY-MM-dd | |
TimeFrom | Time (UTC) of the interval (start) in the format hh:mm | |
Interval | Interval duration in minutes | |
ServiceName | Displayname of the Nimbus Service | |
ServiceUpn | UPN of the Nimbus Service | |
ServiceId | Internal ID of the Nimbus Service | |
TenantId | O365 Tenant Id of the Nimbus Tenant | |
Service OrganizationUnitId | Id of the Service Organization Unit | |
OrganizationUnitId | Id of the Parent Organization Unit of the Service | |
Modality | Id of the ModalityType; 0 = All Modalities combined | |
AcceptanceSLA | Service Level in % (1.0 = 100%) for all Accepted (by user) Service Sessions in the interval | CntSessionsAcceptedInSla/CntSessionsAccepted |
HangupSLA | Service Level in % (1.0 = 100%) for all HangupByCustomerBeforeSla Services Sessions in the interval | CntSessionsHangupByCustomerBeforeSla/CntSessionsHangupInQueue |
Reachability | Reachability in % (1.0 = 100%) | CntSessionsAccepted/CntSessionsQueued |
AvgQueueTimeAccepted | Average QueueTime of Sessions having been accepted (see for definition of accepted under CntSessionsAccepted) in sec | SumQueueTimeAccepted/CntSessionsAccepted |
AvgQueueTimeAbandoned | Average QueueTime of Sessions having been abandoned (see for definition of abandoned under CntSessionsAbandoned) in sec | SumQueueTimeAbandoned/CntSessionsAbandoned |
AvgQueueTime | Average QueueTime of Sessions in sec | SumQueueTime /CntSessionsQueued |
AvgHandlingTime | Average of HandlingTime (ConnectedTime of Session) of all sessions accepted by user in sec | SumHandlingTime/(CntSessionsConnectedTime > 0) |
AvgAcwTime | Average of ACWTime in sec | SumAcwTime/(CntSessionsACWTime > 0) |
CntSessionsAbandoned |
Abandoned Sessions are sessions, where inbound call or IM outcome was: · WorkflowDisconnectedAfterQueue · CustomerHangupInQueue · CustomerHangupInIvrAfterQueue · Session was Queued AND WorkflowConversationRecorded · WorkflowInternalTransfer (Failed or Successful) · WorfklowExternalTransfer (Failed or Successful)
where outbound call (incl. CallOnBehalf) outcome was: · LostInQueue
where the external task outcome was: · ExternalSystemCancelledInQueue · ExternalSystemCancelledAfterQueue · WorkflowDisconnectAfterQueue · Session was Queued AND WorkflowInternalTransfer (Failed or Successful) · WorfklowExternalTransfer (Failed or Successful)
where the email session outcome was: · WorkflowDiscconectAfterQueue · Session was Queued AND WorkflowInternalTransfer (Failed or Successful) · WorfklowExternalTransfer (Failed or Successful) |
see Description |
CntSessionsHangupByCustomerBeforeSLA | Sessions with outcome CustomerHangupInQueue within HangUpSla-Threshold | COUNT(SessionOutcome = CustomerHangupInQueue AND QueueTime < SLA Hangup Time Threshold) |
CntSessionsHangupByCustomerShort | Sessions with outcome CustomerHangupInQueue within ShortAbandonds -Threshold | COUNT(SessionOutcome = CustomerHangupInQueue AND QueueTime < IsShortAbandonThreshold) |
CntUsersInvolved | Count of all user sessions related to the service session in the interval | COUNT(UserSessions) |
CntSessionsQueued | Every Session where the QueueTime is > 0 | COUNT(QueueTime > 0) |
CntSessionsAccepted |
Accepted Session are sessions, where inbound call or IM outcome was: · UserAccepted · UserInternalTransfer (Failed or Successful) · UserExternalTransfer (Failed or Successful) · UserConferenced Where outbound call (incl Call on Behalf) was: · UserAccepted · UserInternalTransfer (Failed or Successful) · (Future) UserExternalTransfer (Failed or Successful) · (Future) · (Future) Where External Task outcome was: · UserAccepted · UserInternalTransfer (Failed or Successful) · (Future) · (Future) Where Email outcome was: · UserAccepted · UserMarkedAsHandled · UserInternalTransfer (Failed or Successful) · (Future) |
|
CntSessionsAcceptedInSla | Accepted Sessions which where accepted within the define SLA Acceptance Time |
COUNT(SessionsAccepted AND QueueTime < SLA Acceptance Time)
|
CntOverflowSessionsIn | Count of Sessions which came in as transfer on the service in question |
COUNT(SessionsTransferredIn)
|
CntOverflowSessionsOut | Count of Sessions which have been transferred either by WF or by User, Target doesn't matter |
COUNT(SessionTransferred)
|
SumQueueTimeAccepted | Sum of QueueTime of all sessions in the interval which where considered accepted (see CntSessionAccepted for exact definition) in sec |
SUM(QueueTimeAccepted)
|
SumQueueTimeAbandoned | Sum of QueueTime of all sessions in the interval which where considered abandoned (see CntSessionAbandoned for exact definition) in sec |
SUM(QueueTimeAbandoned)
|
SumQueueTime | Sum of QueueTime of all sessions in the interval independent of outcome in sec |
SUM(QueueTime)
|
SumHandlingTime | Sum of all HandlingTime (ConnectedTime of Session) of all sessions accepted by user in sec |
SUM(ConnectedTime > 0)
|
SumAcwTime | Sum of all ACW Times of all sessions within the interval which had ACW in sec |
SUM(AcwTime)
|
MaxQueueTimeAccepted | Longest QueueTime of any session within the interval which was accepted by a User in sec |
MAX(QueueTimeAccepted)
|
MaxQueueTimeAbandoned | Longest QueueTime of any session within the interval which was not accepted by a User in sec |
MAX(QueueTimeAbandoned)
|
MaxHandlingTime | Longest HandlingTime of any session within the interval which was accepted by a User in sec |
MAX(HandlingTime)
|
MaxAcwTime | Longest ACWTime of any session within the interval which was accepted by a User in sec |
MAX(AcwTime)
|