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
LastUpdateTimestampfor eachContactIdbefore 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.
Queueshows 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
- Contact records data model (AWS documentation)
- Enable data streaming for your instance
- Search for contacts