Butler Use Case

Finding out what happened to this call

You have one number and maybe a time. You need to know where the call died and whose fault it was. This is the single most common thing anyone asks Butler.

The Situation

Somebody complained first. That is almost always how this starts, whether it came from an end user, a reseller or a colleague in another channel, and what reaches you is a single identifier: a dialled number, sometimes a time, occasionally nothing more than “just now”.

Answering it today means opening a trace tool, knowing which session border controller to look at, finding the call, reading a SIP ladder, and knowing what a 480 means in that context. Butler collapses all of that into a sentence typed into the chat window you already have open.

The Answers

Pick a question, read the whole exchange

Both of these come from one afternoon, unedited, with identifiers masked. Read the second one for what Butler does when it does not have the data you asked for.

#voice-opsChat
EN

Engineer 10:19
@VI - Butler Our carrier sent us this Call-ID and says the call never reached them: 021CC6ECFA8140000005CEAE@TS_VOIP1. What do we know about it?
B

VI - Butler APP 10:19
vitrace_find_sessions  call_idvitrace_get_chain  session_uuid
Sir, I found the call. The Call-ID the carrier gave you belongs to an internal leg, a transit hop between our two SBCs, not the call to them.
CALL FLOW13140644549 → 105112125644549 (normalised to +1 212 564 4549) Hop 1 sbc-sut-00 received from the customer on DOMESTIC_ATTHop 2 sbc-sut-01 routed out on DOMESTIC_VERIZON
The leg that exited sbc-sut-01 toward the carrier uses a different Call-ID: 021CC6ECFA8140000003107D@TS_VOIP0. The one they gave you is the internal link between our SBCs. They would never see it.
What actually happened

  • The call was answered at 10:16:10 UTC
  • Duration 87 seconds, with connected audio both ways
  • Normal clearing by the calling party, and both legs report release_source ConnectedLeg, so the carrier side was up and connected when it ended
If the carrier says they never received this call, I’d ask them to check for Call-ID 021CC6ECFA8140000003107D@TS_VOIP0 instead.

A carrier denied receiving a call and quoted a Call-ID to prove it. Butler found the call, then noticed the thing that settles the argument: the Call-ID they quoted belongs to the hop between two of our own SBCs, so they could not have seen it. It handed back the one they should be looking for, and confirmed the call answered and ran for 87 seconds. That is twenty minutes in a packet capture, and the output is a sentence you can send straight to the carrier.

#voice-opsChat
EN

Engineer 10:19
@VI - Butler We had a call fail with a 503 this morning. I need to know whether that was our side or the carrier’s before I answer the customer.
B

VI - Butler APP 10:19
Sir, to find the call I need a bit more: the phone number involved, roughly what time and in which timezone, and which SBC it passed through if you know.
EN

Engineer 10:24
@VI - Butler Sorry, the caller was 13140758499, some time around 09:40 UTC this morning. I do not know which SBC.
B

VI - Butler APP 10:24
vitrace_find_sessions  number, 09:00 to 10:30, sip_code=503vitrace_get_chain
The 503 came from the carrier, on the DOMESTIC_VERIZON NAP.
09:42 UTCentered sbc-sut-00 from DOMESTIC_ATT 09:42:07routed SUT-00 → SUT-01 → SUT-02 and backevery outbound leg to the carrier 503failed after ~3s, 13 routing attempts
The evidence

  • release_source on every outbound leg is LocalLeg with sip_final_response 503
  • original_cause is 503_SERVICE_UNAVAIL(503)
  • Your SBC sent the INVITE and the carrier returned 503 Service Unavailable
You can tell the customer the failure was at the carrier side, not your platform.

The first message is the one worth reading. Asked about “a call that failed with a 503 this morning”, Butler did not pick a call and hope. It asked for a number, a rough time and an SBC, then found it with a server-side filter on the response code rather than paging through rows. The answer names the evidence it used before it draws the conclusion, which is what makes the last line something you can actually forward.

