URA: como automatizar atendimento e integrar telefonia com seu sistema

DID, Ura, Menu e Atendimento Telefônico. Veja como funcionam os serviços da TotalVoice para ajudar na automação da sua empresa.

É muito bom quando podemos resolver algum problema sem precisar ligar e falar com diversos atendentes, certo?
Pense no seguinte cenário: você precisa pagar um boleto que está atrasado, liga para a empresa, a pessoa que te atende não está de bom-humor, você não está de bom-humor, ela transfere para outra pessoa que demora para atender, demora para consultar no sistema, qual a sua experiência com tudo isso?

Mas se pudéssemos coletar dados, processá-los em seu sistema, montar menus e respostas totalmente dinâmicas, personalizadas e automatizadas durante o atendimento telefônico, já conseguiríamos montar uma solução melhor para esse atendimento (e muitos outros).

Abaixo, um caminho interessante para o cliente seguir:

DID, Ura, Menu e Atendimento Telefônico

DID (Direct Inward Dialing) é um número de telefone quando está alocado ou portado para a Zenvia para que quando receba uma ligação, caia diretamente em uma URA ou até mesmo diretamente em um ramal (que não iremos detalhar por enquanto). Já as URAs (Unidade de Resposta Audível) conhecidas também por atendentes eletrônicas, são atendimentos compostos de áudios, textos (falados), e até as famosas musiquinhas, onde você pode digitar opções que lhe transferem para algum menu, ramal, fila de ramais e até mesmo para outras URAs, e os menus nada mais são do que partes da própria URA.

Criar URA

Com isso já conseguimos criar um atendimento básico onde o cliente pode ser redirecionado para um setor específico de sua própria escolha, e que é comum na maioria das empresas, você pode montar uma URA rapidamente pelo Painel ou pela ZenAPI, experimente. Mas como eu faço para coletar informações nessa tal de URA e como eu envio elas para o meu sistema?

URAs Dinâmicas e poder de fogo

É aqui que entra o verdadeiro poder e onde as possibilidades começam a ficar mais interessantes, em vez de montarmos a URA diretamente na plataforma de voz da Zenvia, que tal pedirmos para a Zenvia solicitar a URA diretamente no nosso próprio sistema? Escolhemos então a opção Dinâmico e colocamos a URL para onde será enviado um HTTP POST para solicitar a URA à ser carregada, o POST envia algumas informações, como o telefone que está ligando e a última opção digitada no telefone pelo cliente, tudo em JSON, claro:

{
   "chamada_recebida_id":"ID da chamada",
   "from":"Número do cliente",
   "to":"Número do DID",
   "ultimo_dtmf":"Última opção digitada",
   "tags":"Tags personalizadas"
}

E espera um retorno, também em JSON, com as informações da URA, como no exemplo abaixo:

{
   "nome":"Menu Principal",
   "dados":[
      {
         "acao":"tts",
         "acao_dados":{
            "mensagem":"Bom Dia, você ligou para à TotalVoice"
         }
      },
      {
         "acao":"audio",
         "acao_dados":{
            "url_audio":"https://www.totalvoice.com.br/audio/musica_calma.mp3"
         }
      },
      {
         "acao":"transferir",
         "acao_dados":{
            "numero_telefone":"4004"
         }
      }
   ]
}

Cada uma das ações será executada na ordem, então, o cliente irá ouvir “Bom dia, você ligou para a TotalVoice”, depois, ouvirá a musica_calma.mp3 e, somente após isso, será transferido para o ramal 4004, são muitas as ações disponíveis.

Agora fica fácil criar uma URA dinâmica simples, vá até o Painel (ou utilize a API), crie uma URA com a opção dinâmico e defina a URL que irá ser consultada:

E aqui o script que vamos utilizar para receber o POST da URA dinâmica, faremos em PHP:

// Recebo o JSON enviado pela TotalVoice
$php_input = file_get_contents("php://input");
$dados_recebidos = json_decode($php_input);

