Bot e corretor no mesmo WhatsApp: como faço o bot sair da conversa
Estou montando um assistente de WhatsApp para imobiliária e esbarrei num problema que acho que mais gente vai ter agora com a coexistência da Meta.
Pra quem não acompanhou: dá pra deixar o número no app WhatsApp Business do celular e, ao mesmo tempo, ligado na Cloud API. A imobiliária continua usando o app como sempre, e o bot responde quem chama de noite.
O problema aparece rápido: o corretor responde um cliente pelo celular e, cinco minutos depois, o bot entra perguntando "compra ou aluguel?". Ninguém quer isso.
Como o servidor sabe que um humano respondeu
Toda vez que alguém manda mensagem pelo app, a Meta dispara um webhook no campo smb_message_echoes. O to é o número do cliente. Eu trato isso como um evento separado:
if (change.field === 'smb_message_echoes') {
for (const e of v.message_echoes || []) {
out.push({ kind: 'echo', id: e.id, to: canon(e.to) });
}
}
Quando chega um eco, gravo paused_until na conversa (agora + 12h) e só. O texto do corretor eu não guardo, não preciso dele.
Antes de responder qualquer mensagem, o bot olha esse campo de novo. Se ainda está dentro da pausa, fica quieto.
Por que 12 horas? Chute informado: cobre o resto do expediente e a noite. Se o cliente voltar a escrever no dia seguinte e ninguém responder, o bot volta. Aceito sugestões.
O nono dígito
Esse é bem brasileiro. O id de WhatsApp de muito celular antigo vem sem o 9 (55 81 9999-0001 em vez de 55 81 99999-0001). Se o eco chega num formato e a mensagem do cliente no outro, a pausa vai parar em outra conversa e o bot responde do mesmo jeito. Por isso todo número passa por esta função antes de qualquer comparação:
function canon(raw) {
const d = String(raw || '').replace(/\D/g, '');
if (!d) return null;
if (d.length === 12 && d.startsWith('55') && /[6-9]/.test(d[4])) return `+${d.slice(0, 4)}9${d.slice(4)}`;
return `+${d}`;
}
O [6-9] logo depois do DDD é o que separa celular de fixo.
Deixar o corretor responder primeiro
No horário comercial o bot não responde na hora: espera 4 minutos e só fala se nenhum corretor respondeu. Fora do horário, responde direto. Escolhi 4 e não 5 por um motivo nada nobre: a função na Vercel morre em 300 segundos, e a espera mais a resposta do modelo têm que caber aí.
Também tem um debounce de 4 segundos. Tem gente que manda "oi", "tudo bem?" e "vi o apê em Boa Viagem" em três mensagens. Cada uma espera um pouco, e só a última responde, lendo as três juntas.
Webhook repetido
A Meta reenvia o webhook quando não recebe resposta a tempo, e o parceiro que repassa também. Cada id de mensagem vira uma linha com chave única, então o segundo envio morre no on conflict do nothing.
Contatos antigos
Quem já estava no app antes do bot (inquilino, proprietário, cliente no meio de negociação) nunca recebe resposta automática. Pior que o bot falar na hora errada com um cliente novo é perguntar "compra ou aluguel?" pro proprietário.
Está tudo testado, mas ainda não rodou com cliente de verdade, então pode ter caso que eu não previ. Se alguém já colocou coexistência em produção, queria saber como resolveu a pausa e se 12h faz sentido pra vocês.
Escrevi um guia mais completo de como ligar o número na Cloud API: https://betterlane.com.br/aprenda/como-conectar-whatsapp-a-um-assistente
(Sou o Thiago, de Recife. Trabalho com isso na Betterlane.)