Buenas prácticas
Guía consolidada para integrar Wis.Chat en producción de forma robusta. Incluye recomendaciones sobre calentamiento, idempotencia, manejo de errores, retries y todo lo que necesitas para que tu integración sea estable a largo plazo.
Las tres reglas de oro
Las que el manual oficial enfatiza por encima de todo:
Calentamiento gradual
Nunca arranques con grandes volúmenes desde un número nuevo. Comienza con 50/día y sube gradualmente. Saltarte este paso = LOW reputation casi inmediato.
Plantillas aprobadas
Para cualquier mensaje proactivo, usa plantillas con estado APPROVED. Texto libre es sólo para responder dentro de la ventana de 24h.
Controla tu reputación
Monitorea el panel diariamente. Si el nivel cae a MEDIUM, pausa campañas no críticas hasta volver a HIGH.
Calentamiento de número (warming)
Cuando habilitas un número nuevo en WhatsApp Business, tu límite inicial es bajo (~250 conversaciones únicas iniciadas en 24h). Subir este límite requiere un patrón gradual, consistente y de buena calidad.
Plan de calentamiento sugerido
| Día | Volumen máximo | Estrategia |
|---|---|---|
| 1-3 | 50-100/día | Sólo a clientes que esperan tu mensaje (confirmaciones, OTPs). |
| 4-7 | 200-500/día | Aumenta a clientes con opt-in claro. |
| 8-14 | 1.000-2.000/día | Pequeñas campañas segmentadas. |
| 15-30 | 5.000-10.000/día | Campañas más amplias, siempre con opt-in. |
| 30+ | Tier 1.000 / 10.000 / 100.000 | Meta sube tu tier automáticamente con buena calidad. |
Si el nivel baja a MEDIUM o LOW durante el calentamiento: pausa envíos por 48 horas y reanuda con la mitad del volumen al que llegaste antes de la caída.
Idempotencia
Si tu sistema se cae mientras está enviando, podrías reintentar el mismo mensaje y enviarlo
dos veces al mismo cliente. Para evitarlo, lleva en tu propia base de datos un
registro de envíos con un id_local único de tu lado, y guarda el wamid
que devuelve la API. Antes de cada envío, verifica si ese id_local ya tiene un
wamid asignado:
// Pseudocódigo — la tabla "mis_envios_wsp" es TUYA, en tu propia base de datos. // id_local: identificador único de tu negocio (ej: id de factura, ticket, OTP, etc.) function enviarIdempotente($idLocal, $payload) { // 1. ¿Ya tengo un wamid para este id_local? $existing = $db->query( "SELECT wamid FROM mis_envios_wsp WHERE id_local = ?", [$idLocal] ); if ($existing && $existing['wamid']) { return $existing['wamid']; // ya enviado, no duplico } // 2. Reservo el id_local con estado 'pending' antes de la llamada HTTP $db->upsert('mis_envios_wsp', [ 'id_local' => $idLocal, 'estado' => 'pending', ]); // 3. Llamo a la API de Wis.Chat con retry $wamid = enviarConReintento(...); // 4. Persisto el wamid retornado en MI tabla $db->update('mis_envios_wsp', ['wamid' => $wamid, 'estado' => 'sent'], ['id_local' => $idLocal] ); return $wamid; }
Los estados llegan vía webhook. Una vez tengas el wamid
guardado, los cambios de estado (sent → delivered → read o failed)
llegarán automáticamente a tu webhook. Tu sistema solo tiene que actualizar la fila correspondiente
al recibir esos eventos. Más detalles en Webhooks.
Rate limiting y throttling
Aunque Wis.Chat es eficiente, Meta impone límites. Si vas a enviar muchos mensajes, no los dispares todos a la vez. Implementa una cola con throttling:
📤 Para campañas masivas
Procesa la cola con un worker que dispara 1 mensaje cada 100-200ms (5-10 por segundo). Reduce picos y baja la chance de hit del rate limit.
🚦 Si recibes HTTP 429
Frena inmediatamente. Espera según el header Retry-After si está. Si no, aplica backoff exponencial: 2s → 4s → 8s → 16s.
Ventana de 24 horas
Una de las reglas más importantes de WhatsApp Business: sólo puedes enviar texto libre, multimedia o interactivos dentro de las 24 horas posteriores al último mensaje del cliente. Fuera de esa ventana, sólo plantillas aprobadas.
¿Cómo trackear la ventana? Cuando recibas un mensaje del cliente en tu webhook,
guarda el timestamp. Antes de cada envío de tipo text / image / etc.,
verifica si pasó más de 24h. Si sí, cambia automáticamente a una plantilla aprobada.
Webhooks robustos
Los webhooks son cómo recibes estados de mensaje y respuestas de los clientes. Algunas reglas:
- Responde rápido (200 OK en menos de 5s). Procesa pesado de forma asincrónica con una cola.
- Acepta idempotencia. Meta puede reenviar el mismo evento si no respondiste a tiempo. Usa
iddel evento para deduplicar. - Valida el origen. El gateway firma los payloads de webhook con el secret de tu línea — verifica la firma.
- Loguéa todo. Si algo no cuadra, los logs son tu única fuente de verdad.
Seguridad
🔐 Tokens en backend
Nunca pongas el código de seguridad en el frontend (web, mobile app). Llama siempre desde el servidor.
🔄 Rotación periódica
Regenera tu token cada 6 meses, o inmediatamente si sospechas que se filtró.
📝 Logging cuidadoso
Si logueas requests, asegurate de enmascarar el header Authorization. Nunca lo dejes en logs en claro.
🔒 HTTPS only
El gateway sólo acepta conexiones HTTPS. Asegurate de que tu cliente HTTP tampoco siga redirects a HTTP.
Lo que NO hacer
Mensajes vacíos o de prueba. "Hola, ¿estás ahí?" o "test 1, test 2" enviados a clientes reales son una de las principales causas de caída de reputación.
Bases de datos compradas. Mandar a personas que no te dieron opt-in es violación de los términos de Meta y de leyes de protección de datos en muchos países. Tu número se suspende rápido.
Reintentar errores fatales. Si recibes unauthorized,
template_not_approved o low_quality, no reintentes. Soluciona la causa primero.
Usar texto libre fuera de la ventana 24h. Vas a recibir
outside_24h_window. Para reabrir conversación, usa una plantilla.
Checklist de producción
Antes de poner una integración en producción, verifica:
- ☐ Token de seguridad en variable de entorno, no en código.
- ☐ Manejo de errores con distinción fatal/transitorio.
- ☐ Retry con backoff exponencial.
- ☐ Cola asincrónica para campañas masivas.
- ☐ Idempotencia con
id_local. - ☐ Webhook responde 200 OK en menos de 5s.
- ☐ Logs con token enmascarado.
- ☐ Monitoreo de reputación con alerta automática si baja a MEDIUM.
- ☐ Plan de calentamiento documentado para nuevos números.
- ☐ Validación de ventana 24h antes de cada envío de texto libre.
- ☐ Track de
wamiden tu base de datos para reconciliar estados.
Soporte
Si después de seguir estas prácticas sigues teniendo problemas, no dudes en contactarnos:
El número de soporte está disponible en tu panel de Wis.Chat.