Inicio / Referencia / Buenas prácticas

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íaVolumen máximoEstrategia
1-350-100/díaSólo a clientes que esperan tu mensaje (confirmaciones, OTPs).
4-7200-500/díaAumenta a clientes con opt-in claro.
8-141.000-2.000/díaPequeñas campañas segmentadas.
15-305.000-10.000/díaCampañas más amplias, siempre con opt-in.
30+Tier 1.000 / 10.000 / 100.000Meta 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:

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 wamid en tu base de datos para reconciliar estados.

Soporte

Si después de seguir estas prácticas sigues teniendo problemas, no dudes en contactarnos:

💬 WhatsApp

El número de soporte está disponible en tu panel de Wis.Chat.