Agendamento de um serviço

O objetivo desta documentação é detalhar o escopo da automação do ciclo de vida de um atendimento clínico utilizando o uma conta WhatsApp Business API integrada com a Plataforma Mensageiro.

O caso de uso desejado é permitir que o cliente realize um agendamento de serviço.

Aqui, descreveremos a situação de um agendamendo em uma clínica odonotológica que seja mais próxima do cliente.

Mas esse exemplo pode servir como base para outros tipos de negócios que necessitam de um agendamento para realização de um serviço, tais como:

  • clínicas de saúde
  • estabelecimentos de estética
  • redes de serviços e locações
  • hospitais

No documento, temos as seguintes estruturas:

  • Bloco: Representa a execução de uma sequencia de automações que podem ser mensagens ou uma conexão com outra aplicação.
  • Requisição no sistema da clínica (API): Representa uma solicitação de consulta ou envio de dados entre a API da clínica e a API da Mensageiro.

Bom, toda interação de automação inicia através de um gatilho recebido para iniciar execução da automação. Neste caso, o gatilho será uma mensagem qualquer enviada pelo contato no número WhatsApp da clínica que executará o bloco de início, conforme detalhamentos a seguir:

Bloco 1 - Saudações

Na primeira interação, o bot verifica se se o contato já está cadastrado. Se não, o contato é salvo e após executa um bloco padrão de início de interação.

{{nome}}, Seja bem vindo à nossa clínica! Sou a Assistente Virtual da Clinica 👩🏼‍🔬

Escolha uma opção abaixo:

  1. Consultar unidade mais próxima
  2. Consultar serviços
  3. Agendar uma consulta
  4. Convênios e meios de pagamento aceitos
  5. Confirmar consulta
  6. Desmarcar consulta
  7. Reagendar consulta

{{nome}}, Escolha uma opção 👩🏼‍🔬

  1. Consultar unidade mais próxima
  2. Consultar serviços
  3. Agendar uma consulta
  4. Convênios e meios de pagamento aceitos
  5. Confirmar consulta
  6. Desmarcar consulta
  7. Reagendar consulta

Bloco 2 - Menu

{{nome}}, Escolha uma opção 👩🏼‍🔬

  1. Consultar unidade mais próxima
  2. Consultar serviços
  3. Agendar uma consulta
  4. Convênios e meios de pagamento aceitos
  5. Confirmar consulta
  6. Desmarcar consulta
  7. Reagendar consulta

Bloco 3 - Não Entendi

Quando o contato enviar uma mensagem não prevista, o chatbot executará este bloco de mensagem:

{{nome}}, Por favor, escolha uma opção válida 👩🏼‍🔬

  1. Consultar unidade mais próxima
  2. Consultar serviços
  3. Agendar uma consulta
  4. Convênios e meios de pagamento aceitos
  5. Confirmar consulta
  6. Desmarcar consulta
  7. Reagendar consulta

Bloco 4 - Consultar unidade mais próxima

Quando o contato escolher a opção 1 do menu, este bloco será executado que irá capturar a localização do usuário para encontrar a unidadade de atendimento mais próxima.

{{nome}}, Por favor, Envie localizador ou CEP para encontrarmos a unidade mais próxima de você.

Exemplo: O contato informou o CEP 88056590

Neste momento, o bot executará uma consulta na API da clínica informando um CEP ou coordenadas: latitude e longitudade do contato e a API deve retornar os dados de contato da unidade.

O bot executará uma consulta na API da clínica realizando uma requisição POST com as credenciais de acesso na API enviando o CEP como parâmetro ou no corpo da requisição (body), como usado no exemplo, e deverá de retornado no corpo da resposta os dados da clínica mais próxima.

O value pode ser um CEP ou Coordendadas

POST https://api.clinica.com.br/unidade-proxima

curl --location --request POST 'https://api.clinica.com.br/unidade-proxima' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'
--data-raw '{
"cep": "22621290",
"location": {
"latitude": "-23.013842",
"longitutde": "-43.309746"
}
}'

A resposta será um objeto JSON que contém todos os atributos da Unidade:

