La ventana de 24 horas
Es la regla que más confunde a quien llega al WhatsApp oficial, y la causa más habitual de
422 meta_error en producción.
Solo puedes enviar mensajes de contenido libre dentro de las 24 horas posteriores al último mensaje del cliente. Fuera de esa ventana, WhatsApp acepta únicamente plantillas aprobadas previamente.
Cómo se abre y se cierra la ventana
Solo el mensaje del cliente abre la ventana. Tus propios mensajes no amplían el plazo — enviar diez seguidos no compra más tiempo.
El error cuando la ventana está cerrada
{
"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"
}
}
}
}
El código 131047 es la señal. Repetir la petición no sirve — la corrección es enviar una plantilla.
Rastrear la ventana en tu sistema
La API no expone un endpoint de «¿esta ventana está abierta?». Tú lo controlas a partir de
los webhooks: cada mensaje recibido llega con un timestamp Unix.
// Al recibir un webhook `messages` con un mensaje del cliente:
const abiertaHasta = Number(mensaje.timestamp) * 1000 + 24 * 60 * 60 * 1000;
await db.conversaciones.upsert({ waId: mensaje.from, ventanaAbiertaHasta: new Date(abiertaHasta) });
// Antes de enviar:
const conversacion = await db.conversaciones.find({ waId: destinatario });
const puedeTextoLibre = conversacion && conversacion.ventanaAbiertaHasta > new Date();
Deja un margen de seguridad de unos minutos: el reloj que cuenta es el de Meta, no el tuyo.
Estrategia práctica
Dentro de la ventana — usa lo que quieras: texto, medios, botones, listas. Es más barato y no pasa por aprobación.
Fuera de la ventana — envía una plantilla. Reabre la conversación; en cuanto el cliente responda, vuelves al contenido libre.
En la duda — envía la plantilla. Un mensaje que llega cuesta menos que un error que no llega.
Plantillas que conviene tener aprobadas
Una pequeña biblioteca aprobada evita quedar a merced del plazo de aprobación:
| Situación | Categoría |
|---|---|
| Retomar una conversación parada | UTILITY |
| Confirmar pedido, entrega o cita | UTILITY |
| Enviar código de verificación | AUTHENTICATION |
| Anunciar una promoción | MARKETING |
Los detalles de creación y las reglas de variables están en Plantillas.
Coste
Meta cobra por conversación, no por mensaje. Una conversación abierta con una plantilla de
MARKETING cuesta más que una de UTILITY, y las conversaciones iniciadas por el cliente
(SERVICE) son las más baratas — en muchos casos, gratuitas.
Eso cambia el diseño de la integración: un flujo que lleva al cliente a escribir primero sale más barato que uno que dispara plantillas de marketing.