Skip to content
Amazon Connect · Contact records

Amazon Connect CTR Parser

Paste or drop contact trace records from Kinesis, Firehose, S3 or the API and see what happened on every contact: timeline, queue, agent, handle time, service level and cost.

Last updated

Client-side only No data uploaded
Contact Record Analytics
Amazon Connect CTR Parser
Parse. Visualize. Understand.

Paste or drop Amazon Connect contact trace records — from Kinesis, Firehose, S3 (.gz) or the DescribeContact API — and get a plain-English summary, timeline, service level, handle time, abandon rate and cost per contact. Mask personal data before you share.

Visual contact timeline with duration breakdown Agent, queue, and routing detail cards Contact Lens: sentiment, categories, issues Transfer chain visualization Anomaly flags: abandoned, long hold, no ACW Batch mode: analyze multiple CTRs at once
// PARSED CTR
CTR JSON Input

Drop CTR JSON file here

Single CTR or array of CTRs — parsed entirely in your browser

or paste CTR JSON below
Samples:
Contact Timeline
End-to-end contact journey
Key Metrics
Raw JSON
// RAW CTR JSON

Understanding Amazon Connect Contact Trace Records (CTR)

A Contact Trace Record (CTR) is an immutable JSON document that Amazon Connect generates for every contact — voice call, chat, or task. It captures the complete lifecycle of a contact: when it initiated, how long it waited in queue, which agent handled it, how long they spoke, hold times, ACW duration, disconnect reason, and much more. CTRs are essential for quality management, compliance, billing reconciliation, and performance analytics.

What is an Amazon Connect CTR and where do I find it?
A CTR (Contact Trace Record) is the official JSON record for every contact in Amazon Connect. You can access CTRs via: Amazon Kinesis Data Stream (real-time), Amazon S3 (storage), Amazon Connect APIs (GetContactAttributes, DescribeContact), or the Contact Search UI in the Connect console. CTRs are retained for 24 months by default.
What is the difference between AgentInteractionDuration and ConnectedToAgentTimestamp?
ConnectedToAgentTimestamp is the wall-clock time when the agent accepted the contact. AgentInteractionDuration is the total seconds the agent was actively talking (excluding hold time). A contact with 300s AgentInteractionDuration and 60s CustomerHoldDuration had a total connected time of 360s. ACW (After Contact Work) is tracked separately as AfterContactWorkDuration.
What are the possible values for InitiationMethod in a CTR?
INBOUND (customer called), OUTBOUND (agent initiated a call via the CCP), TRANSFER (agent transfer via quick connect, creates a new contact record), CALLBACK (customer requested callback), API (contact initiated via API, e.g. StartOutboundVoiceContact or StartChatContact — chat contacts are always API), QUEUE_TRANSFER (transferred to another queue via a flow block), DISCONNECT (new contact created while a Set disconnect flow runs), MONITOR (supervisor silent monitor or barge), EXTERNAL_OUTBOUND (agent-initiated call to an external party), WEBRTC_API (communication widget video call), AGENT_REPLY (agent reply to an inbound email), FLOW (email initiated by a Send message flow block), CAMPAIGN_PREVIEW (outbound campaign preview dialing).
What is handle time in Amazon Connect and how is it calculated?
Handle Time = AgentInteractionDuration + CustomerHoldDuration + AfterContactWorkDuration. It represents the total time an agent spent on a contact from pickup to completing ACW. Amazon Connect also reports Average Handle Time (AHT) as a real-time and historical metric in the Contact Control Panel and reporting dashboards.
What does DisconnectReason tell you about a contact?
For voice: CUSTOMER_DISCONNECT (customer hung up), AGENT_DISCONNECT (agent ended the call), CONTACT_FLOW_DISCONNECT (a disconnect block in the flow ended it — often an abandoned-in-queue signal), BARGED (a supervisor disconnected the agent), THIRD_PARTY_DISCONNECT, OTHER, plus telecom-specific reasons (TELECOM_BUSY, TELECOM_UNANSWERED, TELECOM_TIMEOUT, TELECOM_NUMBER_INVALID, etc.) and CUSTOMER_NEVER_ARRIVED for web-calling contacts that never connected. Chat, task, and email channels each have their own reason sets (e.g. EXPIRED, API, IDLE_DISCONNECT for chat). High CONTACT_FLOW_DISCONNECT rates usually indicate queue abandonment. Note: values like OUTBOUND_CONTACT_ABANDONED or TRANSFER_FAILED sometimes appear in older integrations/community references but are not part of AWS's current documented list — treat them as informational only if you see them.
What Contact Lens data appears in a CTR?
When Contact Lens is enabled, CTRs include: SentimentScore (per-turn sentiment for agent and customer, -5 to +5), Categories (matched rules like "complaints" or "escalations"), Issues (auto-detected topics), OutcomeCodes (call outcomes), ActionItems (follow-up tasks), and ConversationalCharacteristics (talk time, interruptions, non-talk time). Contact Lens data is appended after the recording is processed, typically within minutes.
Does every contact generate a CTR?
No. CTRs are generated once a call ends and the agent's status moves out of ACW, when a contact is transferred, or when a contact is abandoned in queue. Very short-lived contacts — for example a customer hanging up immediately after dialing, before any flow or queue interaction — may not produce a CTR at all. This is a common source of "missing" records when reconciling telephony logs against CTR counts.
How do I pull historical CTRs, and can records repeat?
Three main paths: the Kinesis Data Stream for real-time delivery, an S3 export (queryable with Athena/QuickSight) for historical analysis, or the GetContactAttributes/DescribeContact/SearchContacts APIs for on-demand lookups. Records are retained for 24 months and delivered at least once — Amazon Connect can redeliver a CTR after an update (for example, update-contact-attributes), so use LastUpdateTimestamp to detect newer copies and ContactId to deduplicate when processing bulk exports.
Which CTR formats can this parser read?
A single CTR or a JSON array; concatenated records and newline-delimited JSON as written by Kinesis Data Firehose to S3; gzip-compressed .gz files straight from S3; base64-encoded Kinesis Data Streams records; Lambda Kinesis and Firehose transformation test events; and the GetContact/DescribeContact API response. Contact flow logs from CloudWatch can be pasted alongside CTRs and are matched by ContactId.
How is service level calculated from CTRs?
Service level is the share of queued contacts answered within your target (20 seconds by default, adjustable): contacts answered with Queue.Duration at or below the target, divided by all answered plus abandoned contacts. Abandoned means the contact was queued but Agent.ConnectedToAgentTimestamp is empty.
Can I mask customer phone numbers and emails before sharing a CTR?
Yes. Turn on Mask personal data and the parser hides customer phone numbers, email addresses and long numbers in contact attributes in the view and in every export. Share links are always masked, and the data sits after the # in the URL, which browsers never send to a server.
How much does an Amazon Connect contact cost?
The parser estimates each contact's Amazon Connect cost from the same rate file as the Kloudmint pricing calculator: voice minutes billed per second with a 10-second minimum, plus US carrier minutes with a 60-second minimum, or per message, task or email for other channels. It shows Connect Customer and Customer Basic list prices side by side, before taxes.
How do I query Amazon Connect CTRs in Athena?
Click Athena table & queries after parsing. The tool builds a CREATE EXTERNAL TABLE statement from the fields in your records, using the JSON SerDe and partition projection for year/month/day folders, plus ready-made queries for service level, handle time, abandon rate and repeat callers.

