The call was placed but it never went live. Your Call stayed in dialing or ringing, then landed on no_answer or failed. Audio never bridged. Each of these outcomes means the same thing: the call never reached in_progress. That is the only status that guarantees a live media path. This page is a symptom → cause → fix map for that window. It covers causes from “the trunk is not registered” to “the carrier rejected the number”. It also lists the Q.850 cause codes that tell you exactly why. Start from the outcome. Identify the status the call ended on. Then find that row below. no_answer and failed have different causes, so the ending status already cuts the search in half.
This page is about calls that never connect. If the call reaches in_progress but you cannot hear anything, that is a media problem, not a signalling problem. Go to one-way audio. If the trunk itself does not come up at all, start at SIP trunk issues.

First, read the ending status

Before anything else, look at where the call ended. The call lifecycle explains how each status maps to a SIP moment. For triage, this is the short version: completed means the call did connect and then ended. That is not this page. no_answer and failed both mean the call never connected, and the split matters. failed is almost always a rejection that you can fix (auth, format, ACL). no_answer is usually the far end (busy, no person there, ring timeout).

Symptom → cause → fix

You do not read raw SIP off the wire in normal use. The gateway speaks SIP for you and collapses it into CallStatus. The SIP codes below appear in the per-call event timeline and CDR (via the cleared event’s Q.850 cause). Read them in call traces. Use them to find the correct row, not as something you handle in code.

Q.850 cause codes

When a call clears, the gateway records an ITU-T Q.850 cause code with the status. It is the most precise “why” you have. It rides the cleared lifecycle event and the CDR. Read it in call traces. These are the codes you will see on a call that never connected:
Q.850 17 / 18 / 19 / 20 all mean “the far end did not answer” and show as no_answer. Retry logic is the correct response. Q.850 1 / 21 / 28 / 34 are rejections that show as failed. A retry of the same call in the same way does not help. Fix the number, the auth, the ACL, or the channel cap first.

Step-by-step: isolate a call that won’t connect

1

Read the ending status and Q.850 cause

Pull the call’s timeline in call traces (or the cleared event / CDR). Note the terminal CallStatus and the Q.850 cause. That pair alone points you at a row above. failed + cause 21/28 → your side (format or auth). no_answer + 17/18/19 → the far end.
2

Confirm the call left the building

If the call never got past dialing, the INVITE did not route. For outbound, check that the trunk is registered / IP-authed and that the trunk resolved. For inbound, check that the DID is provisioned and that the source IP matches a known trunk. The gateway refuses unknown sources before routing.
3

Check the number format

Dial E.164 (+<country><number>). A 484/404/28 almost always means the digit string was wrong for that carrier. Set a technical prefix or +-stripping on the trunk’s dial rules. Do not edit the number in your app.
4

Rule out auth and ACL

A 401/407 loop that ends in a give-up is digest auth. Enter the trunk sip_username / sip_password again. They are sealed — set them again, you cannot read them back. An inbound INVITE that vanishes with no response is usually the source-IP ACL. Add the carrier’s signalling IP. See SIP trunk issues.
5

Right-size the ring timeout

If the call rings and dies at a fixed second count, that is ringTimeoutSec (default 30, clamp 5–120). Raise it for destinations that answer slowly. If the call hits the timeout every time, the far end black-holes the INVITE. Go back to routing, not the timeout.
6

For campaigns, back off the pacing

Bulk failed results with cause 34 (no channel) mean a concurrency ceiling. Lower calls_per_second and max_concurrent_calls on the paced dialer to stay under the trunk’s licensed channels.

Setting a sane ring timeout

ringTimeoutSec caps the ringing stage. If no 200 OK arrives in time, the gateway stops the wait, and the call lands on no_answer instead of a ring that never ends. You get a deterministic terminal status that you can branch on.
Do not retry a failed call with cause 21 (rejected), 28 (bad format), or 1 (unallocated) without a change. It fails in the same way. Fix the cause first. Cause 34 (no channel) and 41 (temporary) are safe to retry with backoff. Any no_answer is also safe to retry with backoff.

Call lifecycle

How SIP signalling maps to each CallStatus, and where media comes up.

SIP trunk issues

When the trunk does not register, authenticate, or route.

One-way audio

The call connected, but audio flows in one direction only.

Number provisioning

Provision a DID and map it to a trunk, agent, or flow.

SIP trunking

Bring your own trunk or use a managed one; registration and IP auth.

Call traces

Read the per-call event timeline and Q.850 cause after the fact.