// Crio as ações que serão realizadas
$dados_tts['acao'] = 'tts';
$dados_tts['acao_dados']['mensagem'] = 'Bem vindo à TotalVoice';

$dados_audio['acao'] = 'audio';
$dados_audio['acao_dados']['url_audio'] = 'https://www.totalvoice.com.br/audio/musica_calma.mp3';

// Coloco em uma array de dados
$dados = array($dados_tts, $dados_audio);

// Monto a array de saída
$menu_resposta = array(
    'nome' => 'Menu Principal',
    'dados' => $dados
);

// Respondo o JSON
header('Content-Type: application/json');
die(json_encode($menu_resposta));

Pronto, temos uma URA dinâmica, simples, onde ao receber uma ligação, ela consulta um script seu (API REST, manda e recebe JSON) e monta diretamente no seu sistema.

Coletando informações

Mas ainda não descobrimos um jeito de solicitar alguma informação para o cliente (que chamamos de DTMF), para isso, adicionamos na ação de TTS (só podem ser coletados dados em TTS e Áudio) a opção “coletar_dtmf” com o número de dígitos que iremos solicitar e um timeout que é o tempo que o cliente terá para inserir os dados

// Pode ser um TTS ou um Áudio anteriormente gravado
$dados_tts['acao'] = 'tts';
$dados_tts['acao_dados']['mensagem'] = 'Bem vindo à TotalVoice, por favor, digite seu CPF';

// Vou coletar 11 digitos (CPF) em um tempo de 20 segundos
$dados_tts['coletar_dtmf'] = '11';
$dados_tts['timeout'] = '20';

Hora da mágica

Ok, temos uma URA criada dinamicamente, ela solicita para o cliente digitar o CPF, coletamos esse dado, mas como recebemos ele? Lembra daquele JSON que é enviado quando é solicitada a URA Dinâmica? Ali está o nosso menino: ultimo_dtmf, e para recebermos ele após já ter sido enviado o JSON inicialmente (quando recebemos a ligação), vamos fazer uma simples mágica, mandar uma outra URA dinâmica nesse JSON, criando um ciclo.

// Crio primeiro o texto que será falado e os digitos que serão coletados após o texto
// Pode ser um TTS ou um Áudio anteriormente gravado
$dados_tts['acao'] = 'tts';
$dados_tts['acao_dados']['mensagem'] = 'Bem vindo à Zenvia, por favor, digite seu CPF';
// Vou coletar 11 digitos (CPF) em um tempo de 20 segundos
$dados_tts['coletar_dtmf'] = '11';
$dados_tts['timeout'] = '20';

// Aqui criamos o retorno para o próximo passo
$dados_dinamico['acao'] = 'dinamico';
$dados_dinamico['acao_dados']['url'] = 'https://www.totalvoice.com.br/exemplo_ura_dinamica.php?menu=consultaCPF';

$dados = array($dados_tts, $dados_dinamico);

Veja que colocamos um parâmetro chamado menu, para identificarmos onde o atual cliente está na nossa URA, agora precisamos deixar nosso script organizado:

$menu = $_REQUEST['menu'];
$dados = array();

$php_input = file_get_contents("php://input");
$dados_recebidos = json_decode($php_input);

// Verificamos o request da URA
if ($_REQUEST['menu'] == 'consultaCPF') {
    $cpf = $dados_recebidos->ultimo_dtmf;

    // Processamos o CPF aqui

} else {
    $dados_tts['acao'] = 'tts';
    $dados_tts['acao_dados']['mensagem'] = 'Bem-vindo a Zenvia, por favor, digite seu CPF';
    $dados_tts['coletar_dtmf'] = '11';
    $dados_tts['timeout'] = '20';

    $dados_dinamico['acao'] = 'dinamico';
    $dados_dinamico['acao_dados']['url'] = 'https://www.totalvoice.com.br/exemplo_ura_dinamica.php?menu=consultaCPF';

    $dados = array($dados_tts, $dados_dinamico);
}

$menu_resposta = array(
    'nome' => 'Menu Principal',
    'dados' => $dados
);

