Automatizar agendamentos via WhatsApp com API é a estratégia mais eficiente para clínicas, salões de beleza, consultórios e prestadores de serviço que querem reduzir faltas e no-shows. Segundo dados do setor de saúde, a taxa média de não comparecimento a consultas no Brasil gira em torno de 30%. Com um simples lembrete automático pelo WhatsApp, esse número pode cair para menos de 10%. Neste guia completo, você vai aprender a construir um sistema de confirmação e lembrete de agendamentos usando a ZAP API, com exemplos de código prontos para produção.
Por que automatizar agendamentos pelo WhatsApp?
O WhatsApp é o canal de comunicação mais utilizado no Brasil, com mais de 197 milhões de usuários ativos. Quando você envia um lembrete de agendamento pelo WhatsApp, a taxa de leitura ultrapassa 95% — muito superior ao e-mail (20%) ou SMS (75%). As vantagens são claras:
- Redução de no-shows em até 70%: lembretes automáticos 24h e 1h antes do horário garantem que o cliente não esqueça
- Confirmação interativa: o cliente responde CONFIRMAR ou CANCELAR, liberando o horário automaticamente
- Economia de tempo da recepção: sem necessidade de ligar para cada paciente/cliente
- Reagendamento automático: quando o cliente cancela, o sistema já oferece novos horários
- Histórico centralizado: todas as interações ficam registradas via webhook
Arquitetura do sistema de agendamentos
O fluxo funciona em duas direções:
- Outbound (lembretes): um cron job consulta os agendamentos do dia seguinte e envia lembretes via ZAP API
- Inbound (respostas): um webhook recebe as respostas dos clientes e atualiza o status do agendamento no banco de dados
Pré-requisitos
- Node.js 18+ instalado
- Conta na ZAP API (trial de 7 dias grátis, sem cartão)
- Banco de dados com tabela de agendamentos (usaremos PostgreSQL como exemplo)
Passo 1: Configuração inicial
npm install axios node-cron express dotenv pg
# .env
ZAP_TOKEN=tk_seu_token_aqui
ZAP_INSTANCE=inst_seu_id_aqui
DATABASE_URL=postgresql://user:pass@localhost:5432/agendamentos
PORT=3000
Passo 2: Módulo de envio via ZAP API
// zap.js
const axios = require('axios');
const api = axios.create({
baseURL: 'https://zap-api.tech/v1',
headers: { Authorization: 'Bearer ' + process.env.ZAP_TOKEN }
});
async function enviarLembrete(phone, nomeCliente, dataHora, servico) {
const mensagem =
`Olá ${nomeCliente}! Lembrete do seu agendamento:\n\n` +
`Serviço: ${servico}\nData/Hora: ${dataHora}\n\n` +
`Responda:\n*CONFIRMAR* - para confirmar presença\n` +
`*CANCELAR* - para cancelar e reagendar`;
return api.post(
'/instances/' + process.env.ZAP_INSTANCE + '/send',
{ phone, type: 'text', body: mensagem }
);
}
module.exports = { enviarLembrete };
Passo 3: Cron job para lembretes automáticos
// cron-lembretes.js
require('dotenv').config();
const cron = require('node-cron');
const { Pool } = require('pg');
const { enviarLembrete } = require('./zap');
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
// Lembrete 24h antes — roda todo dia às 8h
cron.schedule('0 8 * * *', async () => {
const amanha = new Date();
amanha.setDate(amanha.getDate() + 1);
const dataStr = amanha.toISOString().split('T')[0];
const { rows } = await pool.query(
`SELECT id, phone, nome_cliente, data_hora, servico
FROM agendamentos
WHERE DATE(data_hora) = $1 AND status = 'pendente'
AND lembrete_24h = false`,
[dataStr]
);
for (const ag of rows) {
try {
const dataFormatada = new Date(ag.data_hora)
.toLocaleString('pt-BR', { dateStyle: 'short', timeStyle: 'short' });
await enviarLembrete(ag.phone, ag.nome_cliente, dataFormatada, ag.servico);
await pool.query('UPDATE agendamentos SET lembrete_24h = true WHERE id = $1', [ag.id]);
await new Promise(r => setTimeout(r, 2000));
} catch (err) {
console.error(`[ERRO] ${ag.phone}:`, err.message);
}
}
});
Passo 4: Webhook para receber respostas
// server.js
require('dotenv').config();
const express = require('express');
const { Pool } = require('pg');
const app = express();
app.use(express.json());
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
app.post('/webhook', async (req, res) => {
res.json({ ok: true });
const { event, data } = req.body;
if (event !== 'message.received' || data.fromMe) return;
const texto = (data.body || '').trim().toUpperCase();
const phone = data.phone;
const { rows } = await pool.query(
`SELECT id, nome_cliente FROM agendamentos
WHERE phone = $1 AND status = 'pendente' AND data_hora > NOW()
ORDER BY data_hora ASC LIMIT 1`, [phone]
);
if (rows.length === 0) return;
if (texto === 'CONFIRMAR') {
await pool.query("UPDATE agendamentos SET status = 'confirmado' WHERE id = $1", [rows[0].id]);
} else if (texto === 'CANCELAR') {
await pool.query("UPDATE agendamentos SET status = 'cancelado' WHERE id = $1", [rows[0].id]);
}
});
app.listen(process.env.PORT);
Resultados esperados
- Redução de 50-70% nos no-shows
- Economia de 2-4 horas diárias da equipe de recepção
- Aumento de 15-25% na taxa de reagendamento (vs. cancelamento definitivo)
O investimento na ZAP API começa em R$49/mês para a primeira instância, com trial de 7 dias grátis. A partir da terceira instância, o valor cai para R$29/mês.
FAQ
- Preciso de um número separado para os lembretes?
Não necessariamente. Você pode usar o mesmo número do WhatsApp da clínica ou empresa. - Quantos lembretes posso enviar por dia?
Não há limite fixo na ZAP API. Recomendamos intervalo de 1-2 segundos entre envios. - Posso enviar lembretes com botões de resposta?
Sim! A ZAP API suporta mensagens com botões interativos. Consulte a documentação. - Como integro com meu sistema existente?
A integração é via REST API. Qualquer sistema que faça requisições HTTP pode se integrar. Veja mais em casos de uso.
Pronto para reduzir no-shows? Crie sua conta gratuita na ZAP API e comece a enviar lembretes em menos de 30 minutos.