Actualizado el 29/10/2026
El error 131047 de la API de WhatsApp significa que pasaron más de 24 horas desde el último mensaje del cliente a tu número, así que la ventana de atención se cerró y ya no se aceptan mensajes libres (texto, multimedia, botones, listas). La solución oficial es enviar una plantilla aprobada; cuando el cliente responde, se abre otra ventana de 24 horas. Puedes evitar el error guardando la hora del último mensaje de cada contacto y eligiendo entre texto libre y plantilla antes de enviar.
La guía general de errores de la API de WhatsApp trae la tabla completa de códigos. Aquí el tema es solo el 131047: por qué ocurre, cómo prevenirlo en el código y cómo recuperar al cliente sin gastar de más.
Qué dice la documentación de Meta
En la tabla de códigos de error de Meta, el 131047 se describe así: pasaron más de 24 horas desde que el destinatario respondió por última vez al número remitente. La solución indicada es enviar una plantilla.
La regla de fondo está en la página de precios: cuando un usuario escribe o llama a la empresa, se abre una ventana de atención de 24 horas. Cada nuevo mensaje o llamada del usuario reinicia el contador. Los mensajes que no son plantilla solo se pueden enviar con la ventana abierta.
En la práctica, el error llega de forma asíncrona, en el webhook de estado, después de que la API ya devolvió un wamid:
{
"statuses": [
{
"id": "wamid.HBgMNTIxNTUxMjM0NTY3...",
"status": "failed",
"timestamp": "1761750000",
"recipient_id": "5215512345678",
"errors": [
{
"code": 131047,
"title": "More than 24 hours have passed since the recipient last replied to the sender number.",
"error_data": {
"details": "More than 24 hours have passed since the recipient last replied to the sender number."
}
}
]
}
]
}
Los textos de title y details pueden cambiar; decide siempre por el code. Por eso el 200 OK del envío no alcanza: si solo miras la respuesta síncrona, creerás que el mensaje salió. El artículo sobre mensajes no entregados muestra cómo seguir estos estados.
Cuándo suele aparecer el 131047
El error casi nunca es «culpa de WhatsApp». Aparece en flujos que se olvidan de la ventana:
- Un agente que responde al día siguiente. El cliente escribió el viernes a las 18 h y el agente responde el lunes a las 9 h con texto libre.
- Una automatización disparada por un evento del sistema. Pedido enviado, factura emitida, cita reprogramada: el sistema manda texto libre a un contacto que no habla con la empresa desde hace días.
- Un bot que retoma una conversación parada. Un «¿todavía necesitas ayuda?» enviado 30 horas después.
- Migración desde una API no oficial. Quien viene de bibliotecas como Baileys estaba acostumbrado a escribir a cualquiera en cualquier momento. En la API oficial, fuera de la ventana, solo plantillas.
Las plantillas nunca generan el 131047. Es exclusivo de los mensajes libres fuera de la ventana.
¿Quieres probar mientras lees? Crea tu cuenta en Vectalk y envía el primer mensaje por la API oficial. Crear cuenta gratis →
Qué abre (y reabre) la ventana de 24 horas
Según la documentación de precios, la ventana se abre cuando el usuario te envía un mensaje o llama a la empresa, y cada nuevo mensaje o llamada reinicia las 24 horas. Tus propios mensajes no abren nada: enviar una plantilla no reabre la ventana por sí solo. Quien la reabre es el cliente, al responder.
¿Y las respuestas a botones? La página de precios habla de un mensaje o una llamada del usuario y no detalla cada tipo de mensaje. Lo que sí muestra la referencia de webhooks es que el toque en un botón de respuesta rápida de una plantilla llega al webhook messages como un mensaje entrante del usuario, con type: "button" y su propio timestamp. Por eso el código de abajo guarda la hora de cualquier mensaje entrante, incluidos estos.
También existe la ventana de punto de entrada gratuito, ligada a los anuncios Click-to-WhatsApp: cuando el usuario llega por uno de esos anuncios (en la app de Android o iOS) y respondes dentro de la ventana de atención, se abre una ventana que puede durar hasta 7 días. Mientras está abierta, Meta no cobra mensajes de marketing, utilidad, autenticación ni servicio. Meta la describe como una regla de cobro; en tu código, sigue decidiendo entre texto libre y plantilla según la hora del último mensaje del cliente.
Las reglas completas están en la guía de la ventana de 24 horas de WhatsApp.
Cómo detectarlo antes de enviar
La forma más barata de manejar el 131047 es no provocarlo. Guarda el timestamp de cada mensaje recibido, por contacto, y consúltalo antes de cualquier envío. El ejemplo en Node.js usa un Map en memoria; en producción, usa una base de datos o Redis.
const API_URL = 'https://apis.vectalk.com.br/api/messages';
const TOKEN = process.env.VECTALK_TOKEN;
const VENTANA_MS = 24 * 60 * 60 * 1000;
const MARGEN_MS = 10 * 60 * 1000; // holgura para colas y relojes
const ultimoEntrante = new Map(); // wa_id -> timestamp en ms
// En el webhook: guarda la hora del último mensaje del cliente
function onWebhook(body) {
for (const entry of body.entry || []) {
for (const change of entry.changes || []) {
for (const msg of change.value?.messages || []) {
ultimoEntrante.set(msg.from, Number(msg.timestamp) * 1000);
}
}
}
}
function ventanaAbierta(waId) {
const t = ultimoEntrante.get(waId);
return t !== undefined && Date.now() - t < VENTANA_MS - MARGEN_MS;
}
async function enviar(payload) {
const res = await fetch(API_URL, {
method: 'POST',
headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ messaging_product: 'whatsapp', ...payload })
});
return res.json();
}
// Elige texto libre o plantilla según la ventana
async function responder(waId, texto, nombreCliente) {
if (ventanaAbierta(waId)) {
return enviar({ to: waId, type: 'text', text: { body: texto } });
}
return enviar({
to: waId,
type: 'template',
template: {
name: 'retomar_atencion',
language: { code: 'es_MX' },
components: [
{ type: 'body', parameters: [{ type: 'text', text: nombreCliente }] }
]
}
});
}
Tres cuidados con este patrón:
- Usa el
timestampdel mensaje, no la hora en que llegó el webhook. Meta reintenta la entrega de webhooks, así que un evento puede llegar con retraso. - Deja un margen. Un mensaje armado en el minuto 1.439 de la ventana puede salir vencido si queda en cola.
- Maneja el error de todos modos. Si el 131047 llega al webhook, marca el mensaje y pasa a la plantilla en lugar de repetir el texto libre.
Si hay agentes humanos, muestra en su pantalla cuánto tiempo le queda a la ventana. Solo eso evita la respuesta del lunes que nunca llega.
Cómo retomar la conversación con una plantilla
La plantilla correcta depende del motivo del contacto. La categoría define el precio y la aprobación, y Meta decide la categoría final; consulta cómo clasifica Meta las plantillas.
| Situación | Categoría probable | Texto de ejemplo |
|---|---|---|
| Respuesta a una solicitud que abrió el cliente | Utilidad | «Hola, {{1}}. Tenemos la respuesta a tu solicitud {{2}}. Toca Ver respuesta para continuar.» |
| Actualización de pedido, entrega o cita | Utilidad | «Tu pedido {{1}} salió a reparto. Toca Hablar con la tienda si necesitas algo.» |
| Oferta, cupón o invitación a volver a comprar | Marketing | «{{1}}, tenemos una condición especial para ti. ¿Quieres verla?» |
Dos consejos para que el cliente vuelva:
- Agrega un botón de respuesta rápida. Tocar es más fácil que escribir, y el toque llega a tu webhook como mensaje del cliente. A partir de ahí, el agente o el bot vuelve a decidir según la hora del último mensaje recibido, como en el código de arriba.
- Explica por qué escribes. «Tenemos la respuesta a tu solicitud» funciona mejor que «Hola, ¿cómo estás?» y es más fácil de aprobar como utilidad.
El JSON completo para enviar plantillas, con variables, multimedia y botones, está en cómo enviar una plantilla por la API.
Cuánto cuesta retomar el contacto
Un mensaje que falla con 131047 no se cobra: Meta solo cobra los mensajes entregados. El costo es la plantilla que envías para resolverlo. Las tarifas de Meta para números de Brasil desde el 1 de octubre de 2026, en reales (BRL), son:
| Categoría | Precio por mensaje entregado (Brasil) |
|---|---|
| Marketing | R$ 0,3217 |
| Utilidad | R$ 0,0350 |
| Autenticación | R$ 0,0350 |
| Servicio | R$ 0,0350, después de 1.000 gratis por número al mes |
Desde el 1 de octubre de 2026, las plantillas de utilidad enviadas dentro de la ventana de atención también se cobran, y los mensajes de servicio (texto libre dentro de la ventana) tienen una franquicia de 1.000 por número al mes. Lo explicamos en mensajes de utilidad en la ventana de atención.
La conclusión práctica: retomar con utilidad cuesta una fracción del marketing. Si el motivo es la solicitud del propio cliente, una plantilla de utilidad bien escrita resuelve el 131047 al menor precio. Las tarifas cambian según el país de destino, como México, Colombia o Argentina; consulta el precio de la API de WhatsApp por país.
Cómo hacerlo con Vectalk
Vectalk es un proxy de la Cloud API oficial, así que el 131047 llega a tu webhook con el mismo código y formato de Meta, y el ejemplo anterior funciona sin cambios: el envío va a POST https://apis.vectalk.com.br/api/messages con el mismo cuerpo JSON de la API de Meta. Las plantillas se crean en el panel, que incluye una Biblioteca de Modelos, o con la API de plantillas. Para revisar fallas, filtra el historial con GET /api/messages?status=failed en el endpoint Listar Mensajes.
Cada mensaje entregado se descuenta de tu saldo prepago y Vectalk paga a Meta con su propia línea de crédito, sin que registres una tarjeta en Meta. Crea tu cuenta en apps.vectalk.com.br/register o consulta el panorama en la guía de la API oficial de WhatsApp.
Preguntas frecuentes
¿Qué significa el error 131047 en WhatsApp?
Que pasaron más de 24 horas desde el último mensaje del cliente a tu número. La ventana de atención se cerró y solo se pueden enviar plantillas aprobadas hasta que el cliente vuelva a responder.
¿Enviar una plantilla reabre la ventana de 24 horas?
No por sí sola. La ventana se abre cuando el cliente escribe o llama. La plantilla sirve para provocar esa respuesta; cuando llega, tienes otras 24 horas para mensajes libres.
¿Se cobra un mensaje que falló con 131047?
No. Meta solo cobra mensajes entregados, y un mensaje con 131047 no se entregó. Solo pagas la plantilla que envíes después, si se entrega.
¿Qué plantilla uso para retomar la conversación?
Si el contacto es sobre algo que pidió el cliente (respuesta de soporte, pedido, cita), una plantilla de utilidad, que cuesta R$ 0,0350 por mensaje entregado a Brasil. Si es una oferta o invitación a comprar, es marketing, a R$ 0,3217.
¿Puedo ampliar la ventana a más de 24 horas?
No. La ventana de atención dura 24 horas desde el último mensaje o llamada del cliente. La ventana de punto de entrada gratuito de hasta 7 días, de los anuncios Click-to-WhatsApp, aparece en la página de precios de Meta como regla de cobro.
Fuentes oficiales consultadas el 29/10/2026: Códigos de error de la WhatsApp Cloud API, Precios de la plataforma de WhatsApp Business, Referencia del webhook de estado, Referencia del webhook de botón, Webhooks en la documentación de Meta, Listar Mensajes en la documentación de Vectalk, Crear plantilla en la documentación de Vectalk.
Prueba hoy la API oficial de WhatsApp
Crea tu cuenta, genera el token y envía el primer mensaje con la guía de la documentación. Los mismos payloads y webhooks de la Cloud API de Meta.
