Blog Zenvia

O melhor portal de Marketing e Vendas para a sua empresa

Aprenda a realizar cobranças de forma prática e escalável

Qual a melhor forma de cobrar os consumidores? Saiba neste artigo como realizar a cobrança de forma empática e automatizada

A pandemia trouxe resultados negativos no setor financeiro, em uma pesquisa realizada em dezembro pela Confederação Nacional do Comércio de Bens, Serviços e Turismo, 66,3% dos consumidores estavam endividados. Por conta desses resultados, as organizações acabam por entrar em contato com o consumidor para realizar a cobrança dos valores devidos. Neste artigo, saiba como cobrar de forma prática e escalável.

Aqui você encontrará:

1. Primeiro Passo
2. Text to Speech
3. Como funcionam as chamadas para esta API
4. Criando a aplicação Node.js

A pandemia trouxe resultados negativos no setor financeiro, em uma pesquisa realizada em dezembro pela Confederação Nacional do Comércio de Bens, Serviços e Turismo (CNC), 66,3% dos consumidores estavam endividados.  

Em janeiro, esse número cresceu, 66,5% da população está endividada. Estes números são permeabilizados por diversos fatores como a alta na taxa de desemprego, falta de conhecimento financeiro, entre outros.  

Por conta desses resultados, as organizações acabam por entrar em contato com o consumidor para realizar a cobrança dos valores devidos. Entretanto, a forma como a cobrança é realizada não alcança o objetivo estipulado.  

Isso porque a forma como o contato é efetivado muitas vezes acaba por constranger o consumidor ou a insistência e diversas ligações seguidas fazem com que a pessoa desista de atender o telefone e a organização acaba por não conseguir conversar sobre a situação.  

Por isso é necessário que as organizações saibam fazer uma cobrança amigável e que conte com técnicas humanizadas como saber ouvir, entender a situação, oferecer negociações e cobrar de forma singela.  

Mas, antes de chegar ao ponto de cobrar o cliente, podemos contar com o apoio da tecnologia para alertar sobre atrasos de pagamento de outra forma. Dito isso, a organização pode utilizar o método de múltiplos canais como a utilização de SMS, e-mails e notificação por voz são uma boa pedida. 

Tudo deve ser feito de acordo com o tempo de inadimplência do cliente. Por exemplo, uma dica é enviar lembrete cerca de cinco dias antes do vencimento de um pagamento, depois enviar no dia do vencimento e depois após o vencimento.  

Para todos esses meios, é interessante que a organização trabalhe com a automatização de atendimento. Quando automatizamos processos podemos ter diversos benefícios como redução de custo, otimização de tempo, padronização de processos e entre outros.  

Neste tutorial, iremos desenvolver uma aplicação com um banco de dados que armazena dívidas com a data de vencimento do pagamento dessa dívida e informações do devedor como número de celular e nome. Com essas informações no banco de dados, a aplicação será capaz de enviar lembretes por torpedos de voz de acordo com alguns períodos em relação à data de vencimento.

Será enviado um torpedo seguindo esses períodos: 5 dias antes do vencimento, no dia do vencimento, 3 dias depois, 15 dias depois e 30 dias depois.

Primeiro Passo

Para criar a conta de acesso à API da Zenvia, basta entrar no site da Total Voice, preencher as informações e clicar em “CRIAR“.

Após criar a conta, é preciso confirmar o número de celular e o endereço de e-mail para ter acesso ao painel. Após confirmar suas informações é possível acessar o painel e adquirir o Access Token para se autenticar nas requisições à API, você precisará desta informação mais tarde.


Iremos utilizar o recurso TTS (Text To Speech) e as informações sobre os endpoints da API estão disponíveis na documentação.

Text to Speech

A funcionalidade de TTS (Text to Speech) da API de voz da Zenvia nos permite enviar uma uma mensagem de texto e ela transforma o texto em áudio falado e reproduz em uma ligação telefônica para o número indicado na chamada. Assim, quando o número destino atende o mesmo irá escutar uma voz falando a mensagem escrita.