Amazon Connect CTR field reference

The fields you will see most often in a contact trace record, and what each one means. The parser reads all of them, including newer fields such as RoutingCriteria, SegmentAttributes and Recordings.

FieldWhat it means
ContactIdUnique ID of this contact. Each transfer or callback creates a new contact with its own ID.
InitialContactId / PreviousContactId / NextContactIdLink the contacts in a transfer or callback chain: the first contact, the one before this, and the one after.
RelatedContactIdA contact this one was linked to, for example a task created from a call.
ChannelVOICE, CHAT, TASK or EMAIL.
InitiationMethodHow the contact started: INBOUND, OUTBOUND, TRANSFER, QUEUE_TRANSFER, CALLBACK, API, DISCONNECT, MONITOR or EXTERNAL_OUTBOUND.
InitiationTimestamp / DisconnectTimestampWhen the contact started and ended (UTC, ISO 8601).
Queue.EnqueueTimestamp / Queue.DurationWhen the contact entered the queue and how many seconds it waited.
Agent.ConnectedToAgentTimestampWhen an agent accepted the contact. Empty means the contact never reached an agent (abandoned or self-served).
Agent.AgentInteractionDurationSeconds the agent spent interacting with the customer, excluding hold.
Agent.CustomerHoldDurationTotal seconds the customer was on hold.
Agent.AfterContactWorkDurationSeconds the agent spent in after-contact work (ACW).
Agent.AgentPauseDurationSeconds the contact was paused by the agent (tasks, email and chat).
DisconnectReasonWho or what ended the contact, such as CUSTOMER_DISCONNECT, AGENT_DISCONNECT, CONTACT_FLOW_DISCONNECT, TELECOM_PROBLEM or EXPIRED.
CustomerEndpoint / SystemEndpointThe customer's address (phone number or email) and your Amazon Connect number or address.
TransferredToEndpoint / TransferCompletedTimestampWhere and when the contact was transferred.
AttributesContact attributes set by your flows and Lambda functions, as key-value pairs.
SegmentAttributesSystem attributes for the contact segment, such as connect:Subtype (connect:Chat, connect:SMS, connect:WhatsApp, connect:Email).
RecordingsEach recording or transcript: media type, participant, S3 location, status and deletion or redaction details.
RoutingCriteriaRouting steps evaluated for proficiency-based routing, with each step's status, expiry and the step that matched (Index).
QualityMetricsAudio quality score (1–5) for the agent and customer, plus issues such as HighPacketLoss or HighRoundTripTime.
CustomerVoiceActivityWhen the customer's greeting started and ended — used with outbound and answering-machine detection.
AnsweringMachineDetectionStatusOutbound campaign result such as HUMAN_ANSWERED, VOICEMAIL_BEEP or AMD_UNANSWERED.
Campaign.CampaignIdThe outbound campaign that placed the contact.
ContactLensContact Lens results for the contact, including sentiment, categories and redaction status.
LastUpdateTimestampWhen the record last changed. CTRs can be redelivered; keep the copy with the latest value.
Practical guide

