A janela de 24 horas
É a regra que mais confunde quem chega ao WhatsApp oficial, e a causa mais comum de
422 meta_error em produção.
Você só pode enviar mensagem de conteúdo livre dentro de 24 horas contadas a partir da última mensagem que o cliente te enviou. Fora dessa janela, o WhatsApp aceita apenas templates previamente aprovados.
Como a janela abre e fecha
Só a mensagem do cliente abre a janela. Suas próprias mensagens não estendem o prazo — mandar dez mensagens seguidas não compra mais tempo.
O erro quando a janela está fechada
{
"error": {
"message": "The Meta Cloud API rejected the request.",
"type": "meta_error",
"meta": {
"error": {
"message": "(#131047) Re-engagement message",
"code": 131047,
"error_subcode": 2494010,
"fbtrace_id": "AbCdEfGhIjK"
}
}
}
}
O código 131047 é o sinal. Repetir a requisição não adianta — a correção é enviar um template.
Rastreando a janela no seu sistema
A API não expõe um endpoint de "esta janela está aberta?". Você controla isso a partir
dos webhooks: toda mensagem recebida chega com um timestamp Unix.
// Ao receber um webhook `messages` com uma mensagem do cliente:
const abertaAte = Number(mensagem.timestamp) * 1000 + 24 * 60 * 60 * 1000;
await db.conversas.upsert({ waId: mensagem.from, janelaAbertaAte: new Date(abertaAte) });
// Antes de enviar:
const conversa = await db.conversas.find({ waId: destinatario });
const podeTextoLivre = conversa && conversa.janelaAbertaAte > new Date();
Deixe uma margem de segurança de alguns minutos: o relógio que vale é o da Meta, não o seu.
Estratégia prática
Dentro da janela — use o que quiser: texto, mídia, botões, listas. É mais barato e não passa por aprovação.
Fora da janela — envie um template. Ele reabre a conversa; assim que o cliente responder, você volta ao conteúdo livre.
Na dúvida — envie o template. Uma mensagem que chega custa mais barato que um erro que não chega.
Templates que valem a pena manter aprovados
Ter uma pequena biblioteca aprovada evita ficar refém do prazo de aprovação:
| Situação | Categoria |
|---|---|
| Retomar um atendimento parado | UTILITY |
| Confirmar pedido, entrega ou agendamento | UTILITY |
| Enviar código de verificação | AUTHENTICATION |
| Divulgar promoção | MARKETING |
Detalhes de criação e regras de variáveis em Templates.
Custo
A Meta cobra por conversa iniciada, não por mensagem. Uma conversa aberta por template de
MARKETING custa mais que uma de UTILITY, e conversas iniciadas pelo cliente
(SERVICE) são as mais baratas — em muitos casos, gratuitas.
Isso muda o desenho da integração: um fluxo que leva o cliente a escrever primeiro sai mais barato que um que dispara templates de marketing.