Configuración del sistema¶
⚙️ Solo para Super Admin
La sección Config (menú lateral → Config, ruta /settings) es exclusiva del
Super Admin. Reúne los ajustes globales, en varias pestañas: Scraper · Email SMTP ·
WhatsApp · Mensajes WA · IA · Alertas · Registro · Accesos · Historial de scrapes ·
Sincronización.
Cambios de alcance global
Lo que se configura aquí afecta a todas las empresas. Cámbielo con cuidado.
Scraper¶
Controla el proceso que revisa Guatecompras.

- Programación — Expresión cron (cada cuánto corre; ej.
0 0 8,12,18 * * ?) y Zona horaria. - Días a scrape, Máx. páginas (0 = todas), Delay entre páginas (ms) y Registros por página; interruptores Paginación y Dry run.
- Filtros de Guatecompras — Categorías y Modalidades por sus IDs (separados por coma). Vacío = usa los predeterminados. Los íconos ⓘ listan los IDs disponibles.
- Ventana de días por categoría (opcional) — excepciones para categorías de alto volumen; Agregar excepción para definir días distintos por categoría.
- Configuración avanzada — se expande para mostrar URL/endpoint, reintentos y timeouts.
- Relays de salida (Guatemala) — la lista de salidas por donde el sistema llega a Guatecompras; se explica más abajo.
- Guardar cambios conserva la configuración; ▶ Iniciar scrape ahora dispara una corrida manual inmediata.
El scraper no corre al arrancar
Al reiniciar el sistema, el scraper no ejecuta una revisión inmediata; solo reprograma su siguiente corrida según el cron. Para revisar ya, use Iniciar scrape ahora.
Relays de salida¶
Los servidores están alojados en Finlandia y Guatecompras bloquea el acceso desde ahí, así que todo el tráfico hacia el portal sale por un relay en Guatemala: tanto el scrape como las consultas de estado de Seguimiento. Antes había un solo relay configurado con un campo de host y puerto, y eso lo volvía un punto único de falla — cuando ese enlace murió, el sistema pasó cerca de 24 horas trayendo cero resultados. Por eso ahora es una lista con varios.
Cada relay aparece en una tarjeta con etiqueta, host:puerto y prioridad, y debajo, en letra pequeña, su estado: último OK, fallos seguidos (en naranja) y salida esperada si se definió. A la izquierda el interruptor lo habilita o deshabilita sin borrarlo, y a la derecha:
- Probar — lo prueba en ese momento y responde con la IP de salida real y cuánto tardó. Es la forma confiable de saber si sirve: que un relay conteste al ping no prueba nada, ya ocurrió que respondiera pings sin dejar pasar nada de tráfico.
- Editar y Eliminar. Al eliminar uno, el historial de scrapes que salió por él se conserva.
Agregar relay pide etiqueta (un nombre para reconocerlo, ej. Relay Guatemala (VM)),
host y puerto (3128 por defecto), prioridad — menor valor = se intenta
primero — y, opcional, una IP de salida esperada.
Cómo elige el sistema por dónde salir
Al empezar cada corrida recorre los relays habilitados, en orden de prioridad, y se queda con el primero que responde; esa corrida completa sale por él. No se queda pegado al último que funcionó, así que el relay preferido recupera el tráfico por sí solo en cuanto vuelve a estar sano. La prueba se hace en el momento: los datos de estado de la tarjeta son informativos y nunca deciden.
No fije la IP de salida esperada en un enlace residencial
En una conexión residencial el proveedor cambia la IP pública cada cierto tiempo (pasó después de un reinicio). Si la dejó fija, el sistema descartará un relay que está perfectamente sano. Úsela solo con enlaces de IP fija.
Sin relays no hay scraping
Si la lista queda vacía aparece un aviso naranja. Sin al menos un relay habilitado, el scraping falla por completo.
Email SMTP¶

El transporte de correo global que usan todas las empresas: Servidor SMTP, Puerto, interruptores STARTTLS / SSL/TLS, Usuario SMTP, Contraseña (déjela en blanco para no cambiarla) y Dirección From por defecto. Guardar cambios y Probar SMTP (envía un correo de prueba). La contraseña se guarda cifrada.
WhatsApp¶

