Carlos Arreola
Admin
Sigma
Verificado
Verificación en dos pasos activada
Verificado por Binance
¡Excelente comerciante!
Usuário popular!
Hace unos días, en el tema WhatsApp automatización: ¿qué herramientas usan sin riesgo de baneo?, comenté que tenía un algoritmo propio que limita los envíos de mi app. @Brato se ofreció a aportarle, así que aquí va completo: cómo funciona, los umbrales exactos, el código del cálculo y, sobre todo, los errores que me costaron números para llegar a esto.
Aviso de entrada: esto es para la vía NO oficial (dispositivo vinculado). El riesgo nunca se elimina, solo se administra. Si vas a hacer campañas en frío a listas compradas, ningún algoritmo te salva: usa la Cloud API de Meta.
1. Contexto: con qué datos está hecho
- Stack: WAHA con el motor GOWS (basado en whatsmeow), en Docker. Cada número tiene su propio proxy de su país, horneado en la sesión: WhatsApp nunca ve la IP del servidor.
- Números: los números de atención de algunos negocios. No son números de spam: son la línea por la que cada negocio ya habla con sus clientes.
- Registro: cada mensaje que sale queda anotado uno por uno, con su tipo y su destinatario.
- El dato que más me sorprendió: la gran mayoría de lo que sale es transaccional (confirmaciones, recibos, avisos). Solo una parte pequeña es proactiva (campañas, cumpleaños, seguimiento). Esa parte pequeña es la que tumba números.
2. La tesis: WhatsApp no castiga el texto, castiga la falta de conversación
Después de varios números caídos, el patrón fue siempre el mismo: lo que pesa no es lo que dices, sino a quién le escribes y si te contesta.
- El baneo es por número, no por sesión ni por negocio. Lo que haga una línea no tumba a otra.
- Las señales malas: mensajes que inicias y nadie contesta, envíos a números que jamás te escribieron, y un número recién vinculado que de repente manda mucho.
- Las señales buenas: gente que te escribe primero, respuestas, antigüedad del número y entregas limpias.
Con esa idea armé un «motor de salud»: un puntaje de 0 a 100 por número, con semáforo, que responde una sola pregunta del dueño: «¿puedo lanzar campañas hoy?»
3. El motor: 7 componentes
Todo se mide de mis propias tablas (un libro de cada envío + los mensajes entrantes + las reacciones). No consulto nada a WhatsApp salvo el estado de la sesión. Así el cálculo tarda menos de 1 segundo por número y funciona aunque la sesión esté caída.
| Componente | Peso | Qué mide | Escala |
|---|---|---|---|
| Respuesta | 30 | De los mensajes proactivos de 30 días (con más de 48 h de vida), cuántos recibieron respuesta o reacción | Meta 30% = puntos completos, proporcional abajo |
| Bidireccional | 20 | De la gente con chat en 90 días, cuántos te han escrito alguna vez | Meta 70% = completo |
| Chats vivos | 10 | Personas distintas que te escribieron en 90 días | 200+ = 10 · 50+ = 6 · 10+ = 3 |
| Carga muda | 10 | Proactivos de 30 días que quedaron SIN respuesta (en número absoluto) | menos de 50 = 10 · 150 = 6 · 400 = 3 · más = 0 |
| Frío | 10 | Proactivos a gente sin conversación previa, y a números que jamás te escribieron | más de 5% a números nuevos = 0 |
| Madurez | 10 | Días que lleva vinculado el número | 60+ = 10 · 30+ = 7 · 14+ = 4 |
| Higiene | 10 | Fallos de entrega en 14 días (sin contar los de sesión caída) | menos de 2% = 10 · 5% = 7 · 10% = 4 |
Prorrateo: si un componente no se puede medir (por ejemplo, el número no mandó campañas este mes), no cuenta ni castiga. El puntaje es «puntos ganados entre puntos medibles».
Semáforo: verde 70 o más, ámbar de 40 a 69, rojo menos de 40.
Cortes duros (mandan sobre el puntaje, da igual cuánto saque):
- Sesión que no está conectada = rojo.
- Un error 463 hace menos de 7 días, o 3 o más en 30 días = rojo.
- Un 463 hace 7 a 21 días = máximo ámbar.
- Número re-vinculado hace menos de 14 días = máximo ámbar.
JavaScript:
// Núcleo del cálculo (simplificado). null = no medible → se prorratea.
const comps = {
respuesta: { max: 30, pts: puntosRespuesta(respondieron, medidos) },
bidireccional: { max: 20, pts: contrapartes >= 10 ? Math.round(20 * Math.min(1, (vivos / contrapartes) / 0.70)) : null },
chats_vivos: { max: 10, pts: vivos >= 200 ? 10 : vivos >= 50 ? 6 : vivos >= 10 ? 3 : 0 },
carga_muda: { max: 10, pts: mudos < 50 ? 10 : mudos < 150 ? 6 : mudos < 400 ? 3 : 0 },
frio: { max: 10, pts: puntosFrio(enviosFrio, nuevos, frios) },
madurez: { max: 10, pts: dias >= 60 ? 10 : dias >= 30 ? 7 : dias >= 14 ? 4 : 0 },
higiene: { max: 10, pts: envios14 >= 10 ? escalaFallos(fallos / envios14) : null },
};
let ganados = 0, medibles = 0;
for (const c of Object.values(comps)) if (c.pts !== null) { ganados += c.pts; medibles += c.max; }
const score = medibles ? Math.round(100 * ganados / medibles) : 0;
function puntosFrio(n, nuevos, frios) {
if (n < 10) return null; // muestra chica: no se califica
if (nuevos / n > 0.05) return 0; // >5% a números que nunca te escribieron
if (nuevos > 0) return 4;
const r = frios / n; // sin conversación previa, pero el número ya existía en tu chat
return r <= 0.10 ? 10 : r <= 0.30 ? 6 : 2;
}
4. El ajuste de hoy: la muestra chica mentía
Hace poco un número salió en ámbar (54) y el dueño se asustó. La causa: una sola campaña de 6 mensajes. De 5 medibles, ninguno había contestado todavía → respuesta 0 de 30. Y 5 de los 6 iban a números nuevos → frío 0 de 10. Dos componentes en cero por 6 mensajes.
Primero probé lo obvio, un mínimo duro de 10 envíos para calificar. Estaba mal: a otro negocio que iba 4 de 6 respuestas (excelente) le quitaba sus 30 puntos y lo bajaba de 77 a 67. Un mínimo duro borra la evidencia buena igual que la mala.
Lo que dejé es un suavizado bayesiano: le sumo 10 envíos «imaginarios» que responden justo a la meta (30%). Con pocos datos, la tasa se acerca a la meta; con muchos, manda el dato real.
JavaScript:
const META = 0.30, K = 10;
function puntosRespuesta(respondieron, medidos) {
if (medidos < 5) return null;
const tasa = (respondieron + META * K) / (medidos + K);
return Math.round(30 * Math.min(1, tasa / META));
}
// 0 de 5 → tasa 20% → 20 pts (antes 0)
// 4 de 6 → tasa 44% → 30 pts (se respeta)
// 8 de 53 → tasa 17% → 17 pts (casi igual que sin suavizar)
Resultado: ese número pasó de 54 a 82 (verde), varios subieron un par de puntos y ninguno bajó. Para frío sí dejé el mínimo de 10 envíos: 5 números nuevos de 6 no son un patrón de envío masivo.
5. El filtro antes de cada envío proactivo
El semáforo solo diagnostica. Lo que de verdad protege es un filtro que corre antes de cada mensaje proactivo. Lo transaccional (confirmaciones, recibos) nunca pasa por aquí: una confirmación que no sale es un fallo del producto, y además es el tráfico que construye la reputación del número.
Las reglas, en orden. «Bloquear» significa posponer, no descartar:
- Sesión caída → no sale nada.
- 463 reciente → no sale nada.
- Semáforo rojo → no sale nada.
- El destinatario ya te escribió alguna vez → pasa. A los conocidos WhatsApp los tolera.
- En frío desde un número con menos de 14 días vinculado, o en observación por 463 → pospuesto.
- En frío pero es cliente vivo (compró o vino en los últimos meses) → pasa. Alguien que fue cliente la semana pasada no es «frío» aunque nunca haya escrito.
- En frío y sin vida comercial (bases importadas viejas) → bloqueado. Si en un número que ya perdió el dispositivo antes, con más razón.
- Número que no existe en WhatsApp → descartado para siempre.
El bloqueo se «recalienta» solo: el día que esa persona visita o escribe, pasa sin tocar nada.
6. El ritmo: presupuesto por número, no por campaña
- Escalera de calentamiento por edad del NÚMERO (no del negocio): día 0 = 5 al día, día 3 = 10, día 7 = 20, día 30 = 30. Tope duro: 30 proactivos al día por número.
- Re-vincular reinicia la escalera. Excepción: si es el mismo número y estuvo caído pocas horas, conserva su madurez (una caída de 3 horas me había costado 10 días de bloqueo en un número).
- El cupo es del número: antes lo contaba por campaña, y dos campañas activas mandaban el doble por el mismo WhatsApp.
- Reserva para cumpleaños: las campañas dejan libre el cupo de los cumpleañeros del día. Un cumpleaños no se pospone a mañana; una campaña sí.
- Espaciado: campañas con espera aleatoria de 45 a 180 segundos y pausas largas cada 8 a 15 mensajes, solo en horario comercial. Para todo lo demás, un piso de 3 segundos más 2 aleatorios por número.
- Lo transaccional se registra pero nunca se bloquea. Si los recordatorios gastaran el cupo, un negocio con mucho movimiento jamás podría mandar una campaña.
7. Lo que aprendí (a la mala)
Ir lento no basta. Un número mandaba 1 mensaje por hora y le quitaron el dispositivo igual, 9 segundos después de un envío. El problema era la lista: contactos importados de hace años que jamás habían escrito, en un número casi sin tráfico entrante.
Un número recién re-vinculado es un número nuevo. Otro número re-escaneó el QR y mandó 18 mensajes en sus primeras 2 horas. Al día siguiente le quitaron el dispositivo un minuto después del último envío. Segundo baneo en un mes.
El error 463 es la mejor alarma que tienes. Es WhatsApp negándole al número iniciar conversación con quien no lo tiene. Llegó con la sesión en estado «conectada», así que es más fiable que el estado de la sesión. No se quita en horas: madura en días y con tráfico entrante. Reintentar solo suma señales de spam. Cuando aparece, yo bajo el número al escalón más lento de la escalera.
Verificar que un número existe también cuesta. Preguntarle a WhatsApp «¿existe este número?» sobre gente con la que nunca hablaste es enumeración. Lo hago solo en frío, con caché de 24 horas y con tope.
«Entregado» no siempre es entregado. La doble palomita que reporta la librería puede venir de tus propios dispositivos. Me pasó con una cuenta suspendida: la librería decía entregado y en el teléfono había una palomita. Para confirmar entrega, mira el teléfono, una lectura o una respuesta.
El texto pide acción o muere. Un goteo informativo sin pregunta casi no recibía respuestas. Las campañas de «ya te toca, ¿agendamos?» del mismo negocio sí respondían, varias veces más. Misma lista, distinto resultado.
Mensajes idénticos. Genero variaciones del texto con IA (mismo sentido, otras palabras) y roto una por destinatario. Con candados: si la variación inventa un número, una URL o cambia una variable, se descarta y sale el original. Es una capa barata, pero el volumen y la lista importan mucho más.
No culpes al proxy sin mirar tu red. Tuve un corte de 42 minutos que parecía caída del proveedor de proxies. Era el firewall del propio servidor. Todas las sesiones reconectaron solas, sin perder el vínculo ni mensajes entrantes. Para WhatsApp eso se ve como un teléfono sin señal un rato.
Dos caídas el mismo día no son el mismo incidente. Revisa hora, instancia y actividad de cada una antes de culpar al «problema del día».
8. Mis recomendaciones
- Registra cada envío con su tipo (proactivo o transaccional) y si el destinatario te había escrito antes. Sin ese libro no puedes medir nada.
- Separa lo transaccional de lo proactivo. Lo primero nunca se frena; lo segundo pasa por filtro y cupo.
- El cupo es por número y por edad del número.
- Un proxy por número, de su país, puesto al crear la sesión.
- Escríbele primero a quien ya te conoce. La lista fría es lo que tumba números, no la velocidad.
- Trata el 463 como alarma roja y deja descansar el número.
- Pide respuesta en cada campaña. Una pregunta simple vale más que un texto bonito.
- Con muestras chicas, no califiques en cero: suaviza hacia la meta.
9. Lo que todavía no sé
- Hoy, si alguien te escribió hace 15 meses, cuenta igual que si te escribió ayer. Sospecho que ese «pase» debería caducar (creo que el permiso de WhatsApp para escribirle a un contacto vence en semanas, no en años). Lo tengo en modo sombra: anoto a quién habría frenado, sin frenar a nadie, hasta tener datos.
- No existe una tabla pública con límites seguros de velocidad, de respuesta o de contactos nuevos. Mis umbrales salen de mis números y de lo que se reporta en blogs de proveedores. Son calibración, no verdad.
- El 30% de respuesta como meta y el 5% de números nuevos como corte me han funcionado, pero la muestra todavía es corta.
Si alguien maneja volumen con la vía no oficial y quiere comparar umbrales, o tiene un caso de baneo con datos (cuántos envíos, a quién, cuánto tiempo llevaba vinculado), compártanlo. @Brato, tú que lo haces con MailWizz, ¿cómo manejas el calentamiento por IP? Creo que la lógica es muy parecida.
Última edição:

