All circuits are busy


Is there a way to get better granularity on the messages given back by FreePBX when dialing a number?

The “All circuits are busy” message appears to be used both when the SIP trunks are all in use and also when the destination doesn’t exist (ie a mis-dial) and also when there is some other issue. In fact, it appears to be used for everything except the destination being engaged/busy.

Is it possible to set up a different message for these common situations? One for all SIPs in use, one for a mis-dial etc?

It’s the single biggest query that we have from users. Typically we have to find the call in the logs and we find a mis-dial or some other issue with the destination that resolves itself.


If the destination doesn’t exist, you should hear (by default) “Your call cannot be completed as dialed”.

If you often have all SIP trunks in use, consider failing over to a pay-per-minute provider that gives you virtually unlimited channels. For US or Canada, look at Alcazar Networks. For other countries, check out AnveoDirect or Voxbeam. All of the above provide a small credit at signup, so you can test without making a payment.

If you would like to distinguish technical problems from numbers not in your provider’s routing table, you are dependent on whether the provider returns a different status for the two cases.

You can customize congestion behavior in the Route Congestion Messages module, and/or specify an Optional Destination on Congestion in your Outbound Route.

We don’t get “Your call cannot be completed as dialed” when we dial a wrong number. We get “All circuits are busy”.

Any idea why that might be or where we can change that?

That message means you have a valid route but the peer(s) did not accept the call

Have you looked at the release codes message module

Here is a truncated section of code… I have stripped a bunch of stuff out. You can see the full file at:

Note: These are on trunk dial so not internal calls that don’t hit the trunk.
Note: These rely on a technology (SIP/PRI) that provides cause codes

Busy calls

$exten = 's-BUSY';
* HANGUPCAUSE 17 = Busy, or SIP 486 Busy everywhere
$ext->add($context, $exten, '', new ext_playtones('busy'));
$ext->add($context, $exten, '', new ext_busy(20));

No answer

$exten = 's-NOANSWER';
* HANGUPCAUSE 18 = No User Responding, or SIP 408 Request Timeout
* HANGUPCAUSE 19 = No Answer From The User, or SIP 480 Temporarily unavailable, SIP 483 To many hops
$ext->add($context, $exten, '', new ext_playback('number-not-answering,noanswer'));
$ext->add($context, $exten, '', new ext_playtones('congestion'));

Invalid Number

$exten = 's-INVALIDNMBR';
* HANGUPCAUSE 28 = Address Incomplete, or SIP 484 Address Incomplete
$ext->add($context, $exten, '', new ext_playback('ss-noservice,noanswer'));
$ext->add($context, $exten, '', new ext_playtones('congestion'));

Number Changed

$exten = "s-CHANGED";
$ext->add($context, $exten, '', new ext_playtones('busy'));
$ext->add($context, $exten, '', new ext_busy(20));