v1.0 - Reporting
To add to this section:
Reporting APIs
Data you should expect to see (by API)
How to interpret your data
Introduction
Reporting in OCM takes a couple of primary forms. Whilst there are some limited campaign metrics available in the “Campaigns” interface, we have designed the dialler to output data streams at certain points in time. This data is available as automated reporting output being pushed from our system to yours. This section covers the in-built UI metrics, as well as the exported data options.
UI Metrics
As mentioned in the “Campaigns” section of this document, there are two primary metrics which we report on - Records Available now (1) and Total Available Records (2).
These metrics are only available in the Campaigns interface.
Below is a definition of each metric:
Records Available Now:
A metric displaying all records available right now to dial. Records included in this metric conform to the following logic
If a campaign is subject to an event closure, this metric will show 0 records
Operating hours will not affect the number of records available now
Records excluded by zoneset dialling times will not appear in this metric
Any record available right now (ie, the recall or callback time has passed), whilst conforming to the above rules, will appear in this metric
Records filtered out via a filter statement will not appear in this metric
Records inserted with an orphaned zone (ie, a zone not assigned to the campaign zoneset) will not appear in this metric
Total Active Records:
A count of the total records in a campaign list with a status of “Active”.
Event closures, Operating Hours, and zoneset dialling times will not affect this metric
Filtered records will be included in this metric
Orphaned zones will be included in this metric
Use Cases
The purpose of these real time metrics is to provide Dialler Admins/Analysts the most important insights they will need to be able to make decisions for the dialler. For example:
A dialler analyst wants to know how many records they would have if they started a campaign early (ie, changed operating hours)
Use Records Available Now
A dialler analyst wants to understand the workload now, subject to zones and filters
Use Records Available Now
A dialler analyst wants to check the import status of records for orphaned zone records
Use Records Available Now in conjunction with reporting available via your lead source
A dialler analyst needs to understand whether or not it’s a good time to recycle records, due to record depletion
Use Records Available Now in conjunction with Total Active records to check what the potential workload addition could be
A dialler analyst needs a quick view of records in the system but not available now
Use Records Available Now in conjunction with Total Active records to check what the potential workload addition could be
The included real time metrics will provide useful tactical data inputs for the management of your dialler, however they will not provide more in depth analysis capabilities (for example, attempt rates, conversion rates, connect rate analysis, best time to dial etc). Instead, OCM provides detailed data outputs, by record, for each attempt which is made in a campaign. We also provide data on the changes to campaign configuration and record updates.
Exported Data
VoiceFoundry will automatically export data from the dialler in certain circumstances, which can be ingested by a receiving system (ie, data warehouse, distributed streaming platform, reporting system etc). The metrics and data points you can obtain from the data are listed below:
Note: Fields which are coloured denote that the field belongs to an object in the data returning from the dialler.
Record Attempt Data
At the conclusion of each attempt, for every record which is dialled, an output is generated in real time. This output contains important information about the specified attempt. The data points exported are listed and described below:
Field Name | Data Type | Description |
---|---|---|
crmId | String | The customers crmId (e.g. Salesforce Id) |
recordId | String | The unique record Id generated by the dialler for this record |
externalRecordId | NULL/String | The external unique Id (if required). If supplied must be unique within the dialler records. |
campaignName | String | Name of the campaign as assigned by the dialler admin |
campaignId | String | Unique Id of the campaign generated by the dialler |
attemptsSequence | Integer | Dial attempts sequence number. This increments with each actual dial attempt |
attemptsRemaining | Integer | A point in time indication of attempts remaining. This can be changed by record updates |
active | Boolean | A flag indicating that this record is still active (available for dialling) or is inactive |
initiatedTime | String | An ISO datetime string indicating the start time of the event |
previewTime | NULL/String | For preview calls, an ISO datetime string representing the time the record was presented to the agent to preview |
callPlacedTime | NULL/String | An ISO datetime string indicating the time that the call was places by the system, to the record |
callAnsweredTime | NULL/String | An ISO datetime string indicating the time that the call was answered by the customer |
callDisconnectedTime | NULL/String | An ISO datetime string indicating the time that the call was disconnected by the customer |
completedTime | String | An ISO datetime string indicating the time the record was completed by the agent (including ACW time) |
skipped | NULL/Boolean | For preview calls, inidicates whether the record was skipped |
skippedById | NULL/String | For preview calls, when the record is skipped, the agent Id that skipped the call |
skippedByName | NULL/String | For preview calls, when the record is skipped, the agent name skipped the call |
skippedDateTime | NULL/String | For preview calls, when the record is skipped, an ISO datetime string of the datetime that the agent skipped the call |
disconnectedReason | NULL/String | A string indication for the reason the call was disconnected |
detectedFlag | NULL/Boolean | A boolean flag indicating the status of detection for the call. A TRUE value indicates the dialler detected a non-live customer cause code, which prevents the call from reaching the agent |
carrierResponse | NULL/String | If available, indicates the carrier response SIP code |
recordDisposition | Object | A number of dimensions sit below this object, describing various parts of the disposition. These dimensions are as per below (in dot notation) |
recordDisposition.properties.source | String | An indicator of the source of the disposition, system or agent |
recordDisposition.properties.type | String | The type of the disposition (e.g. callback, recall, complete etc) |
recordDisposition.properties.timestamp | String | An ISO datetime string indicating the time the call was dispositioned. |
recordDisposition.properties.values | String | An array of strings indicating the selected dispositions |
callback | Object | An object containing dimensions which describe callback information applied to the record (not recall). The dimensions are as per below (in dot notation) |
callback.properties.callbackType | String | The type of the scheduled callback, for a specific agent or for a queue. |
callback.properties.callbackTime | String | An ISO datetime string for when the callback should be made. |
callback.properties.callbackAgentId | String | The agent Id for an agent scheduled callback |
agent | Object | An object containing dimensions which describe the agent involved in the interaction being reported. The dimensions are as per below (in dot notation) |
agent.properties.id | String | The agent ID from Amazon Connect |
agent.properties.name | String | The agent’s name, in 'Lastname, Firstname' format |
recallDateTime | String | If a recall has been set, an ISO datetime string indicating when the record becomes available for dialling |
contactId | String | When an actual call has been placed, this is the contact Id from Amazon Connect |
dialMode | String | The dialling mode of the campaign used (ie, Preview, Progressive, Predictive, Power) |
outboundCli | String | When an actual call has been placed, this is the number presented as outbound CLI for the call |
numberDialled | String | When an actual call has been placed, this is the number dialled |
attemptPreservationFlag | Boolean | Indicates the status of the Attempt Preservation feature for the attempt. This is an optional value used for imported records |
customFields | Object | An object that contains key value pairs for all custom attributes used by the campaign to dial the record. |
customFields.properties.fieldname1 | * | The first field name as applied to the campaign schema for the record (variable dependent on configuration) |
customFields.properties.fieldnameN | * | The first field name as applied to the campaign schema for the record (variable dependent on configuration) |
Campaign Configuration Changes
An export is also provided every time a campaign has had a change applied to it. These are not metrics, they are more a point in time export of current campaign configuration settings. As they are generated every time a campaign is changed, you can store these data points every time it is generated, and create your own change audit log. Dimensions and data exported are as follows:
Field Name | Data Type | Description |
---|---|---|
type | String | Describes the type of change made to the campaign (ie, Insert/Update) |
configItemType | String | Describes the configuration type which has been chanegd (ie, Campaign) |
modifiedBy | String | The entity who made the change to the campaign (ie configured user, API) |
modifiedTime | String | ISO date/time string representing the time and date the change was made |
data | Object | An object containing dimensions to all campaign fields, which describes the current state (ie, post the change) |
data.operatingHourId | String | The VF internal ID for the campaign’s operating hours |
data.sqlSortStatement | String | The sorting statement applied to the campaign |
data.maxAttempts | Integer | The max attempts for the campaign |
data.filterStatement | String | The filter statement applied to the campaign |
data.schema | Object | An object referring to the campaign’s currently assigned schema fields |
data.schema.masterFieldId (for every field) | String | The instance level schema field ID applied to the campaign |
data.schema.isMandatory (for every field) | Boolean | The boolean flag describing the mandatory state configuration for this field |
data.schema.Id (for every field) | String | The VF internal campaign specific schema ID |
data.sqlFilterStatement | String | The SQL Filter statement applied to the campaign |
data.status | String | The status of the campaign (ie, Active, Paused, Stopped) |
data.sortFields | Object | An object with dimensions describing the sort fields applied to the campaign |
data.sortFields.masterFieldId (for every field) | String | The instance level schema field ID being sorted on |
data.sortFields.id (for every field) | String | The campaign specific ID applied to the field |
data.sortFields.orderNumber (for every field) | Integer | The order of the field within the sort list |
data.sortFields.sortDirection (for every field) | String | The direction for sorting for the field within the object |
data.name | String | The name of the campaign |
data.displayFieldsMapping | Object | An object containing dimensions which describe the agent display field information |
data.displayFieldsMapping.id (for every field) | String | The campaign specific ID applied to the field |
data.displayFieldsMapping.orderNumber (for every field) | Integer | The order number of the field in the Agent Interface list |
data.displayFieldsMapping.masterFieldId (for every field) | String | The instance level schema field ID being displayed to the agent |
data.displayFieldsMapping.displayName (for every field) | String | The display name applied to the schema field |
data.dialMode | String | The campaign’s dial mode |
data.isActive | Boolean | The campaign’s active status |
data.zoneMappingId | String | The ID of the zone group applied to the campaign |
data.outboundCli | String | The default outbound CLI applied to the campaign |
data.dispositionGroupId | String | The disposition group ID applied to the campaign |
data.description | String | The campaign’s assigned description field |
data.id | String | The campaign’s internal VF ID |
Record Updates
Whenever a record is updated or changed via the API or SQS methods, a data payload is generated and available for consumption. This export describes the current value of fields, after the change has occurred. This can be used (in conjunction with the original record information you uploaded) to track any changes to records. The data provided in this payload is as follows:
Field Name | Data Type | Description |
---|---|---|
properties.type | String | |
properties.modifiedBy | String | Description of who or what modified the record |
properties.timeModified | String | An ISO date/timestamp reflecting the time and date the record was modified |
properties.status | String | An indicator of the record update status (ie, success or failed) |
properties.data | Object | An object describing all of the record data points, post the change |
properties.data.recordId | String | The internal VF record ID |
properties.data.campaignId | String | The internal VF campaign ID which the record belongs to |
properties.data.systemFields (n) | Various | The current value of the system fields (ie, crmId, attemptPreservationFlag, phoneNumber, zone etc). All fields will be separately listed |
properties.data.active | Boolean | The current active state of the record |
properties.data.customFields (n) | Various | The current value of the custom fields (ie, custom schema fields you have applied to the record). All fields will be separately listed |
Conclusion
The exported data described in this section allows you to build detailed reporting and audit trails in your own reporting and data warehousing solutions.