More FPBX smarts needed for failed transfers

I need to modify a working system to enhance the automatic routing/transfer/flow of calls. I’m not even sure of the correct terminology which has made searching into an adventure.

We have one receptionist, two assistants, and five non-tech experts. The receptionist answers all calls and directs calls to an expert or their assistant depending on their activity. We need those transfers to ring back to the correct place if they aren’t answered.

A worst-case example:

Customer Julie calls. She wants to speak to expert Steve, so receptionist transfers to Steve.
But, Steve’s on his cell, so after three rings the call bounces to Steve’s assistant.
But, Steve’s assistant just ate a cracker and can’t talk so after 2 rings the call bounces back to the receptionist.

I know it’s unusual, but voicemail isn’t an option.

I initially tried to solve this by creating ring groups, but it became unwieldy due to the n^x nature of transfer possibilities. I’d like to give each extension it’s own failed transfer rules but am having a hard time figuring out where to start. Between the FPBX extensions.conf, additional, custom, override, and the voicemail-centric nature of * I’m struggling.

Any ideas?


If the call always goes back to the receptionist, you can use a Follow-Me with a destination if no answer being back to the receptionist.

Hmm, that almost makes sense. I’ll play with it tomorrow.

Thinking out loud, how does Follow-Me handle nesting/cascading? Would a transfer from the receptionist to an expert follow to their assistant and then use assistant’s Follow-Me back to receptionist if neither answered, or would it be stuck in the expert’s FollowMe? I suppose the result might be the same with everyone in the list, but precedence seems scary. Does a follow-me hand over the call if it lands in another follow-me?

How about using queues?

You could have queues with no answers fall back to the receptionist.

The receptionist simply transfers the call to a dummy extension in [custom-from-internal] that sends the call to the right queue.

Thanks VoipForces. I toyed with queues and groups before but stopped when I saw the exponential growth in needing a separate group-of-one for each possible bounce branch. Seems it would work but I’d have to really hope for a hiring freeze.

I spent a few hours making Follow Me work. First with the direct extensions, and then with alternate identity extensions so I could include custom alert-info text with the bounced calls. (“Bounced call from…” and a custom ring.) Seemed great, except those alternate phone identities aren’t subscribed to by the other extensions; their busy lamps no longer work. So I’m stuck between follow-me that works with the busy lights but a very plain display, or breaking the busy lamps and having neato messages.

These are Snom 370s. I don’t see any way for a busy lamp to subscribe to more than one extension, nor any way of providing a logical combination of extensions elsewhere for the phones to subscribe to.

And I don’t see any way to send custom messages to the phones without alert-info, and that seems to mean directing to different identities (and extensions) which breaks the busy lamps.

I’m missing something. Probably several somethings.

Any help?

You might play with this a little. I wrote this to retrieve blind transfers that were not answered and pull them back to the transferring party. The piece of code in from-pstn-custom resets what happens on blind transfers. The custom-test_transfer pulls the call back to the party that initiated the transfer in the number of seconds set on the second line. I think you will have to play with this to get it to send the original call back to the receptionist, since that person was not technically the person that transferred the call the second time. This code only works when all of the extension numbers have the same number of digits.

exten => _x.,1,set(__TRANSFER_CONTEXT=custom-test_transfer|${EXTEN}|1)

exten => _X.,1,NOOP(entering custom-test_transfer)
exten => _X.,n,set(timeoutd=10) ; set timeout in seconds
exten => _X.,n,set(extLeng=${LEN(${EXTEN})})
exten => _X.,n,noop(the extenlength is ${extLeng})
exten => _x.,n,dial(local/${EXTEN}@from-internal,${timeoutd})
exten => _X.,n,Gotoif($["${DIALSTATUS}" = “ANSWER”]?hangup)
exten => _X.,n,Set(CALLERID(name)=RB:${CALLERID(name)})
exten => _X.,n(callback),dial(local/${BLINDTRANSFER:4:${extLeng}}@from-internal)
exten => _X.,n(hangup),hangup()
exten => _*X.,1,dial(local/${EXTEN}@from-internal,15)
exten => _*X.,n,hangup()

Thanks John. I was hoping to figure out code to wedge into the override files. It’s something I need to learn.

Just as soon as I figure out these busy lamps with DND. They were working fine a few months ago, but I’m hearing now they stopped somewhere along the way. Ever see busy lamps that light properly then clear after 3 seconds? Goodbye weekend!