Suggestion: Queue/Ring Group Escalation

Hi Developers,

Hope this is the right forum. There’s a certain workflow that would be an excellent addition to FreePBX’s ring groups and queues, which is the ability to expand or widen or escalate calls, such that a call first rings on a group of phones, and then expands the group if noone answers after, say, 30 seconds.

For example, in our small business, we have Sales calls ring on two phones that are Sales phones. If nobody answers, we time out and roll over into another Ring Group of 4 phones. If there’s no answer in 30 seconds, we expand to 9 phones, some of which are cell phones.

I believe this is a natural way to want to configure one’s PBX.

However, the only way to do it right now is a completely separate ring groups or queues that ‘roll over’ or time out into each other. But the system has no awareness of what’s happening, the music starts all over, and Queue prompts like how many people are ahead of you become nonsensical, because people are essentially sent from waiting room to waiting room to waiting room to waiting room, each with its own stats, its own music, and it’s just a strange user experience.

I think there would be some merit to considering an escalation system for Ring Groups and Queues, such that the ‘search range’, if you will, can be expanded at interval.

One possible implementation could be that each extension/phone number in the Group list is prefixed by a Level, so extension 221 on Level 2 would be written as (2)221.

Then you could have these Escalation parameters:

Escalation Delay: (i.e. 40 seconds). Or there could be 3 fixed escalation levels and a unique delay for each, like Escalation Delay 1 = 30 seconds, Escalation Delay 2 = 30 seconds, Escalation Delay 3 = 60 seconds. This way, Level 1 would ring for 30 seconds, then Level 2 would ring for 30 seconds, and then Level 3 would ring for 60 seconds before going to the timeout selection.

Escalation Mode: Add/Replace. In Add mode, when going from Level 1 to Level 2, all the phones listed as having a Level 2 would be ADDED to the current ringing Level 1 phones. In Replace mode, each Level is a unique set of phones, and phones that rang on Level 1 might not ring on Level 2.

So here would be a sample extension list:


In ADD mode, on Level 1, 221 and 222 would ring. When escalated to Level 2, 221, 222, 104, 105 would ring.

In REPLACE mode, on Level 1, 221 and 222 would ring. When escalated to Level 2, 104 and 105 would ring.

There’s probably a lot simpler way to do all this, as text-based configuration is never the most attractive. It would be easier to understand as a user if you simply have 3 text boxes, one for Level 1, 2 and 3. I’m just trying to dominate the GUI as little as possible. But probably the text-based configuration would be bad for most people.

Still, I think this is a workflow that many people, including myself, are trying to implement with workarounds such as timing out from one group to another. But the software would be able to do a far better job, and this ‘expanding’ method of call routing is a very typical one to try to implement, whether it’s at the office or at home. It makes a lot of sense to start with a few phones and then expand, rather than ring the whole building at the same time. The various hunt-methods supplied don’t really work unless you’re running a true call center, and then it’s still basically either Ring All, or Ring One By One, with little or no intelligence.



i wish thats how asterisk queue member priorities worked, unfortionatly higher priorities only get hit when the lower ones are BUSY

Thanks for supporting the idea, but actually that would be more of a problem with the call distribution algorithm, and something that should be implemented by adjusting the behavior of the algorithm or making a new search method for Queues.

What I’m talking about is dividing your phones into groups to be used in a Ring All pattern, where you start small, then expand, then expand. The thing is that human intelligence can do much better job at deciding what’s a good order. Algorithms to auto-assign to employees based i.e. when they got their last call or time-on-phone-today only work for a major call volume. Otherwise, they’re really inconvenient.

With human intelligence, with an escalation system, you can decide that “these two phones are the most important, so they’ll ring first. If nobody answers, then we’ll include the Tech Support department. If nobody answers there either, then we’ll include a couple of cell phones. If nobody answers there either, we’ll bring it into the bosses office”. (Who I’m sure would rather take a call than lose a customer).

It can be Ring-All, or Round-Robin. The point is that you expand the group in a controlled fashion, rather than give a computer the overwhelming task of figuring out for itself that this is the most appropriate way to route calls. Even if you implemented a neural net, the computer would not figure out that if nobody answers, it’s OK to include the bosses phone. A computer wouldn’t be able to figure out that it’s always best to ring the Sales phones first, even if the last 100 calls were answered from Tech Support. A computer can never, ever know this. But a human can. By escalating, we can guide call traffic in the most general sense. Then the computer can do all its Round-Robin intelligence WITHIN that framework, so that if you escalate from 4 to 20 phones, it keeps doing Round Robin, but now it’s doing it over all 20 phones instead of just the original 4.

Hope this makes sense.



what you describe is what the queue penalty is suppose to do in Asterisk Queues, or at least pretty close. You can enter queue penalties on static agents in FreePBX. The problem is, in the past when I tried to get penalties to create such escalations they never worked properly and others with whom I discussed this confirmed that they were basically broken in Asterisk. Whether that is still the case, I don’t know but you can try them out and see if the desired behavior can be had. For queues, as implemented it is going to have to be done in Asterisk. For ringgroups, you are welcome to put in a feature request - FreePBX implements all the ring group (and followme) ring strategies in AGI scripts and dialplan code.


