Remote Call Center - Attended (Warm) Transfer


I have a queue that is staffed by remote agents using find me follow me to answer the queue calls from their cell phones. This is using the FreePBX distro. There is an issue in that when a remote agent transfers the call using the *2 or ## feature codes (attended & blind transfer), they will not get another queue call until the call they transferred disconnects from Asterisk. Working with the forum, we got a new code (#48) that let us blind transfer the call and have the remote agent immediately receive the next queue call, as soon as the transfer completes.

Working Blind Transfer Code:

ccredirect => #48,self/caller,Gosub(chan-redirect,s,1)
exten => _.,1,Set(__DYNAMIC_FEATURES=ccredirect)
exten => _.,n,Goto(from-pstn,${EXTEN},1)
exten => s,1,Set(FM_user=${CUT(UNIQCHAN,@,1)}) 
exten => s,n,GotoIf($["${DB_EXISTS(AMPUSER/${CUT(FM_user,/,2)}/cidnum)}" != "1"]?done) 
exten => s,n,Read(ext_to_transfer,custom/please-enter-ext-number,4,,2,5) 
exten => s,n,ChannelRedirect(${BRIDGEPEER},from-internal,${ext_to_transfer},1)
exten => s,n(done),Return()

How can I modify the blind transfer code above to allow for an attended transfer?


  • Press #48
  • Queue caller put on hold
  • Agent enters the transfer to party extension
  • Agent connects and consults with transfer to party
  • Press some combination of buttons to connect the queue caller with the transfer to party
  • The agent is dropped from the channel path, allowing them to receive the next queue call right away

Any ideas? Thanks in advance!

I think you are going to have to solve this empirically. What you are already doing seems to me to be outside the supported use of features, as it undermines the dialplan execution that ran the Dial application that is handling the feature code. As such, I don’t think anyone can safely propose a way of doing it, if they haven’t done it themselves.

I’d suggest a cleaner approach is to use local channel upstream of Queue/Dial and letting the DTMF propagate through to that, so you can use the built-in transfer features. However that is on the basis of Asterisk. FreePBX may well get in the way.

Generally, because FreePBX could get in the way with any of this, you need to ask on the FreePBX forum.

When the company I worked for did something like this they weren’t using FreePBX, and the transfer was initiated from a PC, not the phone keypad, so we could use AMI. We used an upstream local channel. That was a decision made before I even got involved, and I never really analysed whether it was really necessary.

let me ask this then. I found something that is super-close to what I am looking for:

 exten => s,1,Set(CONFNO=${FindFreeConf()})
 exten => s,n,ChannelRedirect(${BRIDGEPEER},dynamic-nway,${CONFNO},1)
 exten => s,n,Read(DEST,dial,,i)
 exten => s,n,Set(DYNAMIC_FEATURES=nway-inv#nway-noinv)
 exten => s,n,Dial(Local/${DEST}@dynamic-nway-dest,,g)
 exten => s,n,Set(DYNAMIC_FEATURES=)
 exten => s,n,Goto(dynamic-nway,${CONFNO},1)

instead of step 2 happening right away, is there a way to put the caller on hold or stasis, until you press **? Then the new party you dial second goes to conference first, you go back to the original caller, then you channel redirect the caller to the conference and disconnect. I need to avoid the channel redirect until I am ready to hang up the call (when the two parties are conferenced together).