🏭 Painel Criador de Mensageria
gera • provisiona • implanta • testa

🏭 Painel Criador de Mensageria

gera • provisiona • implanta • testa

Que tipo de mensageria vou criar? você define

A diferença é quem começa a conversa: o CRM do cliente nos avisa, ou nós é que temos de ir buscar a agenda. Escolha primeiro — os campos abaixo mudam conforme a resposta.
WTS painel da WTS Chat do cliente CRM peça ao time do CRM (Helena) clínica texto aprovado pela clínica externo outro serviço (Langfuse) você define decisão sua automático o painel resolve sozinho

A mesma cor aparece na borda esquerda e no ponto de cada campo — dá para saber a quem pedir o dado sem ler o rótulo.

Identificação

O slug vira nome do container, do banco, da unit systemd e do workspace Terraform.
Apelido técnico do projeto. Vira o nome do container, do banco de dados, do serviço e da pasta na VPS. Não muda depois de criado. você inventa — use o nome da clínica em minúsculas, sem acento nem espaço clinica-sorriso
O nome por extenso, só para gente ler: aparece na lista de projetos e na capa do relatório PDF. Pode ter acento, espaço e maiúscula. Clínica Sorriso — Multimensageria
A máquina onde tudo será instalado: banco, aplicação e serviço que roda 24h. a lista sai das VPS cadastradas na aba Admin
O endereço que o CRM vai chamar para disparar as mensagens. Você não preenche — o painel monta a partir do slug. um domínio só para todos; o que separa cada projeto é o final do endereço https://mensagerias.agentproia.com/clinica-sorriso

WTS Chat WTS

Os únicos valores que não dá para adivinhar: todos saem do painel da WTS daquele cliente. Entre na WTS dele para pegar cada um.

Template não é resposta rápida. Resposta rápida é o atalho que o atendente digita (/oi) numa conversa já aberta; o Id dela é curto, tipo a177c_testw. O que o sistema precisa é o modelo aprovado pela Meta, porque o lembrete sai de madrugada para quem não escreveu nada — e aí o WhatsApp só deixa passar modelo aprovado. O Id do modelo certo é sempre um UUID de 36 caracteres.

A senha do sistema para conversar com a WTS. É ela que autoriza enviar mensagem, marcar etiqueta e ler resposta. Não mostre a ninguém. WTS → Configurações → API → gerar/copiar token pn_9f3a7c21b8d4e05f6a1c…
De qual número de WhatsApp a mensagem sai. Se a clínica tem mais de um número na WTS, é aqui que se escolhe qual deles fala com o paciente. WTS → Canais → abra o canal → copie o Id fea99f99-3ff5-48bb-9c1e-7a2d5b8e4f60
Isto não é template. É a fila de atendimento humano que recebe a conversa quando o paciente responde — quem vai ver a mensagem dele do outro lado. WTS → Equipes → abra a equipe → copie o Id 7c4e18a0-2b93-4d6f-a15c-38e07b9d2461
O modelo aprovado que leva os agendamentos do paciente. Neste tipo é um só: o lote junta os procedimentos numa mensagem, e é este template que sai para todo mundo. WTS → Modelos de mensagem → tipo Template → copie o Id
O CRM manda o nome interno da unidade, que nem sempre é como a clínica se apresenta ao paciente. Preenchido aqui, é este que sai na mensagem.
Avisa que o resultado do exame ficou pronto. É um fluxo separado do lembrete; se a clínica não usa, deixe vazio. Precisa da variável [NOMEEXAME]. WTS → Modelos de mensagem → tipo Template → copie o Id f1af7e57-6d20-41b8-9e3a-5c7b04ea9138

A equipe é opcional no formulário, crítica na prática: deixar vazio não dá erro nenhum, só joga o atendimento na fila default do canal.

Os tempos da fila você define

Neste tipo o CRM não dispara: ele enfileira. Quem manda a mensagem é o lote, e é aqui que se decide quando ele fecha.
O CRM manda um POST por agendamento. Quem tem três exames receberia três mensagens; esperar este tanto de tempo sem nenhum webhook novo é o que junta tudo numa mensagem só. Aumentar atrasa o lembrete inteiro; diminuir volta a partir a mensagem em duas. segundospadrão 300 (5 min)
De quanto em quanto tempo o serviço confere se o silêncio já fechou. É a precisão do relógio, não o atraso: não adianta ser menor que o campo acima. segundospadrão 30
Enquanto um paciente não aperta o botão, os outros agendamentos daquele mesmo telefone ficam esperando — é isso que faz o "CONFIRMAR" valer para o agendamento certo, já que a WTS devolve só telefone e texto. Passado este prazo, a espera é descartada e o próximo sai. minutospadrão 60
Acima disto o paciente é pulado — não recebe nada e continua na fila. Agendamento em massa costuma ser erro de cadastro, e o texto ficaria ilegível. procedimentospadrão 5
Linha mais velha que isto é apagada, tendo saído ou não. O CRM não reenvia sozinho: o que for apagado sem envio não chega ao paciente. horaspadrão 24