#voice-opsChat
EN

Engineer 10:19
@VI - Butler The end user swears their phone never rang, but our side shows the call as busy. Which is it? Latest one you can find.
B

VI - Butler APP 10:19
vitrace_find_sessions  cause=UserBusyvitrace_get_chainvitrace_get_sip_ladder
Your side is correct. The call was genuinely busy.
07:52:27 UTC180 Ringing ← 07:52:27.353486 Busy Here ← 07:52:27.373 (20 ms later)
Why the phone never rang

  • The 180 Ringing was sent by the terminating switch, not by the end user’s device
  • The ringing in the ladder is signalling only, the far end indicating it was attempting to alert the destination
  • The 486 came back 20 ms later, so the handset almost certainly never had time to physically ring
The 486 Busy Here was real. The end user may not have heard it ring, but the network did attempt delivery and received a busy signal from their side.

Both parties were right, which is why this argument was going nowhere. The network did attempt delivery and the phone did not ring, and twenty milliseconds is the whole explanation. Notice that Butler did not pick a side and defend it. It read what the signalling actually said, which turned out to be more precise than either party had been.

#voice-opsChat
EN

Engineer 10:19
@VI - Butler How long did this call take to connect, and where did the time go? 70e68306-b1ae-41ab-a499-bf40ac150242
B

VI - Butler APP 10:19
vitrace_get_chainvitrace_get_session_legs
Connection time was about 2.9 seconds. Here is where it went:
PHASE DURATION MEANINGPost-dial delay 295 ms INVITE to first ringing: routing and destination processingRinging time 2,884 ms first ring to answerTotal to connect ~2.9 s
Call started 10:16:07.141 and answered 10:16:10.025. Both legs answered nearly simultaneously, so the delay was primarily waiting for the terminating party to pick up.

One number that means nothing, split into two that mean something. Of nearly three seconds to connect, 295 milliseconds was post-dial delay, which is routing and the destination’s own processing, and the other 2.9 seconds was the called party not picking up. The first is a platform question and the second is not, and conflating them is how an afternoon gets spent troubleshooting the wrong system.

#voice-opsChat
EN

Engineer 10:18
@VI - Butler Give me two sentences about the most recent failed call today that I can paste into a ticket for the customer. No jargon, they are not an engineer.
B

VI - Butler APP 10:18
vitrace_find_sessions  status=failed, limit=1vitrace_get_chain
The most recent failed call was at 10:04 UTC this morning. An incoming call from 13140530598 to 205112125530598 could not be completed because the destination number was not found in the carrier’s system. The call ended immediately with a “number not found” response.

The usual objection to putting an assistant in front of a support desk is that it will bury the team in detail. This is the counter-example. Underneath that answer it walked a chain of three hops and six legs, and then threw nearly all of it away: no response codes, no NAP names, no topology. Three plain sentences that the person who opened the ticket can actually read.

#voice-opsChat
EN

Engineer 15:23
@VI - Butler Give me a summary of a call attempt made to 5XX 6600 at 13:15 13:38
B

VI - Butler APP 15:23
vitrace_find_sessions  callee_number=“5XX 6600”, 13:00 to 14:00
Sir, I found 6 calls to 5XX 6600 between 13:00 and 14:00. Here are those closest to your times:
13:15 window13:18:50 from 6XX XX2469 46 seconds COMPLETED 13:38 window13:38:02 from 5XX 5202 29 seconds COMPLETED13:38:42 from 5XX 5202 234 seconds COMPLETED
Both calls at 13:38 were from the same number. The first lasted 29 seconds, the second nearly 4 minutes. All calls completed normally. Shall I pull the SIP ladder for either of the 13:38 calls, Sir?
EN

Engineer 15:25
@VI - Butler The user reports that these calls failed and were disconnect prematurely. Please include the SIP ladder for both of them
B

