O paciente que falta na consulta de psicologia custa duas vezes: a sessão perdida (R$150-300 que não entram no caixa) e o impacto clínico no tratamento (continuidade interrompida). Pesquisa do CFP de 2024 mostra que clínicas de saúde mental têm taxa média de no-show de 22%, contra 8% em outras especialidades médicas — em parte porque o paciente em sofrimento mental tem ambivalência sobre o atendimento, em parte porque os lembretes não funcionam (SMS é frio, ligação invade, email vai pra spam).
WhatsApp resolve essas duas pontas: é o canal natural do paciente, e a confirmação aceita ou nega com 1 clique. Mas o psicólogo carrega responsabilidades extras: sigilo profissional (Código de Ética CFP), LGPD com base legal específica (saúde é dado sensível), e cuidado redobrado em situações de risco. Esse artigo mostra o passo a passo respeitando tudo isso.
O custo do no-show em psicologia
Um psicólogo autônomo com 25 atendimentos/semana e 22% de no-show perde 5,5 sessões/semana × R$200 = R$1.100/semana = R$4.400/mês. Com WhatsApp + lembrete inteligente, no-show cai pra 6-10% (média de mercado), recuperando R$3.000-3.500/mês.
Esse mesmo cálculo escala em clínicas: clínica de 6 psicólogos com volume similar economiza R$20-25 mil/mês.
Os 4 fluxos automatizados
1. Confirmação 48h antes
Mensagem é enviada 2 dias antes com botão "Confirmo" / "Preciso reagendar". Em consultas onde a marcação é antiga (>1 semana), confirmação é crítica.
2. Lembrete 2h antes
Texto curto reforçando horário e endereço (ou link da videochamada). Não pede ação — só lembra.
3. Reagendamento via bot
Se o paciente clicou "preciso reagendar", bot oferece 3 horários disponíveis na semana seguinte. Quando o psicólogo abre a agenda no Sábado, vê os ajustes feitos automaticamente.
4. Pós-sessão (opcional)
2 horas depois da sessão, mensagem opcional de "Como você está se sentindo agora?" — só pra pacientes que consentiram explicitamente. Vira insight clínico.
Privacidade: a regra de ouro
Mensagens automáticas nunca mencionam:
- Diagnóstico ("seu tratamento de ansiedade")
- Tipo de terapia ("sua sessão de TCC")
- Identidade do profissional ("Dr. João Psiquiatra") — ok mencionar nome, não especialidade na mensagem
- Conteúdo da sessão anterior
Padrão correto: "Confirmando sua consulta amanhã às 14h" ou "Sua sessão com Marina começa em 2 horas". Genérico mas funcional.
Cron que envia confirmação 48h antes
import cron from "node-cron";
import axios from "axios";
const ZAP = axios.create({
baseURL: "https://api.zap-api.tech/v1",
headers: { Authorization: `Bearer ${process.env.ZAP_TOKEN}` },
});
// Diariamente às 9h, busca consultas das próximas 48h
cron.schedule("0 9 * * *", async () => {
const inicioJanela = new Date();
inicioJanela.setHours(inicioJanela.getHours() + 47);
const fimJanela = new Date();
fimJanela.setHours(fimJanela.getHours() + 49);
const consultas = await db.consulta.findMany({
where: {
dataHora: { gte: inicioJanela, lte: fimJanela },
status: "agendada",
lembrete48h: false, // não reenvia
paciente: { consentimentoWhatsapp: true },
},
include: { paciente: true, profissional: true },
});
for (const c of consultas) {
const horarioFormatado = c.dataHora.toLocaleTimeString("pt-BR", {
hour: "2-digit",
minute: "2-digit",
});
const dataFormatada = c.dataHora.toLocaleDateString("pt-BR");
await ZAP.post(`/instances/${process.env.INSTANCE_ID}/messages`, {
to: c.paciente.telefone,
type: "buttons",
buttons: {
text:
`Olá ${c.paciente.primeiroNome}! Confirmando sua consulta com ${c.profissional.primeiroNome} ` +
`em ${dataFormatada} às ${horarioFormatado}. Tudo certo?`,
buttons: [
{ id: `confirma_${c.id}`, text: "Confirmo" },
{ id: `reagenda_${c.id}`, text: "Preciso reagendar" },
{ id: `cancela_${c.id}`, text: "Não vou poder" },
],
},
});
await db.consulta.update({
where: { id: c.id },
data: { lembrete48h: true, lembrete48hEm: new Date() },
});
}
});
Webhook recebendo resposta
app.post("/webhook/zap", async (req, res) => {
res.status(200).send("ok");
if (req.body.type !== "message.received") return;
const buttonId = req.body.message.body?.buttonId;
if (!buttonId) return;
const [acao, consultaId] = buttonId.split("_");
const consulta = await db.consulta.findUnique({ where: { id: consultaId } });
if (!consulta) return;
if (acao === "confirma") {
await db.consulta.update({
where: { id: consultaId },
data: { status: "confirmada", confirmadaEm: new Date() },
});
await replyText(req.body.message.from, "Obrigada! Te aguardamos.");
}
if (acao === "reagenda") {
const slots = await buscarSlotsDisponiveis(consulta.profissionalId, 7); // próx 7 dias
const slotsTexto = slots
.slice(0, 3)
.map((s, i) => `${i + 1}. ${s.dataHora.toLocaleString("pt-BR")}`)
.join("\n");
await replyText(
req.body.message.from,
`Esses são 3 horários disponíveis:\n${slotsTexto}\n\nResponda 1, 2 ou 3.`
);
// Salva contexto pra próxima mensagem
await redis.set(
`reagenda:${req.body.message.from}`,
JSON.stringify({ consultaId, slots: slots.slice(0, 3) }),
"EX",
3600
);
}
if (acao === "cancela") {
await db.consulta.update({
where: { id: consultaId },
data: { status: "cancelada", canceladaEm: new Date(), canceladaPor: "paciente" },
});
await replyText(req.body.message.from, "Sessão cancelada. Quando quiser reagendar é só responder aqui.");
// Notifica psicólogo internamente
await notificarProfissional(consulta.profissionalId, `Cancelamento: ${consulta.paciente.primeiroNome} - ${consulta.dataHora}`);
}
});
LGPD: consentimento gravado
Saúde mental é dado sensível (Art. 11 LGPD). Antes de mandar qualquer mensagem automática, paciente assinou termo de consentimento (presencial ou digital):
// Estrutura do consentimento
{
"pacienteId": "uuid",
"consentimentoWhatsapp": true,
"consentimentoPosSession": false, // opcional, mais sensível
"aceitouEm": "2026-05-15T14:30:00Z",
"ip": "200.10.20.30",
"termoVersao": "v3.2",
"termoTexto": "Autorizo o uso do meu telefone para lembretes de consulta..."
}
O termo deixa claro: (1) qual a finalidade, (2) que pode revogar a qualquer momento ("opt-out"), (3) que mensagens não conterão diagnóstico, (4) prazo de retenção de mensagens.
Compliance CFP/CFM
- Resolução CFP 11/2018: atendimento online é permitido, requer cadastro do psicólogo no e-Psi. Mensagens WhatsApp de agendamento não são "atendimento" — são logística.
- Sigilo (Código de Ética): qualquer dado de paciente em backup, log ou banco precisa estar criptografado em repouso. Use Postgres com pgcrypto ou criptografia de coluna.
- Prontuário: jamais via WhatsApp. WhatsApp é canal de logística (agendamento/lembrete). Anotações clínicas vão pra prontuário eletrônico próprio.
Casos práticos
Psicólogo autônomo (consultório próprio)
1 instância WhatsApp, calendário Google sincronizado, cron diário 9h. Confirmação 48h + lembrete 2h. Investimento: R$49/mês ZAP API + 1 dia para configurar. ROI: +R$3.500/mês recuperando no-show.
Clínica multi-profissionais
1 instância por profissional (cada psicólogo com seu próprio número). Painel central que orquestra envios. Reagendamento envia para o profissional certo (não cruza agendas). Investimento: R$29-49 por profissional, ROI proporcional.
Hospital/CAPS de saúde mental
Volume alto (500+ consultas/dia), múltiplas equipes (psiquiatria, psicologia, terapia ocupacional). Aqui vale instância dedicada por equipe + relatórios consolidados. Compliance é mais rígido — auditoria interna analisa amostra mensal.
FAQ
Posso enviar prontuário ou anotação clínica via WhatsApp?
Não. WhatsApp não é prontuário (mesmo com criptografia E2E, fica armazenado em servidor fora do seu controle, e backup do paciente vira cópia descontrolada). Use sistema de prontuário eletrônico certificado para isso. WhatsApp é só agendamento e logística.
Como atender paciente menor de idade?
Mensagens vão para o telefone do responsável legal, não do menor. Termo de consentimento é assinado pelo responsável. Se o adolescente tem mais de 16 anos e contrato de psicoterapia foi firmado individualmente (situação rara mas legal), aí o consentimento é dele — porém com cuidado redobrado em mensagens explícitas sobre conteúdo.
WhatsApp tem criptografia E2E?
Tem. Mensagens entre dois usuários trafegam criptografadas. Mas: (1) backup do celular do paciente pode ir pra Google Drive sem criptografia; (2) seu sistema (que dispara via API) tem cópia da mensagem em log. Por isso a regra continua sendo: nunca conteúdo clínico, só logística.
Por quanto tempo posso reter as mensagens?
Defina retenção curta (30-90 dias) para mensagens de logística. Prontuário tem retenção legal própria (20 anos), mas isso vai no prontuário eletrônico — não no banco do bot. Cron diário apaga mensagens antigas.
E se o paciente manda mensagem indicando risco de suicídio?
Bot deve detectar palavras-chave (suicídio, "não aguento mais", "vou me matar") e imediatamente escalonar pra humano com prioridade máxima — não pode ficar na fila normal. Mensagem padrão: "Estou aqui. Vou te conectar com o Dr. X agora. Em emergência, ligue CVV 188 (gratuito, 24h)." E dispara alerta no celular do profissional plantonista.
Pronto para reduzir no-show no consultório? A ZAP API tem 7 dias grátis para você configurar confirmação automática e medir o impacto. Criar conta grátis sem cartão.