{
"place_id": "1234545",
"name": "Unidade Santos Dumont",
"description": "Na unidade Santos Dumont você conta com os principais tratamentos odontológico perto de você",
"address": "Av. Adilson Serôa da Motta, 10 - Barra da Tijuca, Rio de Janeiro - RJ, 22621-290",
"location": {
"latitude": "-23.013842",
"longitutde": "-43.309746"
},
"phone": "+552130001234",
"email": "contato@clinicasantosd.com.br",
"products": [
{
"id": "1",
"name": "Limpeza odontológica",
"description": "Serviço de limpeza especial dos dentes",
"value": 80.00
},
{
"id": "2",
"name": "Tratamento de canal",
"description": "Tratamento de canal dentário",
"value": 480.00
},
]
}
NomeTipoDescrição
place_idstringIdentificador da unidade no sistema de origem
namestringNome do Estabelecimento
descriptionstringDescrição resumida, etc, email, telefone
addressstringEndereço
locationobjectlatitude e longitude do estabelecimento
phonestringtelefone
emailstringemail
productsarraymatriz com objetos que representam os produtos ou serviços da unidade

Com o resultado da consulta o bot responde ao contato:

{{nome}}, A unidade mais próxima é a unidade Santos Dumont.

Segue abaixo os dados de contato:

  • Descrição: Na unidade Santos Dumont você conta com os principais tratamentos odontológico perto de você
  • Endereço: Av. Adilson Serôa da Motta, 10 - Barra da Tijuca, Rio de Janeiro - RJ, 22621-290
  • Telefone: 552130001234
  • E mail": contato@clinicasantosd.com.br
  • Principais servicos:
  1. Limpeza odontológica
  2. Tratamento de canal

E agora, o que deseja fazer?

  1. Consultar preço
  2. Consultar agenda
  3. Agendar atendimento

Bloco 5 - Consultar Preço

O bot realiza uma consulta dos detalhes do serviço, onde retornará o preço.

GET https://api.clinica.com.br/servico/35216

curl --location --request GET 'https://api.clinica.com.br/servico/35216' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'

A resposta será um objeto JSON que contém todos os atributos do servico

{
"name": "Limpeza odontológica",
"description": "Serviço de limpeza especial dos dentes",
"value": 80.00
}

Com o resultado da consulta o bot responde ao contato:

{{nome}}, A unidade mais próxima é a unidade Santos Dumont.

  • Principais servicos:
  1. Limpeza odontológica - R$ 80.00
  1. Tratamento de canal - R$ 480.00

E agora, o que deseja fazer?

  1. Agendar atendimento
  2. Voltar ao menu
  3. Encerrar o atendimento

Bloco 6 - Agendar um serviço

{{nome}}, Qual é o melhor dia pra você?

POST https://api.clinica.com.br/consultar-agenda

curl --location --request POST 'https://api.clinica.com.br/consulta-agenda' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'
--data-raw '{
"place_id": "2245313543",
"service_id": "22621290",
"date": "01/03/2020",
}'

A resposta será um objeto JSON que contém horarios disponíveis para os próximos 3 dias após a data informada.

{
"days": [
{
"day": "01/03/2020",
"available_hours": [
{
professional: "Dra. Manuela",
"hours" : ["08:30", "9:45"]
},
{
professional: "Dra. Ana",
"hours" : ["08:30", "9:45"]
}
],
},
{
"day": "02/03/2020",
"available_hours": [
{
professional: "Dra. Manuela",
"hours" : ["08:30", "9:45"]
},
{
professional: "Dra. Ana",
"hours" : ["08:30", "9:45"]
}
],
}
{
"day": "03/03/2020",
"available_hours": [
{
professional: "Dra. Manuela",
"hours" : ["08:30", "9:45"]
},
{
professional: "Dra. Ana",
"hours" : ["08:30", "9:45"]
}
]
}
}

Com o resultado da consulta o bot responde ao contato:

Segue abaixo os próximos horários disponíveis a partir do dia 01/03/2020:

  1. 01/03/2020 às 8:30 com Dra. Manuela
  2. 01/03/2020 às 9:45 com Dra. Manuela
  3. 01/03/2020 às 8:30 com Dra. Ana
  4. 02/03/2020 às 9:45 com Dra. Ana
  5. 02/03/2020 às 8:30 com Dra. Manuela
  6. 02/03/2020 às 9:45 com Dra. Manuela

O contato selecionará uma opção.

Neste momento, o bot verifica se o contato já possui cadastro, se tiver, o bot pede confirmação de agendo.

Confirma agendamento para o dia 01/03/2020 às 8:30 com Dra. Manuela?

  1. SIM
  2. NÃO

Digitando 1, o bot salva a agenda na API da clinica e confirma com o usuário.

POST https://api.clinica.com.br/agendamento/criar

curl --location --request POST 'https://api.clinica.com.br/agendamento/criar' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'
--data-raw '{
"client_id": "2245313543",
"place_id": "2245313543",
"service_id": "22621290",
"date": "01/03/2020",
}'