I’m primarily suggesting this for Ring Groups, as that is how I’ve always routed PBX’s, and it really comes naturally. I merely added the Queues suggestion thinking that Queues and Ring Groups were more similar than they apparently are. But the auto-penalty feature does not solve the problem, even if it worked, because the whole point is to funnel the call routing, not to adapt it based on availability. The whole point is for a human to tell the system what’s important, not for the system to attempt to poorly figure it out for itself. To take a house for example, I don’t want the phone to stop ringing in my bedroom just because I answered from the living room the last 3 times. But I DO want the Ring Groups or Queues to take into consideration that I would prefer to be called in the Office or the Lobby, then widen the search to the downstairs floor, and only then widen to the upstairs floor. You can’t do that in any useful way with Queues, and the only way you can do it with Ring Groups is to daisy-chain many Ring Groups, causing the music to restart every single time, and with the system having no awareness of what’s going on.

I added the suggestion of doing the same for Queues, because it also makes sense to start the Queue ‘logic’ on just a few extensions, then add 10 more extensions to the Queue, then adding management phones if need be. Then the Queues can do their least-calls/least-time/unavailable stuff WITHIN THAT FRAMEWORK. You can’t use that Queue logic itself to implement such a funneling or escalation pattern that is supposed to be human-controlled, and unchanging, a way to communicate to the system in the broadest possible terms how you want your calls routed.

I gather that what you’re saying is that Queues are implemented by Asterisk, and therefore difficult for you to micro-manage. I understand. Maybe it would be worth considering completely dumping Asterisk queues and writing something similar that’s under your control.

In any case, I hope I’m explaining this clearly. Within the framework of funneling calls, Ring Groups and Queues become much more useful. Nothing is wrong with any of the Ring Group or Queue code. But if you’re able to tell the system that “Do what you’re already doing, but for the first 30 seconds, do it only on these 3 phones, then for the next 30 seconds, do it for these 12 phones, and after 4 minutes, add the management phones”, this is suddenly much more human-friendly.

I don’t know where to make feature suggestions. URL?

Thanks much!


The penalties in queues, if worked do what you want. Think of the penalty as defining a tier 1, tier 2 etc. agent. The idea is to try all the agents with the lowest penalty. If none of them are available, then you escalate to the next higher penalty and try those agents, etc. So if it worked, it achieves what you want (I think). Feature suggestions are made where bugs are reported, look at the Development Site links on your left.

No, but you say “available”. But if I’m one person on 4 four phones (i.e. downstairs), then for every call I answer, the other 3 phones will appear to be “unavailable”, and that would wreak havoc on the routing if the system were to suddenly think there’s no point in calling those 3 other phones. If the Penalty thing worked, then sure, it could try phones one by one, and if there’s busy or no answer, then move on to the next one. But for 40 phones and a timeout of let’s say 30 seconds, it would take over 20 minutes for the last phone to ring. Even the must stubborn caller would have hung up by then. And the only way to shorten it would be that every time I got to the living room, I’d log in on the living room phone. Then if I’m going to the bathroom, I log out of the living room phone and I log in to the bathroom phone. This is completely unrealistic.

I don’t see any possibility of simply doing Ring All to 4 phones, then to 10 phones, then to 30 phones. Or to Round-Robin 4 phones for 60 seconds, then if nobody answers, Round-Robin 10 phones for 60 seconds, and if nobody answers, Round-Robin all 30 phones for 5 minutes. But maybe I’m wrong.



until it works, it’s a mute point (maybe it does though, it has been a while since I checked). But the typical usage would be ringall strategy. Then all your penalty 0’s would ring for what ever time you set it, then priority 1 agents, etc.

If that works with Ring All, then obviously that would be what I’m after. But alas!

Thanks for responding!


It is nearly 2 years since this request - do we have a way of achieving this yet?


Why system is showing “Unable to join queue ‘701’” and why call is not enter in queue.

– Executing [[email protected]:9] Set(“Zap/1-1”, “__MOHCLASS=none”) in new stack
– Executing [[email protected]:10] Set(“Zap/1-1”, “__CFIGNORE=TRUE”) in new stack
– Executing [[email protected]:11] Set(“Zap/1-1”, “__FORWARD_CONTEXT=block-cf”) in new stack
– Executing [[email protected]:12] Queue(“Zap/1-1”, “701|tr|||300”) in new stack
[Mar 11 15:53:47] WARNING[9801]: app_queue.c:4175 queue_exec: Unable to join queue ‘701’
– Executing [[email protected]:13] DBdel(“Zap/1-1”, “BLKVM/701/Zap/1-1”) in new stack
– DBdel: family=BLKVM, key=701/Zap/1-1
– Executing [[email protected]:14] Set(“Zap/1-1”, “__NODEST=”) in new stack
– Executing [[email protected]:15] Set(“Zap/1-1”, “__CFIGNORE=”) in new stack
– Executing [[email protected]:16] Set(“Zap/1-1”, “__FORWARD_CONTEXT=from-internal”) in new sta

Please suggest me.