Las líneas les envían mensajes sin esperar respuesta.
sin cargar
📱 Se envía SOLO desde tu línea conectada (en paralelo a las comerciales). En Negocios el filtro de propietario queda fijo a tus contactos. "Sin negocios" no está disponible para tu línea por ahora.
1
Filtros de negocios
Los datos del CRM quedan guardados en el servidor (no en tu equipo).
La sincronización con Wiselink se maneja desde
.
—
Buscando negocios...
2
Contactos
(0)
|
Cargando más contactos...
3
Escribí el mensaje
Variables:{nombre}
Opcional — si no generás, se usa el mensaje tal cual
¿Cómo funcionan las variaciones?
📝 Texto: al tocar “Generar variaciones”, la IA crea 8 reescrituras reales del mensaje con el modelo más potente (opus 4.8): dicen lo mismo con otras palabras y estructura (no es cambiar un emoji o una palabra) y conservan los placeholders como {nombre}. Podés revisarlas/editarlas. Al enviar se elige una al azar por contacto → cada persona recibe un texto distinto (antiban). Si la IA no estuviera disponible, usa un respaldo simple.
🖼️ Imagen: si la campaña tiene imagen adjunta, no hace falta generar nada: en cada envío la imagen se recomprime a uno de 8 pesos distintos (calidad apenas diferente), sin pérdida visible. Cada contacto recibe un archivo con tamaño y hash distintos (antiban), igual que el texto. Es automático (no se muestran las 8).
Revisá y editá las variaciones. Se enviará una al azar por contacto:
✓ Variaciones confirmadas
Configurá el horario, los intervalos y el tope diario. Podrás activar la campaña desde la sección Campañas.
Ventanaa
a
Tope diario / sesión
El ritmo entre mensajes, los lotes/pausas y el tope global del día se configuran en
Configuración → Parámetros del motor (solo superadmin).
👤 Contactos sin negocios
Los datos del CRM quedan guardados en el servidor.
La sincronización se maneja desde
.
📊 Importar contactos desde Excel o CSV
📂
Arrastrá tu archivo acá
o hacé clic para seleccionar · .xlsx .xls .csv
¿No tenés el archivo? Generá uno con toda la base (con y sin negocio) restando los ya contactados en las campañas Showroom 20-05 y 10 reales (y sin WhatsApp / propios).
Paso 2 — Mapear columnas
Indicá qué columna contiene el teléfono y el nombre.
Paso 3 — Revisar y cargar
1
Ingresar números de teléfono manualmente
Escribí un número por línea. Podés incluir un nombre separado por coma. 5491112345678 o
5491112345678, Juan García
Sin el signo +. Solo dígitos con código de país.
Campaña activa
-0 / 0
Despachados: 0 | Fallidos: 0
Log en vivo:
—
Export:
Esperando eventos de la campaña…
📚 Glosario de estados
Envío completado
Campaña pausada
Campañas
No hay campañas.
Editar campaña
⚠ La campaña está activa — los cambios se guardan y aplican cuando se pause y reanude.
¿Cómo funcionan las variaciones?
📝 Texto: al tocar “⚡ Generar”, la IA crea 8 reescrituras reales del mensaje con el modelo más potente (opus 4.8): dicen lo mismo con otras palabras y estructura (no es cambiar un emoji o una palabra) y conservan los placeholders como {nombre}. Podés revisarlas/editarlas. Al enviar se elige una al azar por contacto → cada persona recibe un texto distinto (antiban). Si la IA no estuviera disponible, usa un respaldo simple.
🖼️ Imagen: si la campaña tiene imagen adjunta, no hace falta generar nada: en cada envío la imagen se recomprime a uno de 8 pesos distintos (calidad apenas diferente), sin pérdida visible. Cada contacto recibe un archivo con tamaño y hash distintos (antiban), igual que el texto. Es automático (no se muestran las 8).
Sin variaciones. La campaña va a usar el mensaje base para todos los envíos.
Clic en la imagen para ampliar
⚠️ La imagen se quitará al guardar.
Ventanaa
Tope diario / sesión
a
El ritmo entre mensajes, los lotes/pausas y el tope global del día se configuran en Configuración → Parámetros del motor (solo superadmin).
Propietarios de cuenta visibles
Solo los tildados aparecerán en el selector. Se guarda localmente.
Propietarios de negocio visibles
Solo los tildados aparecerán en el selector. Se guarda localmente.
Agregar contacto
➕ Crear contacto en Wiselink
Antes de crearlo se verifica en Wiselink si ya existe (por teléfono, email y dominio).
⚙ Recursos del sistema (PIDs, memoria y disco por proceso)
Cada Chromium consume ~50 PIDs. Si current/max supera el 80%, los nuevos reinicios pueden fallar silenciosamente (Cannot fork) y la línea queda colgada. Watchdog hace circuit breaker después de 5 fallos consecutivos por línea. El color de cada tarjeta refleja el recurso más exigido —PIDs, RAM o disco (volumen del contenedor): si el disco se llena, no se pueden guardar mensajes y las sesiones pueden corromperse.
🛰 Versiones de protocolo
Anunciada / instalada = lo que corre hoy en nuestros workers. La que usa WhatsApp = la versión de protocolo vigente (solo aplica a Baileys; whatsapp-web.js maneja la página real de WhatsApp Web, así que no tiene un número comparable y muestra “—”). Última publicada = el latest de npm. 🔴 = WhatsApp rechazó conexiones con 405 en la última hora (versión deprecada: las líneas no conectan). 🟡 = hay release más nueva que la instalada, o lo que anunciamos difiere de lo que usa WhatsApp hace más de 7 días. Se chequea solo cada 6 h y al entrar acá.
Cargando…
📚 Criterios del semáforo y glosario de estados
Glosario de estados (códigos de WhatsApp)
Log técnico
🔌 Eventos técnicos (caídas / reinicios)
🚩 Historial de shadow bans
Administración de usuarios
Creá, editá y gestioná los accesos a la plataforma
Nombre
Usuario
Rol
Estado
Acciones
Cambiar mi contraseña
❓
Pregunta técnica
Respondo solo con lo que figura en los manuales técnicos cargados. Si no está, te lo aviso y no invento. Cito la lámina.
Configuración
🔗 URL de la aplicacióndesplegar ▾
Compartí este enlace para que accedan a Wiselink Chat:
Token del integrador Hetmo informática en Wiselink. Hace falta porque las
líneas de catálogo (Aberturas de PVC, Deck, Puertas de WPC, Tubulares…) están habilitadas
para ESE integrador y no para el nuestro: con el token propio, Wiselink devuelve cero líneas.
Sin líneas no se puede crear una opción (presupuesto) en un negocio, porque la API pide
el lineToken. El token se guarda en el servidor y nunca se vuelve a mostrar en claro.
🔒Token configurado
Token
—
En Wiselink, entrá a la ficha del integrador Hetmo informática.
Ahí figuran las líneas de productos y servicios asignadas y, más abajo, la Clave privada.
Tocá Copiar, pegala acá, Guardar y después Probar conexión: te va a decir cuántas líneas ve.
En Permissions elegí Restricted y marcá solamente
Usage API Scope = Read (mínimo permiso necesario).
Click en Create admin key.
Copiá el token (empieza con sk-admin-, solo se muestra una vez).
Pegalo acá abajo y dale Guardar.
La Admin Key es distinta de la API Key común. Sirve solo para consultar el gasto.
🔒Admin Key configurada
La Admin Key es distinta de la API Key. Se crea en
platform.openai.com → Settings → Admin keys
con permisos restringidos (solo Usage API Scope = Read). Si la dejás vacía, el monitoreo de gasto no aparece.
En Workspace dejá No workspace — si seleccionás algo lo restringís y deja de funcionar.
Click en Create.
Copiá el token (solo se muestra una vez).
Pegalo acá abajo y dale Guardar.
🔒Token configurado
Se crea en railway.com → Account Settings → Tokens.
La API pública de Railway no expone el saldo, así que solo verificamos el token y mostramos tu workspace.
El saldo y uso lo ves desde el dashboard.
Click en Generate new token → Generate new token (classic).
Si te pide la contraseña de GitHub, ingresala.
En Note escribí Wiselink Chat.
En Expiration elegí 90 days o No expiration.
En Select scopes marcá:
repo (todo el bloque)
read:user
Scrolleá al final y click en Generate token.
Copiá el token (empieza con ghp_, solo se muestra una vez).
Pegalo acá abajo y dale Guardar.
🔒Token configurado
Se crea en github.com → Settings → Developer settings → Personal access tokens (classic).
El monitoreo de gasto requiere que la cuenta esté migrada a enhanced billing; si no, vas a ver un aviso
pero el token sigue siendo válido para otras operaciones.
De acá salen los leads de la pestaña 📣 Meta. La fuente es la planilla de Google que la integración nativa de Meta llena sola — no la API de Meta, que exigiría App Review y verificación de negocio.
Dos modos de lectura: con link público (simple, pero cualquiera con la URL ve los datos de los leads) o con cuenta de servicio (la planilla queda restringida y solo la lee este servidor). Se recomienda el segundo.
El ID de la planilla es la parte de la URL entre /d/ y /edit. El gid es el número que aparece al final de la URL cuando estás parado en esa hoja.
Cada planilla nueva hay que compartirla con el correo de la cuenta de servicio, igual que la primera.
Se guarda solo client_email y private_key, en el servidor. La clave nunca se vuelve a mostrar.
Voyage AI (Embeddings)
ⓘ Qué es
API key de Voyage AI (embeddings) para el RAG de "Conocimiento de producto": convierte los manuales y cada pregunta en vectores para traer solo los fragmentos relevantes. La key se guarda en el servidor y nunca se vuelve a mostrar en claro.
🔒API key configurada
API Key
—
Modelo
—
Entrá a dashboard.voyageai.com → API Keys.
Creá una key (empieza con pa-) y copiala (se muestra una sola vez).
Pegala acá, Guardar y después Probar conexión.
Correo (Gmail / Google Workspace)
📬 Resumen diario de la bandeja
Cada comercial recibe a las 8:00 un correo con las oportunidades del día anterior, enviado
desde su propia casilla. Si un día no sale, los eventos no se pierden: quedan guardados y este
botón los manda. Aparece un aviso ámbar arriba mientras haya algo pendiente.
ⓘ Qué es
Permite que el programa envíe correos en nombre de cada usuario: el mail sale de la casilla del vendedor y queda en sus Enviados, sin pedirle contraseña ni permiso a cada uno. Funciona con una cuenta de servicio de Google que el administrador del Workspace autoriza una sola vez con delegación en todo el dominio (ámbito gmail.send: solo enviar, nunca leer casillas). Puede ser la misma cuenta que lee la planilla de Meta Leads. Quién y cuándo envía se define en cada etapa del kanban; acá solo se conecta y se prueba.
🔒Cuenta de servicio configurada
Estado
—
Cuenta de servicio
—
Client ID a autorizar
—
Origen
—
Ámbito
—
Última prueba
—
La prueba se envía desde y hacia ese correo (tiene que ser el de un usuario de Wiselink Chat). Si llega, la delegación funciona para todo el dominio.
En console.cloud.google.com, en el proyecto de la cuenta de servicio: APIs y servicios → Biblioteca → Gmail API → Habilitar.
En IAM y administración → Cuentas de servicio, abrí la cuenta y copiá su ID único (número largo). Si pegás el JSON completo acá, se muestra solo como "Client ID a autorizar".
Como administrador, en admin.google.com → Seguridad → Acceso y control de datos → Controles de API → Delegación en todo el dominio → Agregar: pegá el ID de cliente y el ámbito https://www.googleapis.com/auth/gmail.send → Autorizar (puede tardar unos minutos en aplicarse).
Volvé acá, Guardar y Enviar correo de prueba. Cada usuario tiene que tener su correo del dominio cargado en Usuarios → Editar → Email.
Se guardan solo client_email, client_id y private_key, en el servidor. La clave nunca se vuelve a mostrar.
Pipefy (Cuenta de servicio)
ⓘ Qué es
Conexión saliente Wiselink → Pipefy (crear/mover/comentar tarjetas, leer datos) vía la API GraphQL de Pipefy. Usa cuenta de servicio (Client ID + Client Secret, OAuth client_credentials), no token personal. El secret se guarda en el servidor y nunca se vuelve a mostrar en claro.
Es lo inverso de 🔌 API / Canales (que es Pipefy → Wiselink para enviar WhatsApp).
🔒Cuenta de servicio configurada
Client ID
—
Client Secret
—
Organization ID
—
Token endpoint
—
En Pipefy, andá a Settings → Service Accounts (o pedíselo al admin de la organización).
Creá una cuenta de servicio y copiá el Client ID y el Client Secret (el secret se muestra una sola vez).
El Organization ID está en la URL de tu organización (app.pipefy.com/organizations/NÚMERO).
Pegá los tres acá, Guardar y después Probar conexión.
⚙️ Opciones avanzadas (opcional)
🪝 Webhooks de Pipefy
CRUD vía GraphQL (pipefyFetch)
Pipefy avisa a una URL cuando pasa algo en un pipe/tabla (card.create, card.move, etc.). Requiere la conexión configurada arriba.
Crear webhook
Al editar, el nombre no se puede cambiar (Pipefy no lo permite en updateWebhook); si lo necesitás, eliminá y volvé a crear.
Para lo que la librería no expone como método. Endpoint api.pipefy.com/graphql · POST. Ej.: { me { id name } }
Solo superadmin · corre con tus credenciales
📡 Webhooks entrantes (monitor en vivo)
se actualiza solo
Acá caen los eventos que Pipefy envía a tu URL receptora. Pegá esta URL en el campo URL destino del webhook (o usá el botón).
🔗 URL receptora (pegar en Pipefy)
cargando…
El token va en la URL (protege el endpoint). Si rotás, hay que actualizar la URL en los webhooks ya creados en Pipefy.
Sin eventos todavía.
🔑 Token de servicio
ⓘ Qué es
Acceso programático (automatización/validación) sin contraseña: abrir la URL de acceso inicia sesión como superadmin. Pensado para que un agente recorra la app sin manejar tu contraseña. Podés rotarlo (invalida el anterior) o desactivarlo cuando quieras.
Cargando…
🔗 Link del listado de escrituras en firme
ⓘ Qué es
El link fijo que viaja en todos los avisos de escritura en firme, de los tres programas (Wiselink Chat, HMI y Middleware). Abre un listado de solo lectura, sin pedir ingreso: quién tenga el link ve el listado. Por eso el listado no muestra teléfonos, ni datos de clientes, ni importes — sólo hora, programa, destino, pedido, sesión y referencia.
Rotarlo deja muerto el link que tengas guardado en el teléfono; el próximo aviso trae el nuevo.
Cargando…
⏱ Tiempos de notificaciones internas
min sin nuevos mensajes antes de clasificar y notificar
Aplica también al chip de clasificación en la bandeja general. Default: 6 min.
horas (0 = sin cooldown)
Tras responderle a un lead, no se le vuelve a responder automáticamente hasta pasado este tiempo. La notificación interna sí se envía cada vez. Default: 24 h.
🚀 Parámetros del motor de envío
Aplican a TODAS las campañas (comerciales y de usuario). La ventana horaria y el tope por línea siguen configurándose en cada campaña.
⏱ Ritmo entre mensajes (por línea)
asegundos entre cada mensaje
🐢 Lotes (pausa larga periódica)
cadaamensajes, pausar
asegundos
🚩 Techo global diario (todas las campañas)
mensajes/día sumando TODAS las líneas y campañas (vacío = sin tope)
🔥 Calentamiento (solo comerciales)
días, con topemsg/día durante el calentamiento
🛡 Shadow-ban (pausa automática)
rechazos seguidos → pausar la líneaminutos
🌡️ Rampa de calentamiento por número
Tope diario por número de teléfono (chips desechables), NO por slot. Persiste ante reconexión / re-escaneo de QR / swap entre slots. Combina con el tope de campaña (se aplica el menor). ⚠️ Activá SOLO después de sembrar las líneas establecidas — si no, caen a 5/día. Una línea sin registro arranca en 5/día (día 1).
—
🎯 Asignación de leads de Meta
Qué hace con cada lead nuevo
Está en Wiselink y su propietario es usuario del Chat → va a ese propietario, sin usar turno.
Está en Wiselink con un propietario que no es usuario del Chat → al próximo de la rueda (Wiselink no se toca).
No está en Wiselink → el lead va al próximo de la rueda. El contacto se crea en Wiselink cuando la tarjeta entra a una etapa con 🔗 «Exigir contacto en Wiselink al entrar», con ese comercial como propietario. Si no se puede, la tarjeta va al «Resolver desde Wiselink» de su tablero y vuelve sola a esa etapa cuando se resuelve; la actividad del lead dice por qué.
Existe sin propietario, es dudoso, o Wiselink encuentra contactos parecidos → a la etapa «Resolver desde Wiselink», sin comercial. Esto se comprueba al llegar el lead.
Sólo leads que Meta creó hace menos de 72 h y que llegaron con alguien en la rueda. Nunca pisa un comercial ni una etapa que haya puesto una persona. Se prende y se apaga tildando «Participa en asignación de leads de Meta» en Usuarios → Editar.
Cargando…
🎯 Asignación de notificaciones — diagnóstico
Pool de rotación
Usuarios activos con datos completos y rotación habilitada. Próximo asignado para leads sin owner directo.
Cargando…
Probar resolución de asignación
Ingresá un teléfono y simulá quién recibiría la notificación. Es dry-run: no consume turno de rotación.
Disparar notificación real (test end-to-end)
Ejecuta el flujo completo: resuelve asignado, genera resumen IA, envía desde Línea interna y responde al lead. El teléfono debe tener mensajes reales en la bandeja general (para que la IA tenga contenido que resumir). Sí consume turno de rotación y envía mensajes reales.
🧠 Resumen Mensajes Internos
Cuando un lead es 🔴 Presupuestar / 🟡 Seguimiento, arma un resumen ejecutivo y se lo manda al comercial por la línea interna (con topes para no repetir avisos).
💬 Plantillas de respuesta al lead
Se envía desde la línea de origen cuando se notifica internamente al comercial.
Variables disponibles:
{'{comercial.nombre}'}{'{comercial.apellido}'}{'{comercial.nombreCompleto}'}{'{comercial.cargo}'}{'{comercial.telefono}'}{'{comercial.email}'}{'{lead.nombre}'}{'{lead.telefono}'}{'{lead.clasificacion}'}
Vista previa con datos simulados
📱 Números comerciales de la empresa
Pool de números de la empresa que se asignan a usuarios. Cada número se vincula a un usuario activo desde su ficha (pestaña Usuarios). No se puede eliminar un número que esté asignado.
Número
Descripción
Asignado a
Acción
Agregar número
📜 Cola y auditoría de notificaciones
Cola pendiente
Notificaciones esperando reintento (línea interna caída, Anthropic sin crédito, etc.). Drena cada 30s automáticamente.
Cargando…
Historial de notificaciones
Cada notificación enviada (o intentada) queda registrada acá con su asignado, motivo, adjuntos y errores. Cap: últimas 5000.
Cargando…
Clasif. de conversaciones
Le pone una etiqueta a cada conversación (🔴 Presupuestar, 🟡 Seguimiento, 🤖 Auto, 💬 Social, ⚪ Otro) para saber de un vistazo qué requiere. Clasifica sola (al ratito de cada mensaje + un barrido cada 20 min) o con el botón “✨ Clasificar”; las etiquetas se editan abajo.
La clasificación corre muy seguido → conviene Haiku. La sugerencia de mejora del prompt (más abajo, en "Correcciones de clasificación") usa por defecto el motor más potente.
La IA clasifica cada conversación en una de estas etiquetas. 🔔 Aviso interno = manda el resumen al asignado. 💡 Propuesta = sugiere respuesta automática. ⭐ Por defecto = la que se asigna si la IA no encaja en ninguna.
Cargando…
👁 Ver prompt completo (preámbulo + etiquetas + cierre)
Correcciones de clasificación
Cargando...
✨ Preámbulo sugerido — revisá y editá antes de aplicar
Propuesta de respuesta
Sugiere (no envía) la próxima respuesta en la Bandeja privada y, con el uso, aprende a sonar como vos (estilo personal + conocimiento general del negocio, destilados de tus respuestas reales).
🧠 Autoaprendizaje (estilo + conocimiento)
La IA aprende tu voz (por etiqueta) y el conocimiento general del negocio a partir de las respuestas reales (Wiselink y celular) y los suma a la propuesta. Mejora sola con el tiempo.
Estilo personal
Cargando…
Conocimiento general (compartido)
—
Reglas pendientes de aprobación (de operadores, sin consenso):
📚 Conocimiento de producto
ⓘ Cómo funciona
Subís los manuales técnicos (PDF). El sistema los lee con IA (visión, Opus 4.8) y arma un corpus de conocimiento con el nº de página de cada dato. Con eso:
Propuesta de respuesta (bandeja privada, automática): se enriquece con un digest condensado (motor configurable abajo, por defecto el más potente).
Pregunta técnica (botón ❓, todos los usuarios): usa RAG — embebe tu pregunta con Voyage y recupera solo las secciones más relevantes de los manuales (no el corpus entero), responde solo con lo que está en ellas (no inventa) y cita la lámina. Motor de redacción configurable abajo (por defecto Sonnet).
Sugerencia comercial bajo demanda (botón 💡): un pre-chequeo decide si la charla es afín a producto; si lo es, usa el digest (motor configurable abajo, por defecto Sonnet); si es off-topic, redacta sin manuales.
La ingesta es incremental: solo se procesa un manual nuevo o reemplazado (por hash). El digest se genera con IA (con el motor elegido), lo revisás/editás y activás; se marca «desactualizado» cuando cambian los manuales.
El buscador del Q&A usa embeddings (Voyage): se generan automáticamente al ingestar cada manual; para regenerarlos sobre los ya procesados está el botón «🧬 Embeddings RAG». Requiere la API key de Voyage en Config → Conexiones; si falta, el Q&A cae al corpus completo (sigue funcionando, sin RAG).
El digest se genera poco → conviene el más potente. Las consultas técnicas (❓) y la sugerencia comercial (💡) corren más seguido → Sonnet equilibra costo/calidad. La sugerencia comercial solo carga conocimiento (el digest) si la charla es afín a producto (pre-chequeo automático); si es off-topic, redacta sin manuales. (La lectura por visión de los PDF usa Opus, no configurable.)
Manuales
Cargando…
Digest condensado
Se inyecta en la propuesta automática de la bandeja privada. Generalo con IA, revisalo/editalo y activalo.
Clasificador de imágenes
Cuando llega una imagen o PDF, le pone un TAG (Plano, Planilla, Presupuesto…) que también ayuda a clasificar el chat. Las categorías se definen en el prompt de abajo.
Categorías detectadas: —
Aprendizaje a partir de correcciones
Cada vez que corregís un tag, el sistema lo recuerda y lo usa para mejorar futuras clasificaciones.
—
🌎 Configuración regional
Cómo interpreta y muestra el sistema las fechas y las horas. Vale para todo:
burbujas de chat, bandejas, alertas, reportes de texto y Excel, logs de campaña y ventanas horarias de envío.
🕐 Zona horaria del sistema
Define la zona horaria que usa todo el sistema para mostrar y registrar fechas/horas
(reportes de texto y Excel, logs de campaña, alertas, ventanas horarias de envío). Por defecto Argentina (GMT-03:00).
Formato de hora
Cómo se muestra la hora del día en todo el sistema (burbujas de chat, bandejas,
alertas, reportes de texto y Excel, exportaciones). 24hs = 19:16 · AM/PM = 7:16 PM.
🗂 Auditoría de bandeja
Clasificaciones huérfanas
Tienen clasificación pero ya no hay mensajes en el inbox.
Suelen ser restos de mensajes evictados antes del fix de cap.
—
Cargando…
Líneas propias en la bandeja
Hilos cuyo remitente es uno de nuestros números (warmup interno). Suelen quedar de antes del filtro o de cuando la línea destino aún no tenía teléfono resuelto.
—
Cargando…
🚨 Alertas del sistema
Eventos críticos que requieren atención: créditos agotados, líneas caídas, asignación imposible, etc.
Cuando hay alertas activas también aparece un banner rojo arriba de la app.
Estado de servicios
Alertas activas
Cargando…
Historial (resueltas + activas, últimas 200)
Cargando…
🧹 Mantenimiento
Auditoría de archivos en disco y log de eliminaciones de la bandeja.
Si aparecen archivos huérfanos significa que hay un bug — el sistema deberia limpiar todo automáticamente.
♻️ Recuperar media reciente (bandejas de usuario)
Re-descarga del celular la media faltante de los últimos 3 días de las bandejas de usuario
(la que la purga borró por error). Throttleado para no saturar las líneas. La media vieja que ya no esté en el
celular no se recupera (queda como "📎 adjunto no disponible", con opción de reintentar al tocarla).
♻ Mensajes recuperados por reconexión
Cuántos mensajes recuperó el catch-up de reconexión por línea comercial (los que entraron
mientras la línea estuvo caída y se reinyectaron al reconectar). Se cuentan los que siguen en la bandeja
(marcados ⟲ recuperado en la burbuja). No incluye warmup ni números propios (se filtran).
Tocá "Actualizar" para ver el reporte.
⛔ Validación de números de campaña
Los números con todos los dígitos iguales (ej. 1111111111) se rechazan siempre.
Si activás el rechazo por país, además se descartan los que no son válidos para el país elegido.
Los rechazados se marcan con ⛔ Número inválido (distinto de ✗ Sin WhatsApp), no se intentan enviar y no se consultan a WhatsApp (no suman señal de spam).
Archivos huérfanos
Detecta directorios wa-auth/line-X/ sin línea activa en lines-config.json y
archivos inbox-media/* sin referencia en inbox.json ni internal-inbox.json.
Click "Auditar" para inspeccionar archivos huérfanos.
Log de eliminaciones del inbox
Registro de cada evento que eliminó mensajes del inbox (cap_eviction, borrado manual, limpiezas). Cap de 1.000 entradas — las más viejas se descartan.
Cargando…
Campañas sin creador asignado
Las campañas creadas antes de existir el sistema de notificación no tienen createdBy.
Sin ese campo, cuando se alcanza el tope diario no se sabe a quién mandarle el informe.
Este botón asigna al superadmin actual como creador de todas las que faltan.
Click "Refrescar" para chequear.
Diagnóstico de ACKs (entregas ✓✓)
Descarga un archivo de texto con las últimas 3000 entradas de diagnóstico
de ACKs (registros de envío, llegadas de ACK, fallbacks por uniqueId de LID,
y NO-MATCH). Útil para enviarlo a Claude/soporte cuando el delivery rate parece raro.
El buffer se llena solo mientras hay campaña o pruebas activas — el archivo va a estar
vacío si no se envió nada desde el último deploy.
Cuando enviás un mensaje por WhatsApp, WhatsApp te avisa en qué estado está con un código numérico llamado ACK (acknowledgement).
ACK
Significado
Aparece como
-1
⚠ ERROR — WhatsApp rechazó entregar el mensaje
🚫 en el log
0
Pendiente (todavía en cola del servidor)
—
1
Enviado (el servidor de WhatsApp lo recibió)
✓ gris
2
Entregado al celular del destinatario
✓✓ gris
3
Leído por el destinatario
✓✓ azul
Por qué importa ACK=-1: cuando una cuenta de WhatsApp empieza a recibir muchos -1 seguidos hacia distintos destinatarios, significa que WhatsApp marcó esa cuenta como restringida (shadow ban). El mensaje nunca llega al celular aunque la app diga "enviado". Si la línea sigue intentando, el shadow ban se profundiza y puede terminar en baneo permanente.
Qué hace este detector: cuenta los ACK=-1 consecutivos por línea. Si una línea acumula la cantidad configurada abajo (sin ningún ACK ≥ 1 entre medio), la pausa automáticamente por X minutos para que "descanse" y evite empeorar la situación. Cuando un mensaje cualquiera de esa línea recibe ACK ≥ 1, el contador se resetea (la línea sigue OK).
Mínimo 2. Default 5. Subilo si tu volumen es alto y querés más tolerancia.
Mínimo 10. Default 30. Más alto = la línea descansa más tiempo.
Líneas pausadas ahora
Click "Refrescar" para ver.
💾 Uso de disco (master + workers)
Cada contenedor tiene 5 GB de volumen persistente. Si master o worker supera el 80 %,
te llega una alerta por WhatsApp al chip del superadmin (anti-spam: máx 1 mensaje cada 24 h por proceso,
salvo que empeore 5+ puntos).
Click "Ver / refrescar" para calcular (puede tardar unos segundos).
🔌 Salud de líneas
Registro de sesiones detectadas colgadas por el chequeo automático (cada 5 min). Solo registra eventos de problema — si está vacío, todo anduvo bien.
—
Cargando…
🩺 Salud de líneas — umbrales del semáforo
Ventana 7 días + capa aguda 24h. La salud se mide por número (independiente de campañas). Cada tarjeta es una señal; el prefijo de cada campo indica a qué nivel dispara (🔴 rotar / 🟡 vigilar) y basta cualquiera de las condiciones. 🔴 tiene prioridad sobre 🟡; ⚫ desconectada y ⏸ pausada mandan sobre todo. Pasá el cursor por cada ⓘ para ver qué hace. Delivery/read son informativos (no afectan el semáforo).
📈 Rechazo (ACK-1) ⓘ
🚫 Shadow-bans ⓘ
📱 Bloqueo de dispositivo (re-vínculos forzados) ⓘ
Marca 🔴 si hay ≥ N re-vínculos forzados en las últimas H horas.
🧹 Lista sucia (Sin WhatsApp) ⓘ
💬 Conversación (inbound) ⓘ
Marca 🟡 si los entrantes son menos del % de lo enviado, con al menos N envíos.
🔌 Estabilidad ⓘ
⚙️ General ⓘ
🔄 Sincronización CRM — espejo Wiselink
La base del CRM vive en el espejo del Middleware (se actualiza sola contra Wiselink cada 2h).
El armador de campañas la consulta en vivo; además, un índice local (para el encabezado de los chats y la asignación de leads)
se refresca desde el espejo una vez por día. El sync viejo directo contra Wiselink fue retirado.
🗃️ Conexión al espejo (Middleware)
URL del Middleware
—
Key de lectura (x-wldb-key)
—
Verificando…
La sincronización del espejo contra Wiselink (cron + resync) se administra desde el Middleware. La key de lectura se obtiene en el Middleware → Config → Espejo Wiselink.
⚡ Conexión directa al espejo (Postgres)
El índice local se arma leyendo el espejo por SQL directo, que es bastante más rápido que por HTTP.
Si algo no cierra (la conexión no viene cifrada, el contrato del espejo cambió, los conteos no dan) el índice
se sigue actualizando por HTTP igual que siempre: esto no puede dejar la pestaña Meta sin datos.
Cadena de conexión
—
Verificando…
El usuario es de sólo lectura y sólo ve las vistas que el Middleware publica para el Chat. La contraseña se guarda enmascarada y nunca vuelve a la pantalla.
📇 Índice local (encabezado de chats + asignación de leads)
Total: — contactos ·
Sin negocio: — ·
✓ — con teléfono ·
Última actualización: nunca
Actualizando…
Baja del espejo los contactos y negocios y refresca el índice que usan el encabezado de los chats y la asignación de leads. Se actualiza solo: el Middleware avisa a Wiselink Chat apenas termina de sincronizar el espejo (cada 2h). Este botón es solo para forzarlo manualmente. Como red de seguridad, si el índice quedara viejo (>4h) se refresca solo.
🔌 API / Canales
ⓘ Qué es
API REST para que sistemas externos (Pipefy / iPass) envíen WhatsApp a clientes. Cada canal tiene una API key (header x-api-key). El mensaje sale desde la línea del comercial dueño de la cuenta del cliente (ruteo automático). Endpoint: POST /api/messages con { "to", "text" }.
La key se muestra una sola vez al crearla (se guarda solo el hash); si se pierde, rotás el canal.
🌐 Documentación pública (para compartir con programadores)
Página web sin login con todo el detalle del API. Pasale este enlace a quien tenga que integrar:
Números que WhatsApp confirmó sin cuenta ("Número no registrado en WhatsApp"). Se llena sola al detectarlos en campañas; al crear una campaña nueva se excluyen automáticamente (no se les vuelve a mandar). Si ves un falso positivo (un número que sí tiene WhatsApp, marcado por una línea floja), tocá Quitar y volverá a recibir en próximas campañas. Ya no se re-puebla sola en cada reinicio.
Total: —
Teléfono
Nombre
Agregado
Campaña de origen
Quitar
📚 Glosario canónico de estados (ACKs)
Fuente única de los estados de mensajes de WhatsApp. Aplica a todo Wiselink Chat: pantallas, informes y exportaciones (Excel/texto). Coincide con WhatsApp nativo: ✓ Enviado · ✓✓ Entregado · ✓✓ azul Leído.
Los 10 estados
Regla estricta de íconos
Los íconos ⏳ ✓ ✓✓ 🚫 ✗ ⏱ ⚠️ 🐛 representan exclusivamente el estado ACK de un mensaje y no se usan para otra cosa en ninguna parte. Éxito genérico → ✅; error genérico → ❌; "cargando" → texto + …; esperando en log en vivo → ⋯; "sin despachar" → —; número inválido (no se intentó enviar) → ⛔.
📚 Glosario canónico de definiciones
Cada término tiene una sola definición/fórmula en todo Wiselink Chat (UI y exportaciones). Acompaña al glosario de estados.
📚 Glosario canónico del motor / flujo
Íconos y eventos del motor de envío (campaña y "Probar campaña"). Fuente única ENGINE_GLOSSARY: no se pisan con los íconos de Estados (ACKs) ni con las palabras de Definiciones.
📚 Glosario canónico de salud de líneas
Criterios del semáforo de salud (por NÚMERO · ventana 7d + agudo 24h). Fuente única _healthGlossaryHTML, renderizada desde los umbrales VIGENTES (configurables en ⚙️ → Salud de líneas). No se pisa con Estados (ACKs), Definiciones ni Motor.
⚠
Confirmar acción
Esta acción requiere confirmación
Nuevo usuario
Definición
📚 Glosarios canónicos
Glosario canónico de estados (ACKs)
Fuente única de los estados de mensajes de WhatsApp. Aplica a todo Wiselink Chat (pantallas, informes y exportaciones). Coincide con WhatsApp nativo: ✓ Enviado · ✓✓ Entregado · ✓✓ azul Leído.
Los 9 estados
Glosario canónico de definiciones
Ambos glosarios también están en Configuración → 📚 Glosarios.
Mensaje enviado
Total de destinatarios: 0
Procesados: 0·Sin despachar: 0✓ Enviados: 0✓✓ Entregado sin leer: 0✓✓ Leídos: 0
🚫 Rechazados: 0
✗ Sin WhatsApp: 0
⏱ Throttling: 0
⚠️ Error WA: 0
🐛 Error interno: 0
⛔ Inválidos: 0
Nombre
Teléfono
Negocio
Estado
Línea
Despachado
🚫 Lista negra — números sin WhatsApp
Total: — · solo lectura · se excluyen solos de toda campaña nueva
Números que WhatsApp confirmó sin cuenta ("Número no registrado en WhatsApp"). Para exportar, andá a Configuración → Lista negra (sin WhatsApp).
Teléfono
Nombre
Agregado
Campaña de origen
🩺 Análisis de delivery por línea
—
Línea
Tipo
Procesados
Enviado (✓)
Entregado sin leer (✓✓)
Leído
Rechazado (🚫)
Sin WhatsApp (✗)
Throttling (⏱)
Error WA (⚠️)
Interno (🐛)
Delivery rate (Entrega)
Reach rate (Alcance)
Diagnóstico
🧪 Probar envío
Envía el contenido real de la campaña a los números indicados
Campaña:—
—
Vista previa del mensaje:
—
Las campañas no usan la línea interna del master (reservada para notificaciones entre comerciales). Por eso el conteo de acá puede ser uno menor al de "conectadas" arriba.
Un número por línea, con código de país, sin "+". Cada uno recibirá el mensaje (con variación aleatoria si la campaña tiene variaciones).