A resposta será um objeto JSON que contém o resulta de sucesso ou erro.

{
"code": "200",
"message": "Success",
}

Após, confirma com o o cliente:

Agendamento confirmado com sucesso.

Caso desista ou precise reagendar, pode fazer por aqui ;)

Bloco 7 - Cadastrar um novo contato no seu sistema

Caso o contato deseje agendar uma consulta e não tenha o cadastro no sistema da clínica, o chatbot deve permitir um cadastro básico do paciente.

A primeira ação do bloco é uma consulta na API da clínica para verificar se o cliente possi cadastro. Se possuir, traz os dados e confirma com o cliente.

GET https://api.clinica.com.br/cliente/123

curl --location --request GET 'https://api.clinica.com.br/cliente/123' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'

A resposta será um objeto JSON que contém os atributos do cliente e os agendamentos ativos:

{
"name": "Maria Cristina",
"CPF": "94838938383",
"convenio": "Amil",
"agendamentos": [
{
"consulta_id": "456234",
"data": "01/03/2020",
"horario": "8:30",
"profissional": "Dra. Manuela",
"status": "confirmado",
"especialidade": "Odontologia",
"descricao": "",
},
{
"consulta_id": "456456",
"data": "10/03/2020",
"horario": "9:45",
"profissional": "Dra. Manuela",
"status": "confirmado",
"especialidade": "Odontologia",
"descricao": "",
},
{
"consulta_id": "456465",
"data": "15/03/2020",
"horario": "8:30",
"profissional": "Dra. Ana",
"status": "confirmado",
"especialidade": "Odontologia",
"descricao": "",
}
]
}

Caso não tenha, o chatbot preencherá o formulário de cadastro executando uma sequêcriancia de perguntas que irá capturar, validar os dados e depois enviar para a api da clínica conforme abaixo:

POST https://api.clinica.com.br/cliente

curl --location --request POST 'https://api.clinica.com.br/cliente' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'
--data-raw '{
"name": "João da Silva",
"cof": "8278937733",
"mobile": "22621290",
"convenio": "Amil",
"birthday": "10/02/1998",
}'

A resposta será um objeto JSON que contém o resulta de sucesso ou erro.

{
"origin_id": "78687678",
"code": "200",
"message": "Success",
}

Caso o cliente exista, poderá haver apenas uma atualização do cadastro do cliente:

POST https://api.clinica.com.br/client

curl --location --request POST 'https://api.clinica.com.br/cliente \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'
--data-raw '{
"name": "João da Silva",
"address": "Rua das Hortências 987",
"mobile": "22621290",
"payment_method": "22621290",
"birthday": "01/05/1999",
}'

A resposta será um objeto JSON que contém o resulta de sucesso ou erro.

{
"origin_id": "78687678",
"code": "205",
"message": "Updated",
}

Bloco 8 - Consultar detalhes de um agendamento

Aqui, o chatbot executará uma consulta na API da clínica onde retornará todos os agendamentos do cliente:

GET https://api.clinica.com.br/cliente/123

curl --location --request GET 'https://api.clinica.com.br/cliente/123' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'

A resposta será um objeto JSON que contém o resulta de sucesso ou erro.

{
"name": "Maria Cristina",
"CPF": "94838938383",
"convenio": "Amil",
"agendamentos": [
{
"consulta_id": "456234",
"data": "01/03/2020",
"horario": "8:30",
"profissional": "Dra. Manuela",
"status": "confirmado",
"especialidade": "Odontologia",
"descricao": "",
},
{
"consulta_id": "456456",
"data": "10/03/2020",
"horario": "9:45",
"profissional": "Dra. Manuela",
"status": "confirmado",
"especialidade": "Odontologia",
"descricao": "",
},
{
"consulta_id": "456465",
"data": "15/03/2020",
"horario": "8:30",
"profissional": "Dra. Ana",
"status": "confirmado",
"especialidade": "Odontologia",
"descricao": "",
}
]
}

