Data Feeder

Prev Next

Table of Contents

  1. Overview
  2. Architecture
  3. Key Design Principle
  4. Client Responsibility
  5. Supported Destinations
  6. Event Types
  7. Data Field Reference
  8. Analytics Metrics
  9. 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:

  1. 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.

  2. 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.

  3. 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[].Times format 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 AiInsights field may be null or 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.