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 Knovvu 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 Knovvu 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 Knovvu 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": "ürün destek şerif ben",
"Times": "0 40;560 1000;1000 1320;1440 1480",
"StartTime": 0,
"EndTime": 1480
},
{
"Channel": 2,
"Text": "iyi günler kolay gelsin bir fırın ankastre fırın arızamız var",
"Times": "1700 1740;1900 1940;2700 2740",
"StartTime": 1700,
"EndTime": 13580
}
],
"AgentTensionRatio": 0,
"AgentMonotonicityRatio": 87,
"CustomerTensionRatio": 0,
"AverageCustomerSentimentScore": 0,
"AverageAgentSentimentScore": 0,
"AiInsights": {
"conversationId": 363315,
"externalId": "cbf1c1ca-d869-18a9-aa73-3a1ad5baad43",
"topic": "cell phone plans",
"summary": "A customer inquired about new cell phone plans due to high costs with a competitor. The agent offered a plan with unlimited services and no contract requirements.",
"actions": "Provided plan details;Confirmed pricing;Assured no contract required",
"conversationResult": "Customer interested in new plan",
"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
{
"conversationId": 363315,
"externalId": "cbf1c1ca-d869-18a9-aa73-3a1ad5baad43",
"topic": "cell phone plans",
"summary": "A customer inquired about new cell phone plans due to high costs with a competitor. The agent offered a plan with unlimited services and no contract requirements.",
"actions": "Provided plan details;Confirmed pricing;Assured no contract required",
"conversationResult": "Customer interested in new plan",
"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 Knovvu 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.