Também podem ser enviadas algumas opções adicionais, tais como aguardar uma resposta do usuário, gravar o áudio da ligação ou colocar um número bina que aparecerá no momento da ligação. Para fins didáticos, vamos utilizar apenas o básico do recurso.

O acesso à API está disponível em Node.js através de uma dependência chamada totalvoice-node, porém ela não tem suporte a typescript e para fins didáticos e para que este tutorial possa ajudar as pessoas que não utilizam Node.js, vamos fazer as chamadas através de requisições http (Hypertext Transfer Protocol).

Como funcionam as chamadas para esta API

A API recebe as requisições através do URL (Uniform Resource Locator) base https://api2.totalvoice.com.br e vamos utilizar o endpoint /tts para acessar o recurso Text to Speech.

Para que a API reconheça o que queremos e quem está solicitando, precisamos enviar uma requisição POST com os seguintes headers:

Content-Type: application/json
access-token: <SEU_ACCESS_TOKEN_DISPONÍVEL_NO_PAINEL>

E um JSON no corpo da requisição neste modelo:

{
    "numero_destino": "11999999999",
    "mensagem": "Mensagem que deseja ser dita no torpedo de voz."
}

Criando a aplicação Node.js

1- Instale o Node.js no seu computador (de preferência a versão LTS);

1.1- opcional – Instale o yarn. O Node.js possui um gerenciador de pacotes padrão chamado npm (Node Package Manager), porém existe um gerenciador diferente chamado yarn. No restante deste artigo, haverão as opções de instalação para ambos gerenciadores de pacote como no passo a seguir.

2- Inicie o projeto criando o package.json com o seguinte comando no terminal:

npm init -y
yarn init -y

3- Instale o ts-nodets-node-dev e o typescript como dependências de desenvolvimento:

npm i ts-node ts-node-dev typescript -D
yarn add ts-node ts-node-dev typescript -D

3.1 – Instale o arquivo de configuração do typescript:

npx typescript --init

4- Crie um arquivo src/server.ts para testarmos a aplicação:

console.log('Hello World!')

5- Abra o arquivo package.json e insira o script para iniciar o servidor assim como na área grifada em cinza:

{
  "name": "zenvia-voice-default",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "dev": "ts-node-dev --transpile-only --ignore-watch node_modules --respawn src/server.ts"
  },
  "devDependencies": {
    "ts-node": "^9.1.1",
    "ts-node-d": "^1.1.1",
    "typescript": "^4.1.3"
  }
}

5.1- Sempre que você quiser executar a aplicação basta executar no terminal:

npm run dev
yarn dev

6- Vamos começar criando o nosso banco que dados que armazenará as informações dos inadimplentes. Para fins didáticos, vamos utilizar o banco de dados SQLite, pois ele não necessita de instalação e o banco fica salvo em apenas um arquivo. Para manusear o banco de dados vamos utilizar o Prisma, ORM (Object Relational Mapper) para Node.js e Typescript muito útil e prático, permitindo que alteremos o banco de dados mudando apenas uma linha de código. Instale as dependências do prisma @prisma/cli e @prisma/client e inicialize o prisma:

npm install @prisma/cli @prisma/client
yarn add @prisma/cli @prisma/client && npx prisma init

A inicialização do prisma irá gerar um arquivo prisma/schema.prisma é nele que iremos esquematizar nosso banco de dados.

7- Arquitete o banco de dados no arquivo prisma/schema.prisma:

datasource db {
 provider = "sqlite"
 url   = "file:./dev.db"
}
generator client {
 provider = "prisma-client-js"
}
model Pessoa {
 id      Int      @id @default(autoincrement())
 nome    String
 celular String
 Divida  Divida[]
}
model Divida {
 id             Int         @id @default(autoincrement())
 dataVencimento DateTime
 dividendo      Pessoa      @relation(fields: [dividendoId], references: [id])
 dividendoId    Int
 valor          Float
}  

