Um cirurgião-dentista que faz implante perde, em média, R$ 1.800 por sessão de no-show. Quando some um paciente que tinha sessão de canal marcada, são 2 horas de cadeira reservada, técnica preparada, instrumental esterilizado, anestésico em ponto de uso. Em clínicas com 4-6 cadeiras simultâneas, o no-show de 2-3 pacientes na semana significa R$ 7.000 a R$ 16.000 perdidos — recorrente, mensal, evitável.
O WhatsApp resolve no-show com taxa de eficácia altíssima no setor odontológico: lembrete a 48h e 2h antes derruba absenteísmo de 22% para 6%. Mas vai além — todo o ciclo de cuidado do paciente (orientação pré-procedimento, pós-operatório, pesquisa de satisfação, manutenção semestral) cabe em fluxos automatizados. Este guia mostra como clínicas estruturam comunicação odontológica via WhatsApp respeitando Resolução CFO e LGPD.
Os 5 pontos críticos do atendimento odontológico
Cada momento exige tom, tempo e conteúdo diferentes:
- Agendamento confirmado: mensagem imediata com data, hora, endereço e profissional
- Confirmação 48h antes: botão "confirmar/remarcar/cancelar" — abre vaga em caso de cancelamento
- Orientação pré-procedimento: 24h antes, PDF com instruções (jejum, suspensão de aspirina, cuidados)
- Lembrete 2h antes: texto curto, endereço com link Maps
- Pós-atendimento: 4h após o procedimento, orientações e canal aberto pra dúvidas; 7 dias depois, NPS
Caso 1: Confirmação 48h antes com botões
import axios from "axios";
import cron from "node-cron";
const ZAP = axios.create({
baseURL: "https://api.zap-api.tech/v1",
headers: { Authorization: `Bearer ${process.env.ZAP_TOKEN}` },
});
// Roda a cada 1h
cron.schedule("0 * * * *", async () => {
const consultas = await db.query(`
SELECT c.id, c.data_hora, c.procedimento, p.nome, p.telefone, d.nome AS dentista
FROM consultas c
JOIN pacientes p ON p.id = c.paciente_id
JOIN dentistas d ON d.id = c.dentista_id
WHERE c.data_hora BETWEEN NOW() + INTERVAL '47 hours' AND NOW() + INTERVAL '49 hours'
AND c.status = 'AGENDADA'
AND c.confirmacao_enviada = false
`);
for (const c of consultas.rows) {
await ZAP.post(`/instances/${process.env.INSTANCE_ID}/messages`, {
to: c.telefone,
type: "buttons",
text: {
body: `Olá ${c.nome.split(" ")[0]}! Confirmando sua consulta de ${c.procedimento} com Dr(a). ${c.dentista} em ${formatDate(c.data_hora)}. Posso confirmar?`,
},
buttons: [
{ id: `confirma_${c.id}`, title: "✅ Confirmo" },
{ id: `remarca_${c.id}`, title: "📅 Remarcar" },
{ id: `cancela_${c.id}`, title: "❌ Cancelar" },
],
});
await db.query("UPDATE consultas SET confirmacao_enviada=true WHERE id=$1", [c.id]);
}
});
Caso 2: PDF de orientação pré-procedimento
Implante exige jejum de 4h, suspensão de aspirina por 7 dias, banho antes de sair de casa. Canal exige analgésico antes pra reduzir dor. Cada procedimento tem PDF próprio.
const orientacoesPorProcedimento = {
"implante": "implante-pre.pdf",
"canal": "canal-pre.pdf",
"extracao": "extracao-pre.pdf",
"limpeza": null, // não precisa orientação especial
};
async function enviarOrientacao(consulta) {
const arquivo = orientacoesPorProcedimento[consulta.procedimento];
if (!arquivo) return;
const url = await s3.getSignedUrl("getObject", {
Bucket: "orientacoes-clinica",
Key: arquivo,
Expires: 3600,
});
await ZAP.post(`/instances/${process.env.INSTANCE_ID}/messages`, {
to: consulta.telefone,
type: "document",
document: {
url,
filename: `Orientacoes_${consulta.procedimento}.pdf`,
caption: `${consulta.nome.split(" ")[0]}, sua consulta é amanhã. Leia as orientações antes 🦷. Qualquer dúvida me responda aqui.`,
},
});
}
Caso 3: Pós-operatório e pesquisa NPS
4 horas após implante ou canal, paciente está saindo do efeito da anestesia. Mensagem de cuidado abre canal pra qualquer intercorrência (sangramento, dor incomum) chegar antes que vire emergência.
// Cron horário roda
cron.schedule("0 * * * *", async () => {
const recentes = await db.query(`
SELECT id, paciente_id, telefone, nome, procedimento
FROM consultas
WHERE realizada_em BETWEEN NOW() - INTERVAL '5 hours' AND NOW() - INTERVAL '4 hours'
AND pos_operatorio_enviado = false
AND procedimento IN ('implante','canal','extracao')
`);
for (const c of recentes.rows) {
await ZAP.post(`/instances/${process.env.INSTANCE_ID}/messages`, {
to: c.telefone,
type: "text",
text: {
body: `Oi ${c.nome.split(" ")[0]}! Como você está se sentindo após o procedimento? Se tiver dor forte, sangramento ou dúvida, me avise por aqui. Boa recuperação 🦷✨`,
},
});
await db.query("UPDATE consultas SET pos_operatorio_enviado=true WHERE id=$1", [c.id]);
}
});
// 7 dias depois, NPS
cron.schedule("0 10 * * *", async () => {
const semanaPassada = await db.query(`
SELECT id, telefone, nome FROM consultas
WHERE realizada_em::date = (NOW() - INTERVAL '7 days')::date
AND nps_enviado = false
`);
for (const c of semanaPassada.rows) {
await ZAP.post(`/instances/${process.env.INSTANCE_ID}/messages`, {
to: c.telefone,
type: "text",
text: {
body: `${c.nome.split(" ")[0]}, faz 1 semana da sua consulta. De 0 a 10, quanto você indicaria nossa clínica para um amigo? Sua resposta é anônima e ajuda muito.`,
},
});
await db.query("UPDATE consultas SET nps_enviado=true WHERE id=$1", [c.id]);
}
});
Caso 4: Manutenção semestral preventiva
Limpeza profissional a cada 6 meses é o procedimento mais lucrativo da odontologia preventiva e o que mais escapa por falta de lembrete. Aluno some por 18 meses, volta com problema avançado.
// Mensal, busca pacientes com última limpeza entre 5 e 7 meses atrás
const proximaLimpeza = await db.query(`
SELECT p.id, p.nome, p.telefone
FROM pacientes p
LEFT JOIN consultas c ON c.paciente_id=p.id AND c.procedimento='limpeza'
GROUP BY p.id
HAVING MAX(c.realizada_em) BETWEEN NOW() - INTERVAL '7 months' AND NOW() - INTERVAL '5 months'
`);
for (const p of proximaLimpeza.rows) {
await ZAP.post(`/instances/${process.env.INSTANCE_ID}/messages`, {
to: p.telefone,
type: "text",
text: {
body: `${p.nome.split(" ")[0]}, faz 6 meses da sua última limpeza! Tá na hora de marcar a próxima. Posso te ajudar com horário?`,
},
});
}
Compliance CFO e LGPD
Dois pontos críticos pra clínica odontológica:
- Resolução CFO 118/2012: não diagnosticar pelo WhatsApp. Mensagens devem ser administrativas (agenda, orientação genérica de pós-operatório, lembretes). Diagnóstico exige consulta presencial.
- LGPD: base legal é "execução de contrato" para mensagens transacionais (confirmação) e "consentimento" para campanhas (manutenção semestral, promoção). Opt-out automático: paciente que digitar "sair" entra em blocklist.
Anti-padrões que prejudicam a clínica odontológica
Esses erros aparecem com frequência e têm consequências além de UX ruim:
- Diagnóstico por texto: "dói quando mastigo, o que pode ser?" respondido com "pode ser cárie ou fratura de cúspide" no WhatsApp. Viola Resolução CFO 118/2012. Resposta correta: "Isso precisa de avaliação. Posso te encaixar essa semana?"
- Orçamento sem consulta presencial: paciente manda foto e pede orçamento de implante. Responder com valor sem examinar é vedado. Bot deve redirecionar para agendamento de avaliação gratuita.
- Mensagem de lembrete igual para todos os procedimentos: lembrete de limpeza tem tom diferente de lembrete de implante (mais ansiedade, mais necessidade de orientação). Segmente template por procedimento.
- Disparo de pós-operatório tarde demais: mensagem 24h depois de extração pode ser tarde para intercorrência. Janela correta: 3-5 horas após procedimento, quando anestesia está vencendo.
- Não capturar resposta do NPS: muitas clínicas enviam pergunta NPS mas não têm webhook configurado para capturar a resposta numérica. Resultado: dados perdidos, impossível calcular NPS real.
Métricas para monitorar em clínica odontológica
- Taxa de confirmação de consulta: % de pacientes que responderam "confirmo" ao botão de 48h. Meta: acima de 70%.
- Redução de no-show: compare taxa de absenteísmo 30 dias antes e 30 dias depois da implementação. Benchmark: 22% → 6-8%.
- Pacientes na manutenção semestral: % de pacientes ativos que foram chamados para limpeza e agendaram. Meta: acima de 55% em 30 dias de campanha.
- NPS por dentista: quebrar NPS por profissional revela quem tem melhor experiência de atendimento — insumo para coaching interno.
FAQ
Posso enviar orçamento pelo WhatsApp?
Sim, mas como documento (PDF) não como diagnóstico. Após avaliação presencial, dentista monta orçamento, envia em PDF assinado. Cliente confirma aceite por escrito ou presencial. Não orçar "à distância" sem ver o paciente — é vedado pelo CFO.
Como integrar com Dental Office, Easy Dental, Clinicorp?
Esses sistemas têm webhook ou API REST. Você cria worker que escuta eventos (nova consulta, consulta concluída, paciente cadastrado) e dispara ZAP API. Sem webhook, polling de 30 minutos resolve.
E para odontopediatria? Como abordar criança?
Mensagem vai pro responsável (pai/mãe), com tom apropriado. Inclua emoji 🦷✨ e linguagem leve. Para a criança, peça que o responsável leia junto: "Mãe da Júlia, conta pra ela que vai ganhar adesivo no fim da consulta!". Reforço positivo reduz medo.
Pediatria de urgência fora do horário, como tratar?
Mensagem fora do horário recebe resposta automática: "Recebemos sua mensagem. Se for urgência (dor forte, trauma, sangramento), ligue para [PLANTÃO]. Caso contrário, retornamos amanhã às 8h." Plantão deve ser número diferente, atendido por dentista de plantão.
Pesquisa NPS recebe muitas respostas?
Taxa média odontologia: 38-52% respondem. Resposta numérica simples (0-10) sem texto adicional. Promotores (9-10) recebem pedido de avaliação no Google; detratores (0-6) recebem mensagem do gestor pra resolver problema antes que vire reclamação pública.
Reduza no-show da sua clínica em 30 dias. A ZAP API tem fluxo pronto pra odontologia: agendamento → confirmação → orientação → pós-operatório → NPS. Compatível com os principais sistemas de gestão. Criar conta grátis e teste o template no painel.