How to troubleshoot a contact with its CTR: a worked example

A supervisor reports that a customer "waited forever and then got cut off" around 14:10 yesterday. The CTR is the fastest way to find out what actually happened, without guessing from dashboards. Here is how to read one step by step, using the Abandoned sample above as the example.

Step 1: Find the right record

Search the contact in the Connect console (Analytics → Contact search) by phone number and time window, then open the contact and copy its ContactId. If your CTRs stream to S3 through Kinesis, query them in Athena by ContactId or by CustomerEndpoint.Address. Remember that every CTR timestamp is in UTC. A call at 14:10 IST is 08:40 in the record, and that mismatch is the most common reason people "can't find" a contact.

Step 2: Read the timeline in order

Paste the JSON into the parser and check the timeline from left to right:

  • InitiationTimestamp: when the contact entered Connect.
  • Queue.EnqueueTimestamp and Queue.Duration: when it joined the queue and how long it waited.
  • ConnectedToAgentTimestamp: empty on an abandoned contact, because no agent ever answered.
  • DisconnectTimestamp and DisconnectReason: who or what ended the contact.

In the sample, the customer queued for several minutes and DisconnectReason is CUSTOMER_DISCONNECT with no agent attached. That is a true abandon: the customer gave up. If the reason were CONTACT_FLOW_DISCONNECT instead, a flow ended the call, typically a queue flow that hits a time limit or an error branch that disconnects. Those are very different fixes: staffing in the first case, flow design in the second.

Step 3: Follow transfers across records

A transfer creates a new contact with its own CTR. To rebuild the whole customer journey, chain the records with PreviousContactId and InitialContactId. Every leg of a transferred call shares the same InitialContactId. Load all legs together with the Batch sample mode and the parser shows the transfer chain for you.

Step 4: Check attributes and routing

The Attributes map shows the values your flows set: language, intent, customer tier, the menu option chosen. If a VIP caller ended up in the general queue, this is where you will see that the tier attribute was never set, or was set after the Set working queue block ran.

Common CTR analysis mistakes

  • Counting duplicates. Amazon Connect can deliver an updated CTR more than once (for example after a contact attribute update or when Contact Lens results arrive). Keep the copy with the latest LastUpdateTimestamp for each ContactId before you count anything.
  • Adding up handle time wrongly. Talk time (AgentInteractionDuration), hold (CustomerHoldDuration) and after-contact work (AfterContactWorkDuration) are separate fields. Leaving out ACW makes AHT look better than it is.
  • Treating every transfer as a new customer. Without grouping by InitialContactId, a single caller who was transferred twice shows up as three contacts and inflates volume.
  • Ignoring the queue on the record. Queue shows the last queue the contact was in, not every queue it passed through. For multi-queue journeys, use the transfer chain.
  • Mixing time zones. Convert UTC timestamps to the contact centre's local time before comparing with WFM or supervisor reports.

Where CTR data goes next

For one-off investigations, pasting a record here is enough. For ongoing reporting, stream CTRs with Kinesis Data Streams or Firehose into S3, catalogue them with Glue and query with Athena or QuickSight. Keep the raw JSON: new fields appear as AWS adds features, and a flat CSV export silently drops them.

Official references

Runs 100% in your browser. Your files and data never leave your machine. Nothing is uploaded or stored.

Stuck on an Amazon Connect problem?

Get help from an architect with 8+ years in contact centres and 4+ years on Amazon Connect: flows, CCP and CRM integrations, Lex and Q in Connect, migrations and go-lives.