Outbound dialer with agent as origin

Status
Not open for further replies.

NonLinearly

Free User
Joined
Jan 23, 2023
Messages
64
Reaction score
2
I have managed to make an outbound dialer based on the outbound dialer demo the 3cx has. The only change is that I use predictive mode and optimized ForCallees so the dialer initiates a call only when there is an agent available to minimized the silence time until the agent picks up the call. But even if I setup the "Pickup incoming calls automatically" on the agent machine the call rings for a while before auto picked up and there is still a time of silence, even if it is short, but which is unfortunately perceived by the person called. The are 1 second in the queue and 1 second ringing in the agent's extension. The flow is:
1. if there is available agent then cfa dialer (the caller that appears in reports as IVR (MakeCall)) makes directly the next call from the database or text file to the callee
2. if the callee answers then the call is routed to the queue
3. if there is available agent then the call is routed to the agent.
So there are 2 delay factors. The first is the time to be routed to the queue. The second the time the agent picks up the call. I do understand why even if you "Pickup incoming calls automatically" we have a small ringing time. I believe either because it takes some time for the call to be assigned to the agent or a more practical reason to alert the agent.
Whatever the reasons my question is:
Can we reverse this flow? So that the origin can be the agent. The flow:
1. if there is available agent in the queue then cfa dialer (the caller that appears in reports as IVR (MakeCall)) makes call to a free agent
2. The agent picks up the call (possibly using the "Pickup incoming calls automatically")
3. cfa dialer initiates a call to the callee based on the text file or database. (the agent may hear the call attempt such as the ringing of the outgoing call)
I understand that from this flow a question pops up about the role of the queue. I use the word queue only to describe the agents who belong to the group handling this dialer's calls. Since I understand that the queue is not relevant here I would like to know if there is another way to define a pool of agents that could service such a process that does not need to have a queue.
Note that it doesn't have to be predictive (and of course it doesn't). I'm not stuck on the name. I am interested in this particular feature so that the agent does not have to manually initiate a call at will
 
Last edited:
You can achieve this by inverting the Origin and Destination in the Make Call component.

You can use a Ring Group instead of a queue, or you can also call the agent's extension directly.
 
  • Like
Reactions: Evolute IT
You can achieve this by inverting the Origin and Destination in the Make Call component.

You can use a Ring Group instead of a queue, or you can also call the agent's extension directly.
The Origin is "859" (the queue) and the Destination is readNumberToCall.Result (the callee).
I did the reverse and nothing happens.
I suspect the next flow:
1. The dialer initiates a call to "859"
2. the call routed to the queue "859" and wait until an agent is free
3. the call is ringing to the free agent until the agent picks up the call
4. the dialer initiates the next call (readNumberToCall.Result) and assign it to the agent
 
The Origin is "859" (the queue) and the Destination is readNumberToCall.Result (the callee).
In this case the queue will be called first, and then the call will be sent to the external number. Please note that the queue will answer immediately, and the agent might not be available yet, so the customer might hear music on hold...

I suspect the next flow:
1. The dialer initiates a call to "859"
2. the call routed to the queue "859" and wait until an agent is free
3. the call is ringing to the free agent until the agent picks up the call
4. the dialer initiates the next call (readNumberToCall.Result) and assign it to the agent
No, this is incorrect. As soon as the queue answers the call, the call to the external number is initiated.
 
  • Like
Reactions: NonLinearly
One way you can use to call an available agent directly instead of using a queue, is using the GetQueueStatus and GetExtensionStatus combined. Get the agents from a queue (used for reference only), then loop through them, check the IsInCall boolean and if false, do the MakeCall with the agent as origin instead.
 
One way you can use to call an available agent directly instead of using a queue, is using the GetQueueStatus and GetExtensionStatus combined. Get the agents from a queue (used for reference only), then loop through them, check the IsInCall boolean and if false, do the MakeCall with the agent as origin instead.
At first glance it seems a good approach. But on second thought it looks like polling. Not an efficient solution since it does not initiate a call as soon as an agent is available but keeps asking until one is found. Classic poling approach. Anyway I liked the thought of using the queue as a reference.
 
At first glance it seems a good approach. But on second thought it looks like polling. Not an efficient solution since it does not initiate a call as soon as an agent is available but keeps asking until one is found. Classic poling approach. Anyway I liked the thought of using the queue as a reference.
A CFD app will always use pooling. Even the "predictive" type of dialer, it will loop every X seconds and check for availability. There are no notifications about agents getting free to hook from.
 
  • Like
Reactions: Evolute IT
In this case the queue will be called first, and then the call will be sent to the external number. Please note that the queue will answer immediately, and the agent might not be available yet, so the customer might hear music on hold...


No, this is incorrect. As soon as the queue answers the call, the call to the external number is initiated.
I have attached a print screen. You are right about the flow. But I want to ask when the dialer (IVR (MakeCall)) initiates a call? If it initiates a call when an agent (that is logged in to the queue) is free then οκ. Although from what I see there is again a 2 second silence before the agent responds (automatically) which is the same as before
 

Attachments

  • Untitled.png
    Untitled.png
    25.3 KB · Views: 12
Last edited:
But I want to ask when the dialer (IVR (MakeCall)) initiates a call? If it initiates a call when an agent (that is logged in to the queue) is free then οκ.
The dialer flow is executed in a loop, pausing the execution a few seconds between each iteration. This is not triggered immediately when the agent gets free, the dialer doesn't work with notification for such events. It will just poll for free agents in the next iteration.
 
  • Like
Reactions: Evolute IT
The dialer flow is executed in a loop, pausing the execution a few seconds between each iteration. This is not triggered immediately when the agent gets free, the dialer doesn't work with notification for such events. It will just poll for free agents in the next iteration.
I see. We have a retry policy. Max 3 calls per contact. So if the dialer can initiate call when there are not free agents then there is the possibility to "cancel" the contact without reason (dialer calls contact 3 times without confirming a free agent!). So the CheckExtensionsState.cs in the demo saves us from this complication (and is the same as what ConceptsWeb suggested). Οtherwise there would be no point in such a control if the dialer initiates a call on a notification based (otherwise event driven call).
 
As a final conclusion, there is no possibility for the dialer to initiate a call first to the agent and then the agent (automatically) to the contact, unless you consider the dialer only to make calls (dummy box) and make an application that directs it as you want step by step but this is beyond my time (and of course if such a thing can be done).
 
You define the logic of the dialer. You can check the conditions you need before making the call. So you can ensure that there is a free agent, and only in that case you make a call. You can call the agent first, and once the agent picks up, 3CX will call the external number.
 
Status
Not open for further replies.

Forum statistics

Threads
111,974
Messages
590,081
Members
164,899
Latest member
mazet