La pestaña WhatsApp administra los perfiles de envío. Un perfil es una conexión de WhatsApp (un gateway) desde la cual salen los mensajes. Cada perfil tiene:
- Nombre — identificador del perfil.
- URL del gateway — la dirección del servicio de WhatsApp.
- Activo — si está disponible para enviar.
- Predeterminado — el perfil que se usa para los envíos a contactos individuales cuando una empresa no elige otro.
- Plantilla por defecto — el texto base del mensaje para ese perfil (ver abajo).
Botones: Agregar perfil, Sync grupos (importa los grupos de WhatsApp del gateway).
La pestaña Mensajes WA trae herramientas de prueba: Enviar mensaje de prueba (a un número) y Prueba grupo (a un grupo), para confirmar que la entrega funciona.
Verificar ≠ enviar
Verificar la conexión solo revisa el estado; para comprobar que los mensajes llegan, use Enviar mensaje de prueba.
Plantillas de mensaje de WhatsApp¶
Una plantilla define el texto de cada aviso de WhatsApp. En el texto puede intercalar variables que Licita Radar reemplaza, al momento de enviar, con los datos de la licitación.
Variables disponibles¶
| Variable | Se reemplaza por |
|---|---|
${companyName} |
Nombre de la empresa. |
${count} |
Cantidad de licitaciones incluidas en todo el aviso — no solo en el mensaje individual de WhatsApp que está viendo. Ver nota de agrupación abajo. |
${title} |
Título de la licitación. |
${entity} |
Entidad compradora. |
${amount} |
Monto estimado (con su moneda, p. ej. 1,200.00 GTQ). |
${deadline} |
Fecha límite para ofertar. |
${url} |
Enlace a la licitación en Guatecompras. |
Escriba las variables exactamente así, con ${…}. Cualquier otro texto se envía tal
cual. Si una variable no tiene dato para esa licitación, se reemplaza por vacío.
Cómo se agrupan varias licitaciones en un solo aviso
Cuando un envío incluye varias licitaciones, Licita Radar arma un texto por licitación (usando su plantilla, si tiene una) y los une en la menor cantidad de mensajes de WhatsApp posible — normalmente uno o dos, sin importar cuántas licitaciones sean. Esto evita que un aviso con muchos eventos se corte a la mitad: WhatsApp empieza a rechazar mensajes después de una ráfaga de unos 25 seguidos, y antes de agrupar, cada licitación viajaba en su propio mensaje. Su plantilla no necesita saber nada de esto — se sigue escribiendo pensando en una licitación a la vez; Licita Radar la repite y las junta.
Dónde se define una plantilla (dos niveles)¶
Hay dos lugares para definir plantillas, y se aplican con esta prioridad:
- Plantilla de la empresa — pestaña WhatsApp de cada empresa, campo "Plantilla de mensaje (opcional)". Si está definida, manda para esa empresa. Ver Canales.
- Plantilla por defecto del perfil — aquí, en Config → WhatsApp, al crear o editar un perfil. Se usa cuando la empresa no tiene su propia plantilla.
- Mensaje por defecto del sistema — si no hay ninguna de las anteriores, Licita Radar arma un mensaje predefinido con emojis (título, NOG, entidad, modalidad, monto, fecha límite y enlace).
Dicho de otro modo: empresa → perfil → mensaje por defecto. Lo primero que exista, gana.
El mensaje por defecto del sistema
Si nadie configura plantillas, un aviso con una sola licitación se ve más o menos así:
🎯 *Nueva oportunidad — Mi Empresa*
📋 *NOG: 31034160*
Adquisición de renovación del licenciamiento de firewall
🏛 Instituto Técnico de Capacitación
📄 Licitación Pública (Art. 17 LCE)
💰 1,200.00 GTQ
⏰ Límite: 01/09/2026 00:00
https://www.guatecompras.gt/…
Y con varias licitaciones en el mismo aviso, así (nótese el encabezado con la cantidad y las licitaciones separadas por una línea):
🎯 *2 nuevas oportunidades — Mi Empresa*
📋 *NOG: 31034160*
Adquisición de renovación del licenciamiento de firewall
🏛 Instituto Técnico de Capacitación
📄 Licitación Pública (Art. 17 LCE)
💰 1,200.00 GTQ
⏰ Límite: 01/09/2026 00:00
https://www.guatecompras.gt/…
———
📋 *NOG: 31034205*
Servicio de mantenimiento de flotilla vehicular
🏛 Municipalidad de Villa Nueva
📄 Cotización
💰 1,250,000.00 GTQ
⏰ Límite: 02/09/2026 10:30
https://www.guatecompras.gt/…
Si el aviso trae demasiadas licitaciones para caber en un solo mensaje, Licita Radar lo reparte en dos o más y numera cada uno, p. ej. "(1/2)", "(2/2)", en el encabezado.
Crear una plantilla por defecto (a gusto) — paso a paso¶

