Make sure signaling forward unconditional is set under voice service voip on the Cisco CUBE, otherwise CVP doesn't get informed that the call has been reconnected to the caller - and the caller just hears silence.

  • Enable Courtesy Callback in CVP Ops: System→Courtesy Callback
  • Add allowed Dialed Number, e.g. 901!, 902!, …, 909!
  • Configure Survivability Script on Gateway (See install guide)
    • CCB uses the Survivability, Handoff and specific CCB TCL Scripts
!
voice service voip
 signaling forward unconditional
sip
 min-se 7200
!
application
 service survivability flash:survivability.tcl
  param ccb id:10.123.123.123;loc:LABGW1;trunks:5
! (this vxml config - only needed if not using VVBs)
vxml version 2.0
!
  • Configure ICM EWT - as per below
  • Deploy the 4 CVP Call Studio apps - edit them as necessary (create copies of the entry and queue script).

Courtesy Callback supports expected wait time up to 90 minutes. You must set the SIP session expiration timer to a maximum value (7200) to support courtesy call back with call back time more than 30 minutes (default session expiration timer set in the gateway). The ICM router MaxTimeInQueue must be increased to an EWT of 90 minutes or 5400 seconds. The following set of configuration steps are to achieve the same.

→ Call starts to Queuing and EWT is calculated →

  • Callback_Entry
    • checks if Courtesy Callback is enabled and if all is good (via Validate steps) it flows to to pre-emptive call flow, states EWT and if EWT > threshold will offer a callback
    • If callers accepts callback and the callback number is valid, the callback is inserted into the database and call returns to ICM Scripts
    • ICM Routes (if not error) to the CallbackEngine Call Studio Script
  • CallbackEngine
    • Plays the “You call-back has been successfully scheduled. Good bye.” , disconnects the call and transfers to the CallbackWait Call Studio Script
  • CallbackWait
    • Continuously updating database and counting down the EWT. Eventually reconnecting the caller, annoucing their name and offering them the options to accept the callback. Which if they do plays “You are number one in the queue” and returns to ICM.
    • ICM then Routes the call to the CallbackQueue Call Studio Scrpit
  • CallbackQueue
    • Plays the Queue Prompts (note if caller never got offered or accepted a callback - the queue prompts are initialed within the CallbackEntry Script instead of here. But both end up using a subdialog to transfer the call to QueueApp

Callback_Entry

This is the first script used - and there are default parameters to set ANI, retry attempt etc You can also adjust the script to insert an additional zero here so the callback number is prefixed with it etc. This script calls the Callback Queue script - which simplies pays an audio file (default file is a 2 min audio file). Th keepalive value must be longer than the queue length file (defaults to 180s). If the EWT is above the max threshold (not sure why it not called min threshold!) - a callback will be offered. The callback number is pushed the database and if its an allowed number, the script returns to ICM with a number of variables (which are used by the next call studio scripts).

Queue script

As per above - if the EWT is below the threshold - no callback if offered and the call queues in this above script - and uses a sub dialog to run this script to play the relevant audio file.

Callback Engine Script

Once the callback number has been inserted into the database, this script is then called. This script confirms that the Callback has been placed and monitors for a hang-up by the caller or if the caller does not hang-up - it disconnects the customer call - but it does NOT disconnect the VXML session. Once the customer call has been disconnected - the script calls the Callback Wait Script

Callback Wait Script

This script monitors the call and checks the EWT to see when the caller should be called back. Once it calculates it is ready for the callback - it makes the outbound call to the customer. The customer has to answer the call - it replays their recorded name to them and asks if they are ready (press 1). Once they do so - it queues the call by routing the call to the ICM Scripts which then initiates the Callback Queue Script

Callback Queue

Once the callback call has been reconnected it returns to ICM and then this script is initiated. Which plays the relevant queue prompts and updates the database / checks for hang-ups etc.

Request URI: /cvp/CallbackServlet?ani=768978691&qname=billing&callid=CF8881F1676C11E980742C5A0FE69BC0&qtime=1556291641969&method=EnterQueue&version=CVP+11.5%281%29+ES%3D12+Build%3D73&ewt=60
    Request URI Path: /cvp/CallbackServlet
    Request URI Query: ani=768978691&qname=billing&callid=CF8881F1676C11E980742C5A0FE69BC0&qtime=1556291641969&method=EnterQueue&version=CVP+11.5%281%29+ES%3D12+Build%3D73&ewt=60
        Request URI Query Parameter: ani=768978691
        Request URI Query Parameter: qname=billing
        Request URI Query Parameter: callid=CF8881F1676C11E980742C5A0FE69BC0
        Request URI Query Parameter: qtime=1556291641969
        Request URI Query Parameter: method=EnterQueue
        Request URI Query Parameter: version=CVP+11.5%281%29+ES%3D12+Build%3D73
        Request URI Query Parameter: ewt=60
<?xml version="1.0" encoding="UTF-8" ?>
<result>
<status>success</status>
<new_data>
<element name="ewt" log="true" type="int" create="after_exit">0</element>
</new_data>
<version>CVP_11_5</version>
</result>

Validate

Request URI: /cvp/CallbackServlet?scc=n&qname=billing&callid=CF8881F1676C11E980742C5A0FE69BC0&pcc=y&gw=10.123.123.123&capacity=3&method=Validate&inqueue=y&version=CVP+11.5%281%29+ES%3D12+Build%3D73&ewt=60
    Request URI Path: /cvp/CallbackServlet
    Request URI Query: scc=n&qname=billing&callid=CF8881F1676C11E980742C5A0FE69BC0&pcc=y&gw=10.123.123.123&capacity=3&method=Validate&inqueue=y&version=CVP+11.5%281%29+ES%3D12+Build%3D73&ewt=60
        Request URI Query Parameter: scc=n
        Request URI Query Parameter: qname=billing
        Request URI Query Parameter: callid=CF8881F1676C11E980742C5A0FE69BC0
        Request URI Query Parameter: pcc=y
        Request URI Query Parameter: gw=10.123.123.123
        Request URI Query Parameter: capacity=3
        Request URI Query Parameter: method=Validate
        Request URI Query Parameter: inqueue=y
        Request URI Query Parameter: version=CVP+11.5%281%29+ES%3D12+Build%3D73
        Request URI Query Parameter: ewt=60
<?xml version="1.0" encoding="UTF-8" ?>
<result>
<status>success</status>
<new_data>
<element name="result" log="true" type="string" create="after_exit">refresh</element>
</new_data>
<version>CVP_11_5</version>
</result>

SetQueueDefaults

Request URI [truncated]: /cvp/CallbackServlet?busy=3%3B300&version=CVP+11.5%281%29+ES%3D12+Build%3D73&th=00%3A00%3A00-23%3A59%3A59&qname=billing&trunksbusy=3%3B60&maxewt=60&rna=30&su=00%3A00%3A00-23%3A59%3A59&fr=00%3A00%3A00-23%3A59%3A59&r
    Request URI Path: /cvp/CallbackServlet
    Request URI Query [truncated]: busy=3%3B300&version=CVP+11.5%281%29+ES%3D12+Build%3D73&th=00%3A00%3A00-23%3A59%3A59&qname=billing&trunksbusy=3%3B60&maxewt=60&rna=30&su=00%3A00%3A00-23%3A59%3A59&fr=00%3A00%3A00-23%3A59%3A59&reconnect_time=3
        Request URI Query Parameter: busy=3%3B300
        Request URI Query Parameter: version=CVP+11.5%281%29+ES%3D12+Build%3D73
        Request URI Query Parameter: th=00%3A00%3A00-23%3A59%3A59
        Request URI Query Parameter: qname=billing
        Request URI Query Parameter: trunksbusy=3%3B60
        Request URI Query Parameter: maxewt=60
        Request URI Query Parameter: rna=30
        Request URI Query Parameter: su=00%3A00%3A00-23%3A59%3A59
        Request URI Query Parameter: fr=00%3A00%3A00-23%3A59%3A59
        Request URI Query Parameter: reconnect_time=30
        Request URI Query Parameter: keepalive=180
        Request URI Query Parameter: refresh=1
        Request URI Query Parameter: dnis=5901
        Request URI Query Parameter: maxcnt=9999999
        Request URI Query Parameter: mo=00%3A00%3A00-23%3A59%3A59
        Request URI Query Parameter: noresponse=3%3B300
        Request URI Query Parameter: error=3%3B60
        Request URI Query Parameter: cli=12260
        Request URI Query Parameter: burst=10%3A1
        Request URI Query Parameter: maxpct=100
        Request URI Query Parameter: tz=GB-Eire
        Request URI Query Parameter: tu=00%3A00%3A00-23%3A59%3A59
        Request URI Query Parameter: SLA_time=60
        Request URI Query Parameter: sa=00%3A00%3A00-23%3A59%3A59
        Request URI Query Parameter: method=SetQueueDefaults
        Request URI Query Parameter: noanswer=3%3B300
        Request URI Query Parameter: we=00%3A00%3A00-23%3A59%3A59
<?xml version="1.0" encoding="UTF-8" ?>
<result>
<status>success</status>
<version>CVP_11_5</version>
</result>

Validate

Request URI: /cvp/CallbackServlet?scc=n&qname=billing&callid=CF8881F1676C11E980742C5A0FE69BC0&pcc=y&gw=10.123.123.123&capacity=3&method=Validate&inqueue=y&version=CVP+11.5%281%29+ES%3D12+Build%3D73&ewt=60
    Request URI Path: /cvp/CallbackServlet
    Request URI Query: scc=n&qname=billing&callid=CF8881F1676C11E980742C5A0FE69BC0&pcc=y&gw=10.123.123.123&capacity=3&method=Validate&inqueue=y&version=CVP+11.5%281%29+ES%3D12+Build%3D73&ewt=60
        Request URI Query Parameter: scc=n
        Request URI Query Parameter: qname=billing
        Request URI Query Parameter: callid=CF8881F1676C11E980742C5A0FE69BC0
        Request URI Query Parameter: pcc=y
        Request URI Query Parameter: gw=10.123.123.123
        Request URI Query Parameter: capacity=3
        Request URI Query Parameter: method=Validate
        Request URI Query Parameter: inqueue=y
        Request URI Query Parameter: version=CVP+11.5%281%29+ES%3D12+Build%3D73
        Request URI Query Parameter: ewt=60
<?xml version="1.0" encoding="UTF-8" ?>
<result>
<status>success</status>
<new_data>
<element name="result" log="true" type="string" create="after_exit">preemptive</element>
</new_data>
<version>CVP_11_5</version>
</result>

AddCallback

Request URI [truncated]: /cvp/CallbackServlet?rec=http%3A%2F%2F10.123.123.100%3A7000%2FCVP%2Faudio%2Faudio1556291659624640.wav&ani=00858769707&callid=CF8881F1676C11E980742C5A0FE69BC0&gw=10.123.123.123&loc=labgw&method=AddCallback&type=p&version=CV
    Request URI Path: /cvp/CallbackServlet
    Request URI Query [truncated]: rec=http%3A%2F%2F10.123.123.100%3A7000%2FCVP%2Faudio%2Faudio1556291659624640.wav&ani=00858769707&callid=CF8881F1676C11E980742C5A0FE69BC0&gw=10.123.123.123&loc=labgw&method=AddCallback&type=p&version=CVP+11.5%281%29+E
        Request URI Query Parameter: rec=http%3A%2F%2F10.123.123.100%3A7000%2FCVP%2Faudio%2Faudio1556291659624640.wav
        Request URI Query Parameter: ani=00858769707
        Request URI Query Parameter: callid=CF8881F1676C11E980742C5A0FE69BC0
        Request URI Query Parameter: gw=10.123.123.123
        Request URI Query Parameter: loc=labgw
        Request URI Query Parameter: method=AddCallback
        Request URI Query Parameter: type=p
        Request URI Query Parameter: version=CVP+11.5%281%29+ES%3D12+Build%3D73
<?xml version="1.0" encoding="UTF-8" ?>
<result>
<status>success</status>
<new_data>
<element name="result" log="true" type="string" create="after_exit">valid</element>
</new_data>
<version>CVP_11_5</version>
</result>

GetStatus

Request URI: /cvp/CallbackServlet?qname=billing&callid=CF8881F1676C11E980742C5A0FE69BC0&qtime=1556291641969&method=GetStatus&version=CVP+11.5%281%29+ES%3D12+Build%3D73
    Request URI Path: /cvp/CallbackServlet
    Request URI Query: qname=billing&callid=CF8881F1676C11E980742C5A0FE69BC0&qtime=1556291641969&method=GetStatus&version=CVP+11.5%281%29+ES%3D12+Build%3D73
        Request URI Query Parameter: qname=billing
        Request URI Query Parameter: callid=CF8881F1676C11E980742C5A0FE69BC0
        Request URI Query Parameter: qtime=1556291641969
        Request URI Query Parameter: method=GetStatus
        Request URI Query Parameter: version=CVP+11.5%281%29+ES%3D12+Build%3D73
<?xml version="1.0" encoding="UTF-8" ?>
<result>
<status>success</status>
<new_data>
<element name="startCallback" log="true" type="boolean" create="after_exit">true</element>
<element name="ewt" log="true" type="int" create="after_exit">0</element>
<element name="qpos" log="true" type="int" create="after_exit">0</element>
<element name="DQRateA" log="true" type="int" create="after_exit">60</element>
<element name="DQRateB" log="true" type="int" create="after_exit">0</element>
<element name="ReconnectTime" log="true" type="int" create="after_exit">30</element>
<element name="cli" log="true" type="string" create="after_exit">12260</element>
<element name="rna" log="true" type="int" create="after_exit">30</element>
<element name="dn" log="true" type="string" create="after_exit">00858769707</element>
<element name="rec" log="true" type="string" create="after_exit">http://10.123.123.100:7000/CVP/audio/audio1556291659624640.wav</element>
</new_data>
<version>CVP_11_5</version>
</result>

UpdateStatus

Request URI: /cvp/CallbackServlet?status=INPROGRESS&callid=CF8881F1676C11E980742C5A0FE69BC0&method=UpdateStatus&version=CVP+11.5%281%29+ES%3D12+Build%3D73
    Request URI Path: /cvp/CallbackServlet
    Request URI Query: status=INPROGRESS&callid=CF8881F1676C11E980742C5A0FE69BC0&method=UpdateStatus&version=CVP+11.5%281%29+ES%3D12+Build%3D73
        Request URI Query Parameter: status=INPROGRESS
        Request URI Query Parameter: callid=CF8881F1676C11E980742C5A0FE69BC0
        Request URI Query Parameter: method=UpdateStatus
        Request URI Query Parameter: version=CVP+11.5%281%29+ES%3D12+Build%3D73
<?xml version="1.0" encoding="UTF-8" ?>
<result>
<status>success</status>
<new_data>
<element name="result" log="true" type="string" create="after_exit">done</element>
</new_data>
<version>CVP_11_5</version>
</result>

The EWT is originally calculated in the ICM script. However, the reporting server recalculates the EWT based on the calls received, calls in queue, calls offered CCB and some other parameters. Because of this, the EWT could be lower than the one mentioned to the caller when offered a callback. Some caller have a problem with this because they program their activities based on the EWT. In 11.5. CVP incorporated a variable that can be set to turn off the dynamic EWT calculation.

This is contained in C:\Cisco\CVP\conf\reporting.properties

RPT.DynamicEwtCalculationEnabled = true

The EWT prompt in minutes is calculated using the following formula in the CVP Call Studio 'CallbackEntry' app:

((({Data.Session.ewt}/60 * 1000000000000000) - (({Data.Session.ewt}/60 * 1000000000000000) % 1000000000000000))/1000000000000000) + 1
Prompt Name Prompt Text
CCANIPart1.wav If you would like to call you back at:
CCANIPart2.wav Press 1 , to use a different callback number press 2
CCAskIfCallerReadyPart1.wav Hello this is a callback for:
CCAskIfCallerReadyPart2.wav Press 1 if you are ready to speak to an advisor, press 2 if you need time to bring that person to the telephone, press 3 to cancel this callback
CCAskIfCallerReadyPart3.wav Press 3 to cancel this callback
CCConfirmANIPart1.wav You entered:
CCConfirmANIPart2.wav Is that correct? Press 1 for yes, press 2 for no.
CCError.wav I'm sorry, the callback has been cancelled, if you would like to wait for an advisor, simply stay on the line.
CCGoodbye.wav You call-back has been successfully scheduled. Good bye.
CCGoodbyeCanceled.wav The callback has been permanently cancelled at your request. Good bye.
CCNoANI.wav Please enter your callback telephony number following by the hash key
CCPhoneNotValid.wav That telephony format is incorrect.
CCPreemptivePart1.wav If you would like us to call back in about:
CCPreemptivePart2.wav minutes, press 1.
CCPress1WhenReady.wav Press 1 when you are ready to speak to an advisor.
CCRecordName.wav At the tone, please record your name and then press the hash key.
CCStayOnLine.wav If you would like to wait for an advisor, simply stay on the line.
CCUseDifferentCallbackNumber.wav Please use a different callback number.
CCWaitTimePart1.wav All advisors are currently busy, your current wait time is approximately:
CCWaitTimePart2.wav minutes.
CCYouAreNumber1InQueue.wav You are currently number 1 in the queue and an advisor will be with you shortly.

ValidValue(((SkillGroup.%1%.RouterCallsQNow)*trunc((ValidValue(SkillGroup.%1%.AvgHandledCallsTimeTo5,%2%))/max(SkillGroup.%1%.Ready,(SkillGroup.%1%.TalkingIn+SkillGroup.%1%.TalkingOut+SkillGroup.%1%.TalkingOther)))),%2%)

Create another Custom function to call the above custom function for each CCB Queue / Resource Pool. If you have multiple skill groups which use the SAME agents - then add the EWT as per below. If there is a percentage of agents in the other skillgroups - enter the percent as a decimal - as per below

userEWT_1SkillGroup(Benefits_IVR,406) + 
trunc((0.50)*userEWT_1SkillGroup(CustService_IVR,376)) + 
trunc((0.75)*userEWT_1SkillGroup(Sales,278))

Alias Setup

As per the CUIC Datastore setup use the username cvp_dbuser

CVP Data Database

jdbc:informix-sqli://<hostname>:1526/cvpdata:INFORMIXSERVER=cvp;

CVP Callback Database

jdbc:informix-sqli://<hostname>:1526/callback:INFORMIXSERVER=cvp;

*https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cust_contact/contact_center/customer_voice_portal/cvp11_5/configuration/guide/CCVP_BK_1709778C_00_115-reporting-guide/CCVP_BK_1709778C_00_115-reporting-guide_chapter_0100.html#CCVP_RF_E79F9CC8_00

EventTypeId EventType
0 New Call
1 Connect Failure
2 Busy
3 No Answer
4 Answer
5 Abandon
6 Disconnect
7 Hang Up
8 App Transfer
9 App Session Complete
10 Call Transfer
11 Run Script
12 Agent Recording
13 ICM Recording
14 Agent Video
15 ICM Video
16 Bridge Transfer
17 Blind Transfer
18 ReqICMLabel
19 Audio Recording
20 Callback Canceled
21 Callback Pending
22 Callback In Progress
23 Callback Tentative
24 Callback Complete
25 Callback Recover
26 Callback Created
27 Callback Dropped from queue
28 Callback Added to queue
29 Max allowed callbacks for this ANI has been exceeded
causeid cause
0 None
1 Normal Completion
2 Call Abandon
3 Call Transferred
4 New Transaction
5 Busy
6 No Answer
7 Maintenance
8 Net Congestion
9 Net Not Obtainable
10 Reorder Tone
11 Resources Not Available
12 Trunks Busy
13 Called Party Disconnected
14 Max Ports
15 Suspended
16 Time Out
17 Invalidated
18 Error
19 Video Answered
20 Post Call Answer
21 Invalid
22 Failure
23 Audio Recording Start
24 Audio Recording Stop
25 No Response
26 Invalid Number
27 Connected
28 Caller Canceled
29 Whisper Start
30 Whisper Done
31 Whisper Setup Failed
32 Abandon In Whisper
33 Whisper Media Error
1001 Hang Up
1002 Network
1003 System
1004 Script Type
1005 Unknown UApp
1006 Script Name
1007 Config Param
1008 Misconfig Ecc
1009 Media File
1010 Semantic
1011 VXML Format
1012 VXML Element
1013 Variable Data
1014 No Var Data
1015 Format
1016 Entry Invalid
1017 No Entry
1018 Media Resource Video
1019 Recording Failed
1020 Data Range
1021 Timed Out
1022 Called Hung Up
1023 No Answer
1024 Busy
1025 Gen Transfer
1026 Invalid Extn
1027 Hang Up Forced
1028 After Trans Estab
1030 Unsupported Language
1031 Media Resource ASR
1032 Media Resource TTS
1033 General ASR TTS
1034 Unknown Error
1035 Missing Configuration
1036 Duplicate Record
1037 Not in Queue
1039 Unknown Callguid
1040 CVP System Unavailable
1041 CVP App Error
1042 CVP App Hang Up
1043 CVP App Suspended
1044 CVP No Session Error
1045 CVP Bad Fetch
1046 No Streaming Media Resource TTS

Callbacks Counts by Event Type

SELECT 
eventtype AS EventType,
COUNT(*) AS NumOfCalls
 
FROM 
CallBack, 
EventTypeRef
 
WHERE CallBack.EventTypeID=EventTypeRef.EventTypeID
 
GROUP BY eventType
ORDER BY eventType

As above - but group by date

SELECT 
callstartdate AS StartDate,
eventtype AS EventType,
COUNT(*) AS NumOfCalls
 
FROM 
CallBack, 
EventTypeRef
 
WHERE CallBack.EventTypeID=EventTypeRef.EventTypeID
GROUP BY
callstartdate, 
eventType 
 
ORDER BY eventType

CUIC Versions of above

SELECT 
callstartdate AS StartDate,
eventtype AS EventType,
nbrattempts AS NumOfAttempts,
cause AS Cause,
COUNT(*) AS NumOfCalls
 
FROM 
CallBack, 
EventTypeRef, 
CauseRef
 
WHERE (weekday(callstartdate) IN(1,2,3,4,5,6,0) AND callstartdate BETWEEN '12-01-2020' AND '12-31-2020') AND CallBack.EventTypeID=EventTypeRef.EventTypeID
AND CallBack.causeid=CauseRef.causeid
 
GROUP BY 
callstartdate, 
eventType, 
cause,
nbrattempts
 
ORDER BY callstartdate, eventType, Cause

I got the “NOT_IN_QUEUE” error (see below how to determine the error) - when I incorrectly set (didn't set) the couresty callback enabled ECC variable.
So “NOT_IN_QUEUE” means that the CCB wasn't enabled and hence no the Callback Entry Call Studio app didn't go via the Preemtive“ route after validating the call against. So went straight to queue and not to the EWT prompt.

  1. Collect Activity logs from the CallbackEntry application from the Voice Extensible Markup

Language (VXML) Server.

  1. Search within the Activity logs for any call where validation is none:

Validate_02,data,result,none Which means that validation did not pass. Obtain the GUID for this call. Filter the call by the activity callid and look for a callid like this example: start,parameter,callid=BBBBAAAACCCCDDDDEEEEFFFFAAAABBBB

  1. Collect CVP reporting logs for the Reporting Server. Find the same callid in the CVP

Reporting logs. ValidateHandler:ValidateHandler.exec: ValidateHandler GUID=BBBBAAAACCCCDDDDEEEEFFFFAAAABBBB results:none validation status bitmask=0x00000103

  1. Convert the bitmask number to binary. Use a programmer calculator: 0001 00000011
  2. Check the CVP Reporting guide bitmask for CCB tables. You should see that validation

fails because of “EXCEED_CAPACITY_GW”.

00000000 00000001 OK
00000000 00000010 ICM_NO_SCHEDULED_ALLOWED
00000000 00000100 ICM_NO_PREEMPTIVE_ALLOWED
00000000 00001000 NOT_IN_QUEUE
00000000 00010000 TOD
00000000 00100000 EWT
00000000 01000000 PROBE_FAILED_NO_RESPONSE
00000000 10000000 PROBE_FAILED_NO_CONFIG
00000001 00000000 EXCEED_CAPACITY_GW
00000010 00000000 EXCEED_CAPACITY_QUEUE
Note: ICM_NO_SHCEDULED_ALLOWED and the OK bit are always set

Make sure that the CUBE / Gateway is setup with

voice service voip
 signaling forward unconditional
  • vendors/cisco/uc/cvp/ccb.txt
  • Last modified: 2023/05/15 11:44
  • by gerardorourke