Table of Contents
- Overview
- Architecture
- Key Design Principle
- Client Responsibility
- Supported Destinations
- Event Types
- Data Field Reference
- Analytics Metrics
- Important Notes
Overview
Data Feeder is a publisher/subscriber module within Analytics that enables real-time event streaming to external systems. Version 5.24 introduces structured chat transcript format for Kafka data delivery from the Conversational Analytics (CA) system, improving downstream processing and readability.
The module provides a seamless mechanism to push conversation data and analysis results to your data infrastructure as events occur, eliminating the need for batch processing or periodic polling.
Architecture
Data Feeder consists of two core components that work together to deliver events:
| Component | Description |
|---|---|
| Data Provider | Monitors Analytics processing pipeline and raises events when configurable triggers are activated. Acts as the event publisher in the pub/sub model. |
| Data Connector | Subscribes to events from Data Provider and delivers them to configured destinations. Handles connection management, delivery guarantees, and serialization. |
Key Design Principle: Minimal Data Delivery
Data Feeder is designed around the principle of delivering the smallest possible data payload for each event. This approach optimizes bandwidth, reduces processing overhead, and ensures timely delivery of critical information.
How it works:
-
Initial Event (Metadata): When a call is ingested, the ConversationCreatedForDataFeeder event delivers the complete call details including all metadata fields. This establishes the base record with the externalId as the unique identifier.
-
Subsequent Events: All following events (ConversationAnalyzedForDataFeeder, Category Match, etc.) contain only their specific data plus the externalId reference. They do not duplicate information already sent in the initial event.
-
Data Assembly: The receiving system uses the externalId to correlate events and build/update the complete conversation record progressively.
Client Responsibility: Data Integrity
With the minimal data delivery model, clients are responsible for maintaining data integrity in their destination systems. This includes:
- Implementing event handlers that correctly update/amend records based on incoming events
- Using externalId as the correlation key to link related events
- Handling event ordering and potential out-of-sequence delivery
- Managing idempotency for event reprocessing scenarios
- Designing their data model to support incremental updates
Supported Destinations
Currently Available:
- Apache Kafka
Additional Integrations:
Other data lake and database integrations (Azure Event Hubs, AWS Kinesis, direct database writes, etc.) can be developed subject to Professional Services engagement.
Event Types
Data Provider raises the following configurable events:
1. ConversationCreatedForDataFeeder
Trigger: Raised immediately when a call is received by Analytics
Description: Contains full call details including externalId, timestamps, channel information, participant details, and all associated metadata fields.
Data Structure
{
"timestampOfMessage": "01/22/2026 08:32:04",
"eventType": "ConversationCreatedForDataFeeder",
"payload": {
"Conversation": {
"ConversationId": 22,
"DepartmentId": 3,
"AgentId": "3a1e7c52-15c4-bbbf-76b7-04bcef21c305",
"RatingForCSAT": null,
"RatingForNPS": null,
"StartTime": "2026-01-22T08:31:59.096197Z",
"EndTime": "2026-01-22T08:31:59.096197Z",
"Duration": null,
"ExternalId": "testsss.wav",
"LanguageCode": null,
"AttachedData": [],
"Call": {
"DirectionId": 1285,
"CallerNumber": null,
"CalledNumber": null,
"ReleasingPartyId": 1306,
"HoldCount": 0,
"TotalHoldDuration": null,
"MaxHoldDuration": null
}
},
"TenantId": "3a1e7c51-62d8-95c8-852e-2b5c7b042376"
}
}
Field Reference
| Field Name | Type | Description | Example |
|---|---|---|---|
timestampOfMessage |
String | Event timestamp (MM/DD/YYYY HH:mm:ss) | 01/22/2026 08:32:04 |
eventType |
String | Event type identifier | ConversationCreatedForDataFeeder |
payload.TenantId |
GUID | Tenant unique identifier | 3a1e7c51-62d8-95c8-852e-2b5c7b042376 |
Conversation.ConversationId |
Integer | Unique conversation ID | 22 |
Conversation.DepartmentId |
Integer | Department identifier | 3 |
Conversation.AgentId |
GUID | Agent unique identifier | 3a1e7c52-15c4-bbbf-76b7-04bcef21c305 |
Conversation.RatingForCSAT |
Integer? | Customer satisfaction score | null |
Conversation.RatingForNPS |
Integer? | Net Promoter Score | null |
Conversation.StartTime |
ISO 8601 | Conversation start time (UTC) | 2026-01-22T08:31:59.096197Z |
Conversation.EndTime |
ISO 8601 | Conversation end time (UTC) | 2026-01-22T08:31:59.096197Z |
Conversation.Duration |
Integer? | Duration in seconds | null |
Conversation.ExternalId |
String | External reference ID | testsss.wav |
Conversation.LanguageCode |
String? | Language code (ISO 639-1) | null |
Conversation.AttachedData |
Array | Additional metadata | [] |
Call.DirectionId |
Integer | Call direction identifier | 1285 |
Call.CallerNumber |
String? | Caller phone number | null |
Call.CalledNumber |
String? | Called phone number | null |
Call.ReleasingPartyId |
Integer | Party who ended call | 1306 |
Call.HoldCount |
Integer | Number of holds | 0 |
Call.TotalHoldDuration |
Integer? | Total hold time (seconds) | null |
Call.MaxHoldDuration |
Integer? | Max hold time (seconds) | null |
2. ConversationAnalyzedForDataFeeder
Trigger: Raised when speech analytics processing completes
Description: Contains analysis results (transcription, sentiment, emotions, etc.) with externalId reference to the original conversation.
Data Structure
{
"timestampOfMessage": "01/22/2026 08:32:30",
"eventType": "ConversationAnalyzedForDataFeeder",
"payload": {
"ConversationExternalId": "testsss.wav",
"Transcripts": [
{
"Channel": 1,
"Text": "hello this is mike how can i help you today",
"Times": "0 540;540 780;780 960;960 1200;1200 1440;1440 1680;1680 1920;1920 2160;2160 2400",
"StartTime": 0,
"EndTime": 2400
},
{
"Channel": 2,
"Text": "hi mike i have a problem with my account i cannot log in",
"Times": "2500 2700;2700 2940;2940 3100;3100 3340;3340 3500;3500 3740;3740 3980;3980 4220;4220 4460;4460 4700;4700 4940;4940 5180",
"StartTime": 2500,
"EndTime": 5180
},
{
"Channel": 1,
"Text": "i am sorry to hear that let me check your account can you please provide your email address",
"Times": "5300 5460;5460 5620;5620 5860;5860 6020;6020 6260;6260 6420;6420 6580;6580 6820;6820 7060;7060 7220;7220 7460;7460 7620;7620 7860;7860 8020;8020 8260;8260 8500",
"StartTime": 5300,
"EndTime": 8500
},
{
"Channel": 2,
"Text": "sure it is john dot smith at email dot com",
"Times": "8600 8800;8800 8960;8960 9120;9120 9360;9360 9520;9520 9760;9760 9920;9920 10160;10160 10400",
"StartTime": 8600,
"EndTime": 10400
},
{
"Channel": 1,
"Text": "thank you i found your account it looks like your password was reset yesterday did you request that",
"Times": "10500 10700;10700 10900;10900 11100;11100 11340;11340 11540;11540 11780;11780 11940;11940 12180;12180 12380;12380 12620;12620 12780;12780 13020;13020 13180;13180 13420;13420 13620;13620 13860;13860 14100",
"StartTime": 10500,
"EndTime": 14100
},
{
"Channel": 2,
"Text": "no i did not request a password reset that is strange",
"Times": "14200 14400;14400 14560;14560 14720;14720 14960;14960 15120;15120 15280;15280 15520;15520 15680;15680 15920;15920 16160",
"StartTime": 14200,
"EndTime": 16160
},
{
"Channel": 1,
"Text": "okay no worries i will send you a new password reset link to your email right now",
"Times": "16300 16500;16500 16660;16660 16900;16900 17060;17060 17260;17260 17460;17460 17620;17620 17860;17860 18060;18060 18260;18260 18460;18460 18660;18660 18860;18860 19060",
"StartTime": 16300,
"EndTime": 19060
},
{
"Channel": 2,
"Text": "okay i just received the email let me try to log in now",
"Times": "19200 19400;19400 19560;19560 19760;19760 19960;19960 20120;20120 20360;20360 20520;20520 20720;20720 20920;20920 21120;21120 21360",
"StartTime": 19200,
"EndTime": 21360
},
{
"Channel": 2,
"Text": "yes it works now i can see my dashboard thank you so much",
"Times": "22000 22200;22200 22360;22360 22560;22560 22760;22760 22920;22920 23120;23120 23320;23320 23520;23520 23720;23720 23920;23920 24120",
"StartTime": 22000,
"EndTime": 24120
},
{
"Channel": 1,
"Text": "you are welcome is there anything else i can help you with",
"Times": "24200 24400;24400 24560;24560 24760;24760 24960;24960 25120;25120 25320;25320 25520;25520 25720;25720 25920;25920 26120",
"StartTime": 24200,
"EndTime": 26120
},
{
"Channel": 2,
"Text": "actually yes i also wanted to ask about upgrading my plan to premium",
"Times": "26200 26440;26440 26640;26640 26800;26800 27040;27040 27200;27200 27440;27440 27600;27600 27840;27840 28040;28040 28280;28280 28520",
"StartTime": 26200,
"EndTime": 28520
},
{
"Channel": 1,
"Text": "of course the premium plan includes unlimited storage and priority support it is twenty nine dollars per month would you like me to upgrade your account",
"Times": "28600 28800;28800 29040;29040 29200;29200 29440;29440 29680;29680 29880;29880 30120;30120 30320;30320 30560;30560 30720;30720 30960;30960 31160;31160 31400;31400 31560;31560 31800;31800 32000;32000 32200;32200 32440;32440 32640;32640 32840;32840 33040;33040 33240;33240 33480;33480 33680",
"StartTime": 28600,
"EndTime": 33680
},
{
"Channel": 2,
"Text": "yes please go ahead and upgrade it",
"Times": "33800 34000;34000 34200;34200 34400;34400 34600;34600 34800;34800 35000;35000 35200",
"StartTime": 33800,
"EndTime": 35200
},
{
"Channel": 1,
"Text": "done your account has been upgraded to premium you will receive a confirmation email shortly",
"Times": "35300 35500;35500 35700;35700 35940;35940 36140;36140 36380;36380 36580;36580 36820;36820 37020;37020 37260;37260 37460;37460 37700;37700 37900;37900 38140;38140 38380",
"StartTime": 35300,
"EndTime": 38380
},
{
"Channel": 2,
"Text": "perfect thank you mike you have been very helpful",
"Times": "38500 38700;38700 38940;38940 39140;39140 39380;39380 39580;39580 39780;39780 39980;39980 40220",
"StartTime": 38500,
"EndTime": 40220
},
{
"Channel": 1,
"Text": "thank you for calling have a great day goodbye",
"Times": "40300 40500;40500 40700;40700 40900;40900 41100;41100 41340;41340 41540;41540 41740;41740 41940",
"StartTime": 40300,
"EndTime": 41940
}
],
"AgentTensionRatio": 0,
"AgentMonotonicityRatio": 72,
"CustomerTensionRatio": 8,
"AverageCustomerSentimentScore": 65,
"AverageAgentSentimentScore": 78,
"AiInsights": {
"conversationId": 22,
"externalId": "testsss.wav",
"topic": "account access and plan upgrade",
"summary": "A customer called because they could not log into their account. The agent identified an unexpected password reset, sent a new reset link, and resolved the login issue. The customer then asked about upgrading to the premium plan, and the agent completed the upgrade.",
"actions": "Investigated login issue;Identified unauthorized password reset;Sent new password reset link;Confirmed account access restored;Provided premium plan details;Upgraded account to premium",
"conversationResult": "Login issue resolved and account upgraded to premium",
"NonResolutionRisk": "Low",
" ChurnRisk": "Low"
}
}
}
Field Reference
| Field Name | Type | Description | Example |
|---|---|---|---|
timestampOfMessage |
String | Event timestamp | 01/22/2026 08:32:30 |
eventType |
String | Event type identifier | ConversationAnalyzedForDataFeeder |
payload.ConversationExternalId |
String | Links to ConversationCreated event | testsss.wav |
Transcripts[] |
Array | Conversation transcript segments | [] |
Transcripts[].Channel |
Integer | 1=Agent, 2=Customer | 1 or 2 |
Transcripts[].Text |
String | Spoken text | "hello how can I help..." |
Transcripts[].Times |
String | Word timings: "start end;start end" (milliseconds) | "1700 1740;1900 1940" |
Transcripts[].StartTime |
Integer | Segment start (milliseconds) | 1700 |
Transcripts[].EndTime |
Integer | Segment end (milliseconds) | 13580 |
AgentTensionRatio |
Integer | Agent tension ratio (0-100) | 0 |
AgentMonotonicityRatio |
Integer | Agent monotonicity ratio (0-100) | 87 |
CustomerTensionRatio |
Integer | Customer tension ratio (0-100) | 0 |
AverageCustomerSentimentScore |
Integer | Average customer sentiment score | 0 |
AverageAgentSentimentScore |
Integer | Average agent sentiment score | 0 |
AiInsights |
Object? | AI-generated conversation insights | See AI Insights section |
AI Insights (IConversationAiInsightsDto)
Description: AI-generated insights included in ConversationAnalyzedForDataFeeder when available.
Data Structure
"AiInsights": {
"conversationId": 22,
"externalId": "testsss.wav",
"topic": "account access and plan upgrade",
"summary": "A customer called because they could not log into their account. The agent identified an unexpected password reset, sent a new reset link, and resolved the login issue. The customer then asked about upgrading to the premium plan, and the agent completed the upgrade.",
"actions": "Investigated login issue;Identified unauthorized password reset;Sent new password reset link;Confirmed account access restored;Provided premium plan details;Upgraded account to premium",
"conversationResult": "Login issue resolved and account upgraded to premium",
"NonResolutionRisk": "Low",
"ChurnRisk": "Low"
}
Field Reference
| Field Name | Type | Description | Example |
|---|---|---|---|
conversationId |
Integer | Unique conversation identifier | 363315 |
externalId |
GUID | External conversation identifier | cbf1c1ca-d869-18a9-aa73-3a1ad5baad43 |
topic |
String | Main topic of conversation | cell phone plans |
summary |
String | AI-generated conversation summary | A customer inquired about... |
actions |
String | Actions taken during conversation (semicolon-separated) | Provided plan details;Confirmed pricing... |
conversationResult |
String | Outcome of conversation | Customer interested in new plan |
NonResolutionRisk |
String | Risk level for non-resolution | Low |
ChurnRisk |
String | Customer churn risk level | Low |
Analytics Metrics Reference
| Metric | Range | Description |
|---|---|---|
AgentTensionRatio |
0-100 | Ratio of agent's tense speech duration to total agent speech duration |
AgentMonotonicityRatio |
0-100 | Ratio of agent's monotone speech duration to total agent speech duration |
CustomerTensionRatio |
0-100 | Ratio of customer's tense speech duration to total customer speech duration |
AverageCustomerSentimentScore |
Integer | Average sentiment score across customer speech segments |
AverageAgentSentimentScore |
Integer | Average sentiment score across agent speech segments |
Important Notes
Data Types
- "?" suffix indicates nullable fields (e.g.,
Integer?means the field can be null) - GUID Format: Standard UUID format (e.g.,
3a1e7c51-62d8-95c8-852e-2b5c7b042376)
Timestamps
- All timestamps use ISO 8601 format in UTC timezone
- Format:
YYYY-MM-DDTHH:mm:ss.ffffffZ
Transcript Timing Data
Transcripts[].Timesformat is semicolon-separated pairs of"startMs endMs"for each word- Example:
"1700 1740;1900 1940;2700 2740"- Word 1: 1700-1740ms
- Word 2: 1900-1940ms
- Word 3: 2700-2740ms
Channel Values
- 1 = Agent (customer service representative)
- 2 = Customer
Event Correlation
- ExternalId is used to correlate ConversationCreated and ConversationAnalyzed events
- Event Order: ConversationCreatedForDataFeeder is always sent before ConversationAnalyzedForDataFeeder
AI Insights Availability
- AI Insights are available only when AI analysis is enabled and completed for the conversation
- The
AiInsightsfield may benullor absent if AI processing is not configured
Summary
Data Feeder provides an efficient, real-time mechanism to stream Analytics events to your data infrastructure. By delivering minimal payloads with reference-based correlation, it enables scalable integration whilst maintaining low latency and bandwidth efficiency.
The structured format introduced in version 5.24 ensures that downstream systems can easily process conversation data, analytics metrics, and AI-generated insights for comprehensive conversation intelligence.