header('Content-Type: application/json');
die(json_encode($menu_resposta));

Se vier com um parâmetro chamado “menu” com o valor de “consultaCPF”, sabemos que coletou os 11 dígitos e é para consultar o CPF, mas ainda temos um problema, se o cliente digitar um CPF inválido, como faço para repetir?

Simples, criamos um TTS e um Dinâmico reenviando o mesmo endereço de URL, criando um loop:

$cpf = $dados_recebidos->ultimo_dtmf;

// Aqui podemos validar o CPF detro do sistema (Ficticio)
$cpf_valido = validarCPF($cpf);

if($cpf_valido) {

} else {
	$dados_tts['acao'] = 'tts';
	$dados_tts['acao_dados']['mensagem'] = 'CPF não encontrado, por favor, digite novamente';
	$dados_tts['coletar_dtmf'] = '11';
	$dados_tts['timeout'] = '20';

	// Aqui criamos o retorno para esse mesmo passo
	$dados_dinamico['acao'] = 'dinamico';
	$dados_dinamico['acao_dados']['url'] = 'https://www.totalvoice.com.br/exemplo_ura_dinamica.php?menu=consultaCPF';

	$dados = array($dados_tts, $dados_dinamico);

Filas e URAs, automatizando o redirecionamento de chamadas

O cliente liga para a empresa, pedimos o CPF, enviamos para nosso sistema e verificamos que ele é válido, mas ainda faltou algo muito importante, redirecionar o cliente para o setor (ou ramal) correto, aí que surge o conceito de Filas, nada mais é do que um agrupamento de ramais, onde você pode redirecionar uma ligação para que algum dos ramais daquela Fila atenda, e para melhor organizar, a Fila está dividida em dois tipos: Toca todos os ramais ao mesmo tempo e Toca um ramal por vez.

Para criar sua fila é muito fácil, acesse o Painel Zenvia de Voz, Central -> Filas e clique em Criar Fila

Após salvar, você vai poder adicionar quantos Ramais forem necessários, no nosso exemplo, todos os ramais do setor financeiro, agora a parte do script que transfere para uma fila é tão simples quanto, temos a ação ‘fila’, com o ‘fila_id’ sendo o id da fila que se deseja transferir.

// Transfere a chamada para uma fila de ramais
$dados_fila['acao'] = 'fila';
$dados_fila['acao_dados']['fila_id'] = 5; //ID da Fila

Para continuar nosso exemplo, vamos verificar o CPF do cliente, e se for um CPF válido verificamos se tem alguma pendência com o setor financeiro, avisando o cliente e transferindo ele diretamente para lá:

$valor_divida = verificaFinanceiro($cpf);
if($valor_divida > 0) {
	// Avisa que há problemas financeiros
	$dados_tts['acao'] = 'tts';
	$dados_tts['acao_dados']['mensagem'] = 'Você tem uma fatura de ' . $valor_divida . ' reais em aberto, estamos transferindo sua chamada para o setor financeiro';

	// Transfere a chamada para uma fila de ramais
	$dados_fila['acao'] = 'fila';
	$dados_fila['acao_dados']['fila_id'] = 5; //ID da Fila do setor financeiro

	$dados = array($dados_tts, $dados_fila);
} 

E caso nosso cliente não tiver nenhuma dívida, damos duas opções para ele selecionar, 1 para setor de vendas (Fila de vendas), 2 para gerência (Fila de gerencia):

$dados_tts['acao'] = 'tts';
$dados_tts['acao_dados']['mensagem'] = 'Para falar com vendas, tecle 1, para falar com gerência, tecle 2';

// Adiciona duas opções de menus que vão para suas respectivas filas
// Ao escolher opção 1, vai para fila de vendas
$dados_fila_vendas['opcao'] = '1';
$dados_fila_vendas['acao'] = 'fila';
$dados_fila_vendas['acao_dados']['fila_id'] = 6; //ID da Fila do setor de vendas

// Ao escolher opção 2, vai para fila da gerência
$dados_fila_gerencia['opcao'] = '2';
$dados_fila_gerencia['acao'] = 'fila';
$dados_fila_gerencia['acao_dados']['fila_id'] = 7; //ID da Fila da gerência

$dados = array($dados_tts, $dados_fila_vendas, $dados_fila_gerencia);

Repare que não precisamos avisar a URA que ela irá coletar o dtmf dessa vez, pois ao especificar uma opção na ação, ele automaticamente vincula ela com aquele digito.

O céu é o limite

Com as URAs dinâmicas, pode-se criar um fluxo inteiro de coleta e consulta de dados, acelerando e muito o atendimento do cliente, se tornando uma ferramenta poderosa, tendo o custo baixo acompanhado de muitos benefícios em ter uma automação em alto nível.

Ações disponíveis na URA Dinâmica e na API

{
   "nome":"Menu Principal",
   "dados":[
      { // TTS
         "acao":"tts",
		 "coletar_dtmf":"10", // Quantidade de dígitos para coletar (Opcional)
		 "timeout":"0", // Caso coletar digitos, quantos segundos esperar (Opcional)
         "acao_dados":{
			// Uma mensagem que será lida (texto falado)
            "mensagem":"Bom Dia, você ligou para Zenvia" 
         }
      },
      { // Tocar áudio
         "acao":"audio",
		 "coletar_dtmf":"10", // Quantidade de dígitos para coletar (Opcional)
		 "timeout":"0", // Caso coletar digitos, quantos segundos esperar (Opcional)
         "acao_dados":{
			// MP3 que irá tocar
            "url_audio":"https://www.totalvoice.com.br/audio/musica_calma.mp3" 
         }
      },
      { // Transferir Chamada
         "acao":"transferir",
         "acao_dados":{
			// Número de ramal ou externo para transferir a chamada
            "numero_telefone":"1133011115" 
         }
      },
      { // Transferir para Fila
         "acao":"fila",
         "acao_dados":{
			// ID da fila que deseja transferir
            "fila_id":"7"
         }
      },
      { // Chamar Webhook
         "acao":"webhook",
         "acao_dados":{
			// Script que irá receber um post com os dados da chamada
            "url":"https://www.totalvoice.com.br/recebi_ligacao.php" 
         }
      },
      { // Ir para menu
         "acao":"gotoMenu",
         "acao_dados":{
			// Nome do menu para onde a chamada será transferida
            "menu":"menu 1"
         }
      },
      { // Chamar URA Dinâmica
         "acao":"dinamico",
         "acao_dados":{
			// Script que irá retornar uma URA dinâmica
            "url":"https://www.totalvoice.com.br/ura_principal.php"
         }
      }
   ]
}

Todas as ações da API / URA Dinâmica contam ainda com 2 parâmetros opcionais:

  • Opção: Será chamado ao digitar determinado número;
  • Menu: Qual menu determinada ação faz parte, padrão é 1.
{
   "dados":[
      {
         "acao":"tts",
         "acao_dados":{
            "mensagem":"Bom Dia, você está no menu inicial" ,
            "tipo_voz": "br-Vitoria"
         }
      },
	  {
		 "opcao":"1",
         "acao":"gotoMenu",
         "acao_dados":{
            "menu":"menu 2" 
         }
      },
	  {
         "acao":"tts",
		 "menu":"menu 2",
         "acao_dados":{
            "mensagem":"Você está no Menu 2" 
         }
      }
   ]
}

No exemplo acima, a pessoa irá ouvir: “Bom dia, você está no menu inicial” e ao clicar o 1 irá ouvir: “Você está no Menu 2”. Obs: Agora também é possível retornar o tipo de voz no TTS (br-Vitoria), conforme o exemplo anterior…

Ainda há disponível pelo Painel Zenvia de voz as opções: 

  • Avaliação: Opção de adicionar uma avaliação de atendimento;
  • Transferência de Ramal: O cliente pode digitar um ramal para ser direcionado
  • Ir para URA: Envia o cliente para uma outra URA

Código de exemplo completo do script em PHP

<?php
$menu = $_REQUEST['menu'];
$dados = array();

$php_input = file_get_contents("php://input");
$dados_recebidos = json_decode($php_input);

// Verificamos o request da URA
if ($_REQUEST['menu'] == 'consultaCPF') {
    $cpf = $dados_recebidos->ultimo_dtmf;

    // Aqui podemos validar o CPF detro no sistema
    $cpf_valido = true;

    if($cpf_valido) {
        // Verificamos se tem algo com o CPF
        $tem_divida = false;
        
        if($tem_divida) {
            // Fala um texto de transferência
            $dados_tts['acao'] = 'tts';
            $dados_tts['acao_dados']['mensagem'] = 'Você tem uma fatura no valor de sete reais em aberto, estamos transferindo sua chamada para o setor financeiro';

            // Transfere a chamada para uma fila de ramais
            $dados_fila['acao'] = 'fila';
            $dados_fila['acao_dados']['fila_id'] = 5; //ID da Fila do setor financeiro

            $dados = array($dados_tts, $dados_fila);
        } else {
            // Fala um texto de transferência
            $dados_tts['acao'] = 'tts';
            $dados_tts['acao_dados']['mensagem'] = 'Para falar com vendas, tecle 1, para falar com gerência, tecle 2';

            // Adiciona duas opções de menus que vão para suas respectivas filas
            // Ao escolher opção 1, vai para fila de vendas
            $dados_fila_vendas['opcao'] = '1';
            $dados_fila_vendas['acao'] = 'fila';
            $dados_fila_vendas['acao_dados']['fila_id'] = 6; //ID da Fila do setor de vendas

            // Ao escolher opção 2, vai para fila da gerencia
            $dados_fila_gerencia['opcao'] = '2';
            $dados_fila_gerencia['acao'] = 'fila';
            $dados_fila_gerencia['acao_dados']['fila_id'] = 7; //ID da Fila do setor de vendas

            $dados = array($dados_tts, $dados_fila_vendas, $dados_fila_gerencia);
        }
    } else {
        $dados_tts = array();
        // CPF não cadastrado no sistema, retorno com erro
        $dados_tts['acao'] = 'tts';
        $dados_tts['acao_dados']['mensagem'] = 'CPF não encontrado, por favor, digite novamente';

        // Vou coletar 11 digitos (CPF) em um tempo de 20 segundos
        $dados_tts['coletar_dtmf'] = '11';
        $dados_tts['timeout'] = '20';

        // Aqui criamos o retorno para esse mesmo passo
        $dados_dinamico['acao'] = 'dinamico';
        $dados_dinamico['acao_dados']['url'] = 'https://www.totalvoice.com.br/exemplo_ura_dinamica.php?menu=consultaCPF';

        $dados = array($dados_tts, $dados_dinamico);
    }
} else {
    // Crio primeiro o texto que será falado e os digitos que serão coletados após o texto
    // Pode ser um TTS ou um Áudio anteriormente gravado
    $dados_tts['acao'] = 'tts';
    $dados_tts['acao_dados']['mensagem'] = 'Bem vindo à TotalVoice, por favor, digite seu CPF';
    // Vou coletar 11 digitos (CPF) em um tempo de 20 segundos
    $dados_tts['coletar_dtmf'] = '2';
    $dados_tts['timeout'] = '20';

    // Aqui criamos o retorno para o próximo passo
    $dados_dinamico['acao'] = 'dinamico';
    $dados_dinamico['acao_dados']['url'] = 'http://guizeradev.totalsip.com.br/exemplo_ura_dinamica.php?menu=consultaCPF';

    $dados = array($dados_tts, $dados_dinamico);
}

// Monto a array de saída
$menu_resposta = array(
    'nome' => 'Menu Principal',
    'dados' => $dados
);

// Respondo o JSON para a Ura
header('Content-Type: application/json');
die(json_encode($menu_resposta));
Zenvia API's
Categorias:
Escrito por

Zenvia