E, apartir do retorno, o chatbot apresentará a seguinte mensagem:

{{nome}}, Você tem os seguintes agendamentos:

  1. 01/03/2020 às 8:30 com Dra. Manuela
  2. 10/03/2020 às 9:45 com Dra. Manuela
  3. 15/03/2020 às 8:30 com Dra. Ana

{{nome}}, Caso deseje ver detalhes, reagendar ou desmarcar, digite o número do agendamento para ver mais ações

R. 1

A partir a lista de agendamentos, o cliente pode escolher uma consulta agendada para executar uma ação.

Ok {{nome}}, O que você deseja fazer no agendamento de 01/03/2020 às 8:30 com Dra. Manuela?

  1. Confirmar
  2. Reagendar
  3. Desmarcar

{{nome}}, Caso deseje ver detalhes, reagendar ou desmarcar, digite o número do agendamento para ver mais ações

Bloco 9 - Confirmação do agendamento (Mensagem de Notificação)

Qdo o cliente digitar a opção 1, conforme acima, o chatbot atualizará o sistema da clínica e responder o cliente.

Neste caso, a API da clinica irá executar uma requisição na API da Mensageiro para execução do bloco de avaliação da consulta.

POST https://api.mensageiro.io/event/run_block

curl --location --request POST 'https://api.clinica.com.br/event/run_block' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'
--data-raw '{
"source": "+554899652241",
"destination": "+554896633552",
"block_id": "22621290",
}'

O block_id é o identificado do bloco a ser executado com o fluxo da pergunta de avaliação

A resposta será um objeto JSON que contém o resulta de sucesso ou erro.

{
"code": "200",
"message": "Success",
}

{{nome}}, Obrigado por confirmar sua consulta em 01/03/2020 às 8:30 com Dra. Manuela

Digite menu para voltar ao menu principal.

Bloco 11 - Desmarcar consulta

O chatbot vai enviar uma mensagem de confirmação.

{{nome}}, Você realmente deseja cancelar a consulta em 01/03/2020 às 8:30 com Dra. Manuela?

  1. SIM
  2. VOLTAR

O cliente digitando "1", será realizado uma requisição na API da clinica atualizando o status da consulta para "cancelada".

POST https://api.clinica.com.br/servico/cancelar_agendamento

curl --location --request POST 'https://api.clinica.com.br/servico/cancelar_agendamento' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'
--data-raw '{
"consulta_id": "22621290"
}'

A resposta será um objeto JSON que contém o resulta de sucesso ou erro.

{
"code": "200",
"message": "Success",
}

{{nome}}, A consulta em 01/03/2020 às 8:30 com Dra. Manuela foi CANCELADA COM SUCESSO!

Bloco 12 - Reagendar consulta

Qdo o cliente digitar a opção "reagendar", o chatbot executará o fluxo similiar ao bloco 6. A diferença é que após agendado, o chatbot realizará uma requisição na API da cliníca para alterar o status do agendamento cancelado no mesmo post do bloco acima e após será enviado uma mensagem de sucesso para o cliente.

{{nome}}, Sua consulta foi reagendada com sucesso para 15/03/2020 às 8:30 com Dra. Ana.

Bloco 13 - Mensagem de avaliação

Após conclusão do atendimento (POST na nossa aplicação)

{{nome}}, Por favor, envie uma nota de 1 a 5 sobre sua última consulta:

POST https://api.clinica.com.br/servico/avaliacao

curl --location --request POST 'https://api.clinica.com.br/servico/avaliacao' \
--header 'Content-Type: application/json' \
--header 'API-AppKey: {{X-API-AppKey}}' \
--header 'API-AppToken: {{X-API-AppToken}}'
--data-raw '{
"consulta_id": "08972389723983",
"avaliacao": "5",
}'

A resposta será um objeto JSON que contém o resulta de sucesso ou erro.

{
"code": "200",
"message": "Success",
}

{{nome}}, Obrigado pela sua avaliação! Sua opinião é muito importante. Até a próxima! ;)