Webhook na WTS WTS

Este é o endereço que a WTS chama quando o paciente responde. Sem ele colado lá, a mensageria nasce funcionando pela metade: as mensagens saem, nenhuma resposta entra, e o painel da clínica fica sem as conversas. Por isso o projeto só é criado depois que a chamada chegar aqui.
Sai do slug — troque o slug e ele muda junto. Você não preenche. WTS → Configurações → Webhooks → campo de mensagem recebida
Cole o endereço na WTS e clique em testar conexão.

Templates

O painel não cria template. Ele é criado na WTS e aprovado pela Meta — aqui você declara o nome de cada variável e confere como a mensagem fica.
O messageType que o CRM envia diz o fluxo (ConfirmacaoConsulta ou EntregaExame); qualquer outro valor cai em fallback e não dispara nada. Qual template do lembrete sai é outra coisa: quem decide é o messageCode — a regra, cadastrada logo abaixo do template padrão.
Aqui existe um template só, e quem o dispara é a varredura da agenda — não há messageType: o horário chega, o coletor busca e envia.
as variáveis abertas no editor, como texto

Uma por linha, no formato [VARIAVEL]=referencia — é o mesmo que a coluna da direita monta. A referência é o nome do campo como o Otimus manda no corpo. Ao salvar, elas viajam junto com a regra para a lista; o que ficar aqui vale como padrão para regra que não tenha as suas.

🎨 Mais de um template: um por regra do Otimus

É aqui que os templates do lembrete são cadastrados — um por regra. O Otimus manda os agendamentos já dizendo qual regra vale para aquele disparo (o messageCode do corpo), e a mensageria envia o template daquela regra. É o mesmo desenho do Switch do n8n — cada saída da regra caía num envio diferente —, só que sem fluxo para manter. Pelo menos uma regra é obrigatória: sem nenhuma, a mensageria recebe o agendamento e não tem template para enviar.

O jeito de cadastrar: declare as variáveis do template lá em cima, escreva aqui a regra e o Id, e salve — os dois vão juntos para a lista. Depois é só repetir para o próximo; as variáveis continuam preenchidas, então troque só o que mudar. Para rever ou corrigir um que já entrou, clique no lápis da linha dele.

O messageCode que o Otimus manda no corpo do agendamento — é ele que traz a regra do disparo. É o número da saída que a regra tinha no Switch do n8n. Não confunda com o messageType (ConfirmacaoConsulta), que diz o fluxo, não a regra. número como vem no corpo: "messageCode": 1 sem vírgula
O modelo aprovado pela Meta que sai nesta regra. Usa as variáveis do template padrão declaradas acima; o que muda é o texto da mensagem. UUID 36 caracteres não é resposta rápida WTS → Modelos de mensagem → tipo Template → copie o Id
Só para clínica com mais de uma unidade, cada uma com o seu template — o texto aprovado traz o nome e o endereço da clínica. Preenchida, a unidade manda mais que o número da regra: o CRM já mandou o código de uma unidade junto com o companyName da outra, e o paciente receberia o endereço errado. texto igual ao companyName do agendamento sem vírgula Otimus → corpo do lembrete → companyName
nenhum template por regra cada regra ganha uma cor — é por ela que se reconhece a linha sem ler o UUID
Nenhuma regra cadastrada. O projeto não é criado assim: a mensageria receberia o agendamento e não teria template para enviar.
colar uma lista pronta (várias de uma vez)

Uma por linha, no formato regra, id do template — é o mesmo texto que o botão acima monta. Linha começando com # é ignorada, e a lista se redesenha enquanto você cola.

Agenda do ERP CRM

Neste tipo ninguém nos avisa: um horário nosso varre a agenda por prestador, separa quem ainda não confirmou e dispara. Estes campos são o endereço dessa agenda e a assinatura de quem confirma.
A raiz da API do ERP. O coletor concatena sozinho o caminho /agendas/prestador e a query de cada varredura — colar a URL já com o caminho gera …/agendas/prestador/agendas/prestador e todo GET volta 404. URL absoluta com https:// barra no fim é removida sozinha obrigatório peça ao time do ERP a base da API de agendas https://services.conectew.com.br/services/terapias-api
A identidade que assina cada confirmação e cada cancelamento. Vai no corpo de todo PATCH e o ERP grava este CPF como autor do ato — é por ele que a clínica audita depois quem mexeu na agenda. 11 dígitos só números, sem ponto nem traço segredo: fica no .env da VPS e nunca volta na tela obrigatório peça à clínica o CPF do operador de sistema
🔑 Como o coletor se autentica no ERP