VI - Butler APP 15:26
Call 1: 13:38:02 (29 seconds)INVITE (198.51.100.10 → 203.0.113.20)100 Trying ←180 Ringing ←200 OK ←ACK →BYE → (Normal Clearing)200 OK ←
Disconnect initiated by the caller with normal clearing. Call 2 at 13:38:42 shows the same ladder over 3m 54s.
Assessment. Both calls completed successfully and were terminated normally. In each case the BYE was sent by the caller with Normal Clearing. There is no failure or premature disconnect visible in the SIP ladder. The calls ended at the source side, not the destination.
EN

Engineer 15:33
@VI - Butler In Call 1; what codec was negotiated and used for the call. Not what codecs were available but what codec was actually used.
B

VI - Butler APP 15:34
Both legs of the call used PCMA (G.711 A-law). This is confirmed in the CDR legs data from the chain, so PCMA was the negotiated and actual codec used for the entire call duration.

The engineer said the calls failed. The evidence said they did not, and Butler said so with the ladder to prove it. Notice also that nobody restated anything: by the third message the question is just “in Call 1”, and Butler still has both calls in hand. An answer worth trusting is one that will disagree with you.

Ask It This Way

The prompts, and where each one leads

Copy one, swap in your own numbers. The follow-ups matter more than the opener.

What happened to the call to 5XX 6600 just now?
When you’d ask

Someone complained and all you have is the number. No time, no direction, no SBC.

What comes back

The call, the disconnect cause, and which leg raised it.

Then ask

Show me the ladder in ASCIIIs this the incoming or outgoing leg?Was there audio?
I need both legs. Which outbound NAP did the call leave by, and its release?
When you’d ask

You are about to open a ticket with an upstream carrier and need it to be unarguable.

What comes back

Ingress NAP, egress NAP, release source and the disconnect cause, which turns “the call failed” into “it left by this trunk and that carrier declined it”.

Then ask

Did it try anywhere else?Generate a PDF I can forward
What did the 503 actually say?
When you’d ask

The status code is not the answer. You want the reason header text, verbatim.

What comes back

The reason phrase, plus any Reason or Warning header carried with it, which is the part a dashboard cannot show you.

Then ask

Which side sent it?How many others like it today?
What codec was actually used, rather than what was available?
When you’d ask

Audio complaint, and the SDP offer lists five codecs that tell you nothing.

What comes back

The negotiated codec per leg, read from the leg records rather than the offer.

Then ask

What was the MOS on each leg?Was there a transcode?
More, for when you are still locating the call

Did I have any calls to 4XX 9002?
I’m looking for 3 calls made on 26/08 from 6XX 2467 to 5XX 7366. Can you locate the call IDs?
Did the call at 08:07 UTC have an audio problem? The MOS shows as zero.
Working With It

How to read what comes back

Read an empty MOS as “no media”, not as a bad score. The figure exists only where media actually flowed, so on a zero-duration call Butler reports it as absent rather than showing a zero that would look like a quality rating. Those are exactly the calls people ask about most, so it is the one field worth knowing the behaviour of.
Let Nodes find it, then ask Butler why. Threshold alerts are raised programmatically by Voice Intelligence Nodes, on rules you set. Bring the alert into the chat and Butler will go and work out what sits behind it.
Ask for the file on whichever app your team uses. Slack, Teams and Telegram behave identically for everything on this page. The one difference is delivery: files land in the conversation on Slack and Telegram, and on Teams Butler emails them and tells you that is what it is doing.
Butler Use Cases

What happened to this call?

One number and maybe a time. Butler finds the call and says whose side ended it.

Counts, groupings, thresholds and KPIs across a population of calls.

Routing tables, regex and SDP profiles in plain English.

Ask in French, Spanish or Portuguese, get the answer from the English documentation.

Changes, reports, files and email, each one waiting for your yes.

Paste the complaint in the customer’s own words and let Butler find the call.

All Butler use cases

Ask Butler about your own failed call

Deployed in 48 hours, month to month, in the chat app your team already has open.

By submitting this form, your information will be processed in accordance with our Privacy Policy.