Showing results for 
Search instead for 
Did you mean: 
Walkthrough Wednesdays

Best Practice: Setting up Agents for cross-training

The post that sparked this topic:

My contribution to this topic:

The Scenario:

Agent2 is a primary resource for Q2, which takes a lot of calls. At any given time there are always at least 5 calls in queue. Agent1 is a primary resource for Q1, which takes fewer calls than Q2, and rarely has calls waiting in queue. Agent1 is special, because he/she is cross-trained in Q2 and helps out when needed. Agent1 should never take a call for Q2 if a call for Q1 is waiting; regardless of how long the caller in Q2 has been waiting.

The Problem:

CSQs select their resources independently of what is going on in other CSQs. They only look at their own available resource pool. If a resource is available, that resource becomes the selected resource to handle the current contact; regardless of that resource's other CSQ associations.

Agent1 runs the risk of helping Q2 callers who have been waiting longer than Q1 callers, even though he/she should be primarily helping Q1 callers.

The Setup:



Agent1 (Skills: Q1 [8]; Q2 [4])

Agent2 (Skills: Q2 [8])







Q1_t1 (Most Skilled; Skill Q1 - 6 and above)

Q1_t2 (Most Skilled; Skill Q1 - 1 and above)

Q2_t1 (Most Skilled; Skill Q2 - 6 and above)

Q2_t2 (Most Skilled; Skill Q2 - 1 and above)

The Solution:

You create a tiered structure out of your CSQs.

Instead of having 10 levels of skill to choose from, you have 5. You can think of this like a 5 star rating for your agents.

We take advantage of the fact that scripts are interruptible, and at any time during a queue loop an agent becomes available, they will be placed into reserved state immediately.

We also take advantage of the fact that, if a resource is Ready in a second tier queue, then we know that there are no callers waiting in their primary queue. Otherwise, the resource would be reserved, talking, or not ready.

In your Q2 script, select from Q2_t1 first.

If queued and if Get Reporting Statistics shows > 0 resources Ready in Q2_t2, then select from Q2_t2. Dequeue if queued or if a Connect step failure occurs.

This creates a situation where Agent1, who is skilled in both CSQs, empties his/her primary queue (Q1_t1) before ever taking a call from his/her secondary queue (Q2_t2). If no calls are waiting in Q1, then he/she is still eligible to help out Q2.

Possible Problems:

1. There would be a change in the way you look at reporting.

2. There are now two CSQs, because you cannot change the skill criteria in a script.

3. In a rare instance the secondary script could get the report stats, see 1 resource ready, and right as it executes the select resource step, the primary script executes its own select resource step. Agent1 is now talking to a secondary contact, and his/her primary contact has to wait.

The likely hood of this happening increases as callers waiting in Q2 increases.


What are some of your thoughts on this topic?

How have you solved cross-training previously?

What would you add, subtract, or modify from my proposed solution?


Hi Anthony,

I just found your post about cross-training and I can only say it is great!

Actually it is really close to the be behaviour I have to implement for a customer:

- A 2 level helpdesk: level 1 takes all the calls, level 2 takes the calls that level 1 could not solve,

- Agents of level 2 can help those of level 1 if they are available (or if the number of calls in queue is too high; that point needs to be decided),

- The level 1 is a team of Agents,

- The level 2 is divided into 2 Agents teams, each one dedicated to a specific king of incident.

What I planned is the following (I reused your naming and presentation to explain it ):



For level 1 : Agent1 to Agent20 (Skills: S1 [8])

For level 2 team 1 : Agent21 to Agent Agent30 (Skills: S1 [4]; S2 [8])

For level 2 team 2 : Agent31 to Agent Agent40 (Skills: S1 [4]; S3 [8])








Q1_t1 (Most Skilled; Skill S1 - 6 and above)

Q1_t2 (Most Skilled; Skill S1 - 1 and above)

Q2 (Most Skilled; Skill S2 - 6 and above)

Q3 (Most Skilled; Skill S3 - 6 and above)

In the first script


Select resources from Q1_t1 first.

If  queued and if Get Reporting Statistics shows > 0 resources Ready in  Q1_t2, then select from Q1_t2.  Dequeue if queued or if a Connect step  failure occurs.

When Agent1 to Agent20 answer a call and cannot solve the issue, it transfers the call to the script of Q2 or Q3, depending on the kind of issue.

In the second script


There is a single script for queues Q2 and Q3: it is executed differently using a "name of queue" parameter.

Select resources from Q2/Q3.

Do you think it would be the best way to answer the need?

Also, I have understood that dequeue step is used for statistics (remove a call from the statistics of a queue): is that correct or is there another use here?

Many thanks for your answer!



Also, I have understood that dequeue step is used for statistics (remove a call from the statistics of a queue): is that correct or is there another use here?

The Dequeue step was originally to prevent a backup Agent from taking a call when there would have been a primary Agent available.

However, one thing I did not account for in my scenario was the caller's Position in Queue (PIQ) in Q1.  So technically, any random caller in Q1 could be handled in Q2 out of order in Q1, just depending on when their script was executing the Get Reporting Statistics (GRS) Step for Q2.

I.e., Caller 1 checks GRS and it equals 0; Caller 2, just milliseconds later, checks GRS and it equals 1; Now Caller 2 gets handled by a backup Agent and Caller 1 continues to wait.

One way to aliviated that would be to check the caller's PIQ in Q1, and only check Q2 when the caller's PIQ == 1.

Another way would be to remove the dequeue step, don't check any PIQ, and just leave the callers queued in both.  This way, they will be handled in both queues FIFO.

It's been a long time since I posted this, and truthfully I don't do much with Contact Centers anymore, so I have not validated what I am saying now.  This is simply a discussion of possible solutions.

Thanks for replying to my almost three and half year old post!

Anthony Holloway

Please use the star ratings to help drive great content to the top of searches.

Content for Community-Ad