Toda chamada ao ERP leva o cabeçalho Authorization: Bearer <token>. O que muda é de onde esse token vem — e são dois caminhos que se excluem: escolha um e o painel esconde o outro, para não nascer projeto com os dois preenchidos.

Renova sozinha é o caminho recomendado: você informa usuário e senha da API, e o próprio serviço pede o token ao ERP de hora em hora — sem n8n, sem Redis, sem ninguém para lembrar de renovar. Token fixo é colar um Bearer que expira e um dia derruba a varredura. Redis é o desenho antigo: outro processo renova e grava numa chave, e este serviço só lê. escolha um dos três, nunca dois padrão renova sozinha
O endereço que devolve o token. Em ERP com Keycloak termina sempre em /protocol/openid-connect/token. URL é a mesma que o fluxo de login usava obrigatório neste modo peça ao time do ERP, ou copie do fluxo de login que existe hoje
Identificação da aplicação no ERP. Não é segredo. textoobrigatório neste modo
Nem todo ERP exige. Vazio = não é enviado. segredofica no .env e nunca volta na tela
A conta de integração, não a de uma pessoa: senha de gente muda e derruba a varredura. textoobrigatório neste modo
segredo fica no .env e nunca volta na tela obrigatório neste modo
Quando o ERP informa a validade do token, ela manda. Este número é a rede de segurança para quando ele não informa. minutospadrão 55
⏰ Quando a varredura roda

Não se define aqui. A mensageria nasce avisando na véspera, às 07:00, de segunda a sexta — e a sexta já cobre sábado, domingo e segunda. Quem muda isso é a própria clínica, no painel dela, em Configurações → Quando o lembrete é enviado, onde dá para criar regras diferentes por médico, por dia e por horário.

👩‍⚕️ Prestadores varridos

A varredura roda por prestador: para cada janela, ela pede ao ERP a agenda de cada código desta lista. Quem não estiver aqui não é varrido e os pacientes dele não recebem lembrete. Isto vira a tabela prestadores do projeto — depois dá para editar por /api/prestadores sem regerar nada.

O identificador do prestador dentro do ERP — não é o CRM nem o CPF. É com ele que o coletor pede a agenda. texto zeros à esquerda contam: 000500 ≠ 500 sem vírgula
Serve para você reconhecer a linha aqui e no log. Não vai para o paciente — o nome que ele lê na mensagem vem da agenda do ERP. texto opcional sem vírgula
Sobrepõe Janelas de dias para este prestador só. Serve para quem precisa de mais antecedência que o resto da clínica. dias inteiro ≥ 0 vazio = herda a janela geral
nenhum prestador a ordem não importa — a varredura percorre a lista inteira
Nenhum prestador na lista. O projeto até nasce assim, mas a varredura roda e não encontra ninguém.
colar uma lista pronta (várias de uma vez)

Uma por linha, no formato codigo, nome, janela — é o mesmo texto que o botão acima monta. Serve para colar de uma planilha sem digitar item a item; a lista se redesenha enquanto você cola. Linha começando com # é ignorada.

Atendimento humano WTS

Diferente do outro tipo, aqui o paciente que pede para remarcar ou cancelar é transferido para uma equipe de gente, não apenas etiquetado.
O modelo aprovado na Meta com quatro variáveis: paciente, médico, data e hora. WTS → Modelos de mensagem → copie o Id
Para onde a conversa é transferida quando o paciente não confirma. Sem isto ele pede para remarcar e fica sem atendente. WTS → Equipes → abra a equipe → copie o Id
O webhook de resposta só processa mensagens que chegaram neste número. Protege contra tratar conversa de outra linha da mesma conta WTS. +551236320022

O que acontece quando o paciente responde

O sistema lê a resposta, entende a intenção e então avisa o Otimus, marca o contato na WTS e responde ao paciente.
O sistema lê a resposta, entende a intenção e então grava no ERP, marca o contato na WTS e responde ao paciente.
1 Palavras que o sistema entende clínica

Você decide o que conta como confirmar. Separe por vírgula — acento e maiúscula não importam. Em branco usa a lista pronta.

mantém o agendamento
as duas seguem o mesmo caminho
só vale se estiver marcado no passo 3
“não vou confirmar” não é confirmação

