Running post-call satisfaction IVRs and pushing their results to QM

QueueMetrics includes a comprehensive Quality Assessment (QA) subsystem; it is usually used by specialized staff doing call reviews by listening to recordings of existing calls and scoring them on specific QA forms.

It would sometimes be useful to interview callers at the end of their interaction in order to track perceived quality. These interviews are usually a one- or two-question survey, in which they answer the question "Are you satisfied with our services?", where the answer is usually an IVR where they can enter a yes/no choice.

This way, you can get a general overview of perceived quality across time, and the QA team can use the results of this process to focus on cases where the caller was not satisfied.

Implementing this scenario with QueueMetrics is very simple. Here is how it goes:

  • By the end of each call, when the call is almost finished and the caller has no more questions, the agents asks the caller whether they would like to answer a simple satisfaction inquiry.

  • If they do, they are blind-transferred to an IVR, where a simple message is played back and they are given the choice to answer 1 to say they are happy with the interaction and 0 to say they are not.

  • If they answer this question, this result is pushed to QueueMetrics ans stored into a specialized QA form.

  • From the QA reports in QueueMetrics, you can then get quality overviews, per queue and per agent.

  • You use these results to target a more specific, internal QA review for calls or agents where problems appear to be more frequent.

Prerequisites

  • A working QueueMetrics system

Implementation

Step 1: Calling queues

As calls in QueueMetrics are identified by their first unique-id, it is important that the original unique-id is stored in an inheritable variable, so that it can be accessed from other channels. This is because the original call is then bridged to the agent’s channel, that in turn will transfer the call to the IVR.

exten => _900,1,Wait(1)
exten => _900,n,Answer
exten => _900,n,Playback(queue-welcome)
exten => _900,n,Set(CHANNEL(musicclass)=mymusic)
exten => _900,n,Set(__QUE=myqueue)
exten => _900,n,Set(__UID=${UNIQUEID})
exten => _900,n,Queue(${QUE},t,,,300)
exten => _900,n,Hangup

Please not how variables 'QUE' and 'UID' are made inheritable, and how we set the option 't' on the queue so that the agent can do an unattended transfer to the IVR by pressing "#" and then entering the IVR extension.

Step 2: Creating a QA form in QueueMetrics

First, we will have to go to QueueMetrics and create a QA item that will store the results. We will call it "SAT" and it will be of type Yes/No; here, the value 100 will be tracked as Yes and 0 will be tracked as No.

You could use all values from 0 to 100, or have some fixed points to represent "Bad / Neutral / Good / Very Good" instead.

Now, let’s create a simple QA form to store this information. A QA form in QueueMetrics cannot be edited / changed after the fact, and must be submitted all in one go.

We create a QA form called "SATISF", with only one section we call "Results", and to the section "Results" we add our item "SAT".

At this point, we need to create a remote user to upload this information. We go to the QueueMetrics User page, and create a new user we call "qasubmit", with password "passw0rd", belonging to class ROBOTS and including security key "QATRACK".

Step 3: Downloading the pushQA script

Though QueueMetrics requires a simple JSON API, most Asterisk systems are compiled without CURL support, so you cannot directly call a webservice from the dialplan.

We created a simple Bash script that is available in the project https://github.com/Loway/OpenQueueMetricsAddOns under "log-ivr-to-qaform" that is able to send a score for a single call.

After you download it, copy it to '/var/lib/asterisk/agi-bin/' and make it readable and executable for Asterisk.

Then edit the first lines to enter the QM URL, the username and password, the name of your form and the name of the item you need to fill in.

QM=http://127.0.0.1:8080/queuemetrics
USER=qasubmit:passw0rd
FORM=SATISF
ITEM=SAT

The script expects as parameters:

  • the Unique-id of the call that we want to grade

  • the Queue that this call was processed upon

  • The actual score (0-100)

If you want to use a QA form with multiple items, all the items must be set at once. See the QueueMetrics JSON API manual for more information on how to pass multiple items and add comments to a form.
This approach has the big advantage of being simple, but will create a new process for each request. This may not work well in high-load scenarios; in these cases, a FastAGI script will likely do.

Step 4: Setting up an IVR

This IVR will be used to send the IVR choice to the QA system:

exten => _999,1,Answer
exten => _999,n,Background(ivr_satisfaction)
exten => _999,n,Wait(10)
exten => _999,n,Hangup()

; Not happy
exten => 0,1,Playback(beep)
exten => 0,n,System(/var/lib/asterisk/agi-bin/pushQA.sh ${UID} ${QUE} 0)
exten => 0,n,Playback(thank-you)
exten => 0,n,Hangup

; Happy
exten => 1,1,Playback(beep)
exten => 1,n,System(/var/lib/asterisk/agi-bin/pushQA.sh ${UID} ${QUE} 100)
exten => 1,n,Playback(thank-you)
exten => 1,n,Hangup

; Other choice
exten => i,1,Playback(beep)
exten => i,2,Hangup()

Now, as soon as a call is completed, its result is stored in QueueMetrics and is immediately availabe for further quality inspection.