- Vaya a Config → WhatsApp.
- Pulse Agregar perfil (o edite uno existente con su ✏️).
- En el diálogo, complete Nombre, URL del gateway y los interruptores según necesite.
-
En el campo Plantilla por defecto, escriba su mensaje usando texto libre y las variables. Por ejemplo:
-
Pulse Crear perfil (o Guardar cambios).
A partir de ese momento, cualquier empresa que no tenga su propia plantilla usará este
texto. WhatsApp admite formato básico: *texto* para negrita y _texto_ para
cursiva.
¿Quiere una plantilla distinta para una sola empresa?
Defínala en la pestaña WhatsApp de esa empresa ("Plantilla de mensaje (opcional)"). Esa plantilla tiene prioridad sobre la del perfil, solo para esa empresa. Deje ese campo en blanco para volver a heredar la del perfil.
IA (licita-ai)¶

La conexión con el servicio de inteligencia artificial que filtra las licitaciones:
- Análisis de IA habilitado — interruptor global. Si está apagado, ninguna empresa puede analizar con IA (las coincidencias de keywords siguen sin filtrar).
- URL base del servicio y API Key.
- Confiar en certificado self-signed — necesario para la red interna con certificado propio.
- Timeout análisis y Timeout requisitos (ms).
- Guardar cambios y Verificar conexión (muestra el estado de salud del servicio).
Alertas¶
Avisa cuando el scraper deja de traer datos, para no enterarse por casualidad. Ya ha pasado tres veces que el scraper estuvo caído entre 14 y 19 horas sin que nadie lo notara.
- Enviar alertas — interruptor general. Viene apagado y sin destinos: hasta que se configure uno, no se envía nada.
- Canal — WhatsApp, Email o Ambos.
- Destinos de WhatsApp — teléfonos o el JID de un grupo (termina en
@g.us), separados por coma. Usar un grupo es lo más cómodo: se agrega o quita gente desde WhatsApp, sin entrar al sistema. - Destinos de email — correos separados por coma.
- Guardar y enviar prueba — guarda y manda un mensaje de prueba a los destinos. Funciona aunque las alertas estén apagadas, para poder verificar el destino antes de encenderlas. El resultado dice exactamente qué pasó con cada destinatario.
Cuándo avisa, y cuándo no
Solo avisa cuando una corrida termina FALLIDA, es decir cuando no entró ni un concurso. Manda un mensaje al caer y otro al recuperarse: si fallan varias corridas seguidas no repite el aviso. Las corridas PARCIALES no alertan, porque siguen trayendo datos y avisar por ellas volvería la alerta ruido que se ignora.
Accesos¶

Bitácora de cada intento de inicio de sesión, exitoso o no. Sirve para dos cosas distintas: auditar quién entró, y detectar intentos de entrar que no deberían existir.
Cada fila muestra el correo, la fecha y hora, la dirección IP desde la que se intentó y el navegador. Los intentos fallidos agregan el motivo: Credenciales incorrectas, Cuenta bloqueada o Cuenta inactiva. Si el correo no corresponde a ninguna cuenta del sistema, la fila lo marca como (cuenta inexistente) — varios seguidos son señal de que alguien está probando contraseñas.
- Buscar por correo — filtra por dirección; sirve tanto para una cuenta real como para un correo que nadie tiene.
- Todos / Exitosos / Fallidos — filtra por resultado.
- Refrescar — vuelve a cargar la lista.
Esta pestaña no dice si la gente está usando el sistema
Solo registra el momento en que alguien escribe su contraseña. La sesión se renueva sola durante días, así que una persona que entra a diario puede pasar meses sin aparecer aquí. Para saber si una cuenta se está usando, vea el indicador de actividad en Usuarios.
Cada instancia guarda lo suyo
La bitácora es local: no se comparte ni se sincroniza entre instancias. Si tiene varias, consulte la de cada una por separado.
Historial de scrapes¶

Tabla con el historial de corridas del scraper. Cada tarjeta se expande para ver el resumen de notificaciones de esa corrida: total enviadas/fallidas y el detalle por destinatario, agrupado por canal. Es la mejor forma de auditar qué hizo el sistema en cada revisión y confirmar que los avisos salieron.
Sincronización¶
Define si esta instancia hace su propio scrape (Scrape directo) o se sincroniza desde otra instancia madre (URL + API key). Incluye la gestión de instancias hijas autorizadas. Es una función de infraestructura para despliegues con varias instancias.