Resposta que o sistema não entende não é chutada: vai para revisão humana, ninguém tem o agendamento alterado por engano.

detalhe técnico

Tokenização por palavra com lista branca, sem fuzzy match. Prioridade de decisão: cancelar > desmarcar > confirmar. Negação encontrada em qualquer posição derruba a intenção.

2 Etiqueta colada no contato WTS OPCIONAL

Etiqueta é o adesivo que a WTS cola no contato. Depois de entender a resposta, o sistema cola a etiqueta certa para a clínica poder filtrar depois quem confirmou e quem não. Em branco não cola nada.

As três já precisam existir na WTS — o sistema só cola, não cria. WTS → Etiquetas → abra a etiqueta → copie o Id.

colada em quem respondeu que vem 3d9b2f14-8a07-4c65-b2e1-19f4a8d05c73
colada em quem pediu outro dia
colada em quem desistiu da consulta

Marcar uma etiqueta apaga as outras que o contato já tinha — substitui, não soma. Se a clínica usa etiqueta para outra coisa, confirme antes.

3 Respostas que o Otimus aceita receber Respostas que o ERP aceita receber Otimus ERP

Pergunte ao time do Otimus (Helena) quais destas o sistema deles aceita. Uns aceitam três, outros quatro — é decisão deles.

O que o ERP aceita: confirmar vira PATCH em /confirma, cancelar vira PATCH em /cancela, e desmarcar não mexe no ERP — transfere o atendimento para a equipe de agendamento.

Para onde o sistema manda a resposta do paciente assim que a entende. Sem isto o Otimus nunca fica sabendo que alguém confirmou — a mensagem sai, o paciente responde e a informação não chega do outro lado. É o endereço do Otimus deste cliente: um POST por procedimento, com o telefone e a palavra da ação. peça ao time do Otimus (Helena) o endereço de callback https://api.agentprocrm.com.br/webhook/agendamento

Marque o que o sistema deles aceita e escreva, ao lado, a palavra que o Otimus recebe naquela ação. Não é a palavra que o paciente digita (essa é o passo 1): é a que sai no callback. Cada cliente tem a sua, e palavra que o Otimus não reconhece ele ignora calado — a resposta do paciente some sem erro nenhum.

vai no campo text do callback quando o paciente mantém o agendamento texto o Otimus só aceita em CAIXA ALTA vazio = manda o que o paciente escreveu
quando ele pede outro dia ou horário texto CAIXA ALTA ex. REMARCAR
quando ele pede para desmarcar texto CAIXA ALTA ex. DESMARCAR
quando ele desiste da consulta texto CAIXA ALTA vazio = manda o que o paciente escreveu

O que o Otimus não aceita vai para revisão humana em vez de virar outra coisa — converter mudaria a decisão do paciente sem ele saber.

O que o ERP não aceita vai para revisão humana em vez de virar outra coisa — converter mudaria a decisão do paciente sem ele saber.

4 O que responder ao paciente clínica OPCIONAL

Enviada logo depois de entender a resposta. Em branco não responde nada.

o assunto acabou — o normal é encerrar o ticket
precisa de gente do outro lado para remarcar
quando o paciente desmarca
alguém confirma o cancelamento na agenda
revisão humana: deixar aberto é o mais seguro

Abaixo de cada resposta, o que fazer com o ticket daquele caso: finalizar tira da fila quem já resolveu, transferir entrega a conversa a uma equipe de gente, não mexer deixa o atendimento aberto — que é como era antes deste campo.

Peça o texto à clínica — isto chega a paciente de verdade. Se citar telefone, use o número daquela clínica.

A ordem é responder primeiro, agir depois. A WTS aceita a mensagem na hora, mas quem entrega é o WhatsApp: agir no ticket antes disso fecha o atendimento com a resposta ainda a caminho, e ela reaparece solta, num atendimento novo. A espera roda em segundo plano — ninguém fica esperando por ela. Zero desliga. segundos 0 a 120 padrão 10

O que o pipeline vai fazer

1. gerar o projeto a partir do template  →  2. terraform apply (rede, volume e Postgres na VPS)  →  3. ansible (Bun, schema, systemd, nginx, SSL)  →  4. testes unit + integração + smoke

Projetos

Cada linha é uma mensageria numa VPS.
SlugTítuloServidorDomínio PortasStatusAções
carregando…

Testes automatizados

unit — lógica pura (classificação, agrupamento, telefone, textos) •  integração — repositórios contra o Postgres real do projeto •  smoke — HTTP ponta a ponta contra o app no ar, sem disparar WhatsApp real.

Execuções

Toda etapa do pipeline vira uma execução com saída completa.
#EtapaStatusInício DuraçãoComando
carregando…