8- Execute a criação do banco de dados:

npx prisma migrate dev --name init --preview-feature

Assim, o arquivo do seu banco de dados será criado prisma/dev.db.

9- Para testar a aplicação, crie o arquivo prisma/seed.ts para popular o banco de dados, troque os números de celular pelo seu para receber os torpedos de voz e troque as datas das dívidas para que esteja de acordo com os períodos explicados no início do tutorial:

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
const main = async () => {
 // Inserção das pessoas
 await prisma.pessoa.create({ data: { nome: 'Pessoa 1', celular: '+11999999999' }})
 await prisma.pessoa.create({ data: { nome: 'Pessoa 2', celular: '+11999999999' }})
 await prisma.pessoa.create({ data: { nome: 'Pessoa 3', celular: '+11999999999' }})
 await prisma.pessoa.create({ data: { nome: 'Pessoa 4', celular: '+11999999999' }})
 console.log('Pessoas criadas.')
 // Inserção das dividas
 await prisma.divida.create({data: { valor: 251.59, dataVencimento: '2021-02-01T00:00:00Z', dividendoId: 1}})
 await prisma.divida.create({data: { valor: 2051.49, dataVencimento: '2021-02-16T00:00:00Z', dividendoId: 2}})
 await prisma.divida.create({data: { valor: 521.97, dataVencimento: '2021-02-28T00:00:00Z', dividendoId: 3}})
 await prisma.divida.create({data: { valor: 151.58, dataVencimento: '2021-03-03T00:00:00Z', dividendoId: 4}})
 await prisma.divida.create({data: { valor: 2311.19, dataVencimento: '2021-03-08T00:00:00Z', dividendoId: 1}})
 console.log('Dívidas criadas.')
}
main().catch((e) => console.error(e)) 

10- Adicione o script seed no arquivo package.json:

{
 "name": "zenvia-voice-default",
 "version": "1.0.0",
 "main": "index.js",
 "license": "MIT",
 "scripts": {
  "dev": "ts-node-dev --transpile-only --ignore-watch node_modules --respawn src/server.ts",
  "seed": "ts-node prisma/seed.ts"
 },
 "devDependencies": {
  "ts-node": "^9.1.1",
  "ts-node-dev": "^1.1.6",
  "typescript": "^4.2.2"
 },
 "dependencies": {
  "@prisma/cli": "^2.18.0",
  "@prisma/client": "^2.18.0",
 }
}

11- Execute o script seed:

npm run seed
yarn seed

Agora, com o banco de dados criado e populado, podemos começar a desenvolver a lógica da nossa aplicação.

12- Instale o node-cron e o dotenv para criarmos nossa aplicação:

npm i node-cron dotenv && npm i --save-dev @types/node-cron
yarn add node-cron dotenv  && yarn add @types/node-cron-D

13- Instale o Axios para realizarmos as requisições http:

npm i axios
yarn add axios

14- Vamos começar criando o arquivo de configuração do Axios para chamarmos a API de voz da Zenvia services/api.ts:

import axios from 'axios'
export const api= axios.create({
   baseURL: 'https://api2.totalvoice.com.br',
})

15- Crie um arquivo chamado .env, nele conterá seu token de acesso em uma variável de ambiente, coloque seu token logo após o sinal de =:

VOICE_TOKEN=

16- Volte para o arquivo src/server.ts, ele será o nosso arquivo de configuração do servidor para criarmos nossa API:

import cron from 'node-cron'
import { checkAndSendSMSUseCase } from './UseCases/CheckAndSendSMS/index'
// A cada hora será feita uma checagem no banco de dados se há a necessidade de enviar SMS de voz, caso tiver, será enviado
cron.schedule('* * * *', () => {
 checkAndSendSMSUseCase.execute()
}) 

checkAndSendSMSUseCase  será criado a seguir, mas antes, vamos criar alguns arquivos que ele depende.

17- Crie a função getDatetimes para gerar um array com as datas relativas a aqueles períodos do início do tutorial (-30, -15, -3, 0, 5). Crie o arquivo utils/getDatetime:

export const getDatetimes = () => {
 // Retorna um array coms as datas
 return [-30, -15, -3, 0, 5].map((days) => {
  // Pega o dia de hoje
  const date = new Date()
  // Soma com o período em questão
  date.setDate(date.getDate() + days)
  // Transforma do jeito que o Brasil vê as datas e divide pelo espaço
  const generatedDatetime = date.toLocaleString('pt-BR').split(' ')
  // Captura a data e o horário atual
  const finalDate = generatedDatetime[0].split('/')
  // Retorna a data organizada no padrão do banco de dados
  return `${finalDate[2]}-${finalDate[1]}-${finalDate[0]}T00:00:00Z`
 })
}   

18- Crie a função getMessage que irá gerar as mensagens de acordo com cada período, levando como parâmetros o nome do dividendo guardado no banco de dados, o valor da dívida e um índice de controle referente a quantos dias de distância do vencimento (0-> -30, 1-> -15, 2->  -3, 3-> 0,4-> 5). Crie o arquivo utils/getMessage.ts:

const transformMoney = (value: number) => {
 const money = value.toString().split('.')
 return `${money[0]} reais e ${money[1]} centavos`
}
const valueWithInterest = (value: number, interest: number) => {
 return value + value * interest
}
export const getMessage = (name: string, value: number, index: number): string => {
 switch (index) {
  case 0:
   return `Olá ${name}, sou da Bo Boletos e estou aqui pra te informar que já fazem que o prazo de pagamento da sua dívida de ${transformMoney(
    valueWithInterest(value, 0.05)
   )} com nós venceu há 30 dias, logo foi adicionado 5% de juros. Estamos abertos a negociação, se tiver interesse entre em contato: 0800 0001. Obrigado pela atenção.`
  case 1:
   return `Olá ${name}, sou da Bo Boletos e estou aqui pra te informar que seu débito venceu há 15 dias, aproveite para quitar com juros baixo antes que ele aumente. Obrigado pela atenção.`
  case 2:
   return `Olá ${name}, sou da Bo Boletos e estou aqui pra te informar que seu boleto de ${transformMoney(
    value
   )} venceu há 3 dias, caso se esqueceu ainda pode pagar para evitar problemas futuros. Obrigado pela atenção.`
  case 3:
   return `Olá ${name}, sou da Bo Boletos e estou aqui pra te informar que seu boleto de ${transformMoney(
    value
   )} vence hoje, não esqueça de quitá-lo para evitar juros. Caso já tenha pago, desconsidere esta mensagem. Obrigado pela atenção.`
  case 4:
   return `Olá ${name}, sou da Bo Boletos e estou aqui pra te avisar que você tem mais 5 dias para que o pagamento da sua dívida de ${transformMoney(
    value
   )} vença. Quite-a em dia para evitar juros. Caso já tenha pago, desconsidere esta mensagem. Obrigado pela atenção.`
  default:
   return ''
 }
}    

19- Crie o caso de uso SendVoiceSMSUseCase que que será responsável por efetuar a chamada à API de voz da Zenvia, levando como parâmetros o número do destinatário e a mensagem em si que será convertida em voz pela API. Crie os arquivos src/UseCases/SendVoiceSMS/SendSMSUseCase.ts e src/UseCases/SendVoiceSMS/index.ts com os respectivos códigos:

import { api } from '../../services/api'
import { config } from 'dotenv'
config() // Inicialização do dotenv
export class SendVoiceSMSUseCase {
 execute(numero_destino: string, mensagem: string) {
  api
   .post(
    '/tts',
    {
     numero_destino,
     mensagem,
    },
    {
     headers: {
      'Content-Type': 'application/json',
      'access-token': `${process.env.VOICE_TOKEN}`,
     },
    }
   )
   .then((res: any) => {
    const { sucesso } = res.data
    // Verificação de êxito
    if (sucesso === true) {
     console.log('Sucesso ao ligar para ' + numero_destino)
    } else {
     console.log('Erro ao ligar para ' + numero_destino)
    }
   })
   .catch((error: any) => {
    // Caso não seja possível chamar a API de voz, exibe um status de erro no console
    console.log('Error:', error)
    // Retorna uma resposta de erro para quem chamou nossa API
    console.log('Erro desconhecido ao chamar a API de voz.')
   })
 }
}      
import { SendVoiceSMSUseCase } from './SendSMSUseCase'
export const sendVoiceSMSUseCase = new SendVoiceSMSUseCase()   

20- Agora, crie o caso de uso FindDebtByDates que será responsável por procurar no banco de dados as dívidas a partir de um array de datas e devolver um array com as dívidas encontradas e recebera esse array como parâmetro. Crie os arquivos src/UseCases/FindDebtByDates/FindDebtByDatesUseCase.ts e src/UseCases/FindDebtByDates/index.ts com os respectivos códigos:

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
export class FindDebtByDatesUseCase {
 execute(datetimes: string[]) {
  // Busca no banco de dados todas as dívidas de acordo com as datas do array
  const found = datetimes.map((datetime) =>
   prisma.divida.findMany({
    where: { dataVencimento: datetime },
    select: { dividendo: true, valor: true },
   })
  )
  // Retorna as informações
  return Promise.all(found).then(function (results) {
   return results
  })
 }
}      
import { FindDebtByDatesUseCase } from './FindDebtByDatesUseCase'
export const findDebtByDatesUseCase = new FindDebtByDatesUseCase() 

21- Agora, crie o caso de uso CheckAndSendSMS que chamamos lá no início no src/server.ts e será responsável por fazer a intermediação dos dois casos de uso criados anteriormente. Crie os arquivos src/UseCases/CheckAndSendSMS/CheckAndSendSMSUseCase.ts e src/UseCases/CheckAndSendSMS/index.ts com os respectivos códigos:

import { getMessage } from './../../utils/getMessage'
import { sendVoiceSMSUseCase } from './../SendVoiceSMS/index'
import { getDatetimes } from './../../utils/getDatetimes'
import { findDebtByDatesUseCase } from './../FindDebtByDates/index'
export class CheckAndSendSMSUseCase {
 async execute() {
  // Gera um array com as datas dos respectivos torpedos de voz que precisam ser enviados
  const datetimes = getDatetimes()
  // Busca no banco de dados as dívidas com essas datas e retorna um array
  const debts = await findDebtByDatesUseCase.execute(datetimes)
  // Efetua as chamadas para as pessoas com dívidas
  debts.forEach((debtsArray, index) => {
   debtsArray.forEach(async (debt) => {
    await sendVoiceSMSUseCase.execute(
     debt.dividendo.celular,
     getMessage(debt.dividendo.nome, debt.valor, index)
    )
   })
  })
 }
}         
import { CheckAndSendSMSUseCase } from './CheckAndSendSMSUseCase'
export const checkAndSendSMSUseCase = new CheckAndSendSMSUseCase() 

Sua aplicação está pronta. Para testá-la, basta executar o script dev sevocê já cumpriu com todos os passos anteriores. Após a inicialização da aplicação ela irá fazer a checagem se há a necessidade de enviar um torpedo de voz, se houver ela irá enviar. Depois disso a cada uma hora essa checagem é feita novamente e isso é controlado pelo node-cron e os casos de uso que criamos neste tutorial.

Essa é uma pequena demonstração do que você pode fazer com a API de voz da Zenvia e a sua imaginação é o limite.

Lembre-se que para usar a API de Voz Zenvia, após criar sua conta na plataforma, é preciso utilizar o access-token e informar o número de destino. Com isso o usuário pode fazer sua primeira ligação.

Você pode acessar o projeto final da aplicação produzida neste tutorial no nosso repositório do github.

Amplie sua estratégia de comunicação! Crie sua conta agora e comece a testar a API de Voz Zenvia.

Zenvia API's
Escrito por

Zenvia