Tildá los vendors que participan del pool — por cada mensaje se calcula el costo de cada uno (vendor_rates) y se usa el más barato.
Rutas
El Sample Size (ciclo de reparto) es ahora una configuración global de la plataforma — ver Settings → General. Aplica a todas las rutas con carga (%), en Manual o acá.
País
Operador
MCC
MNC
Reparto
Números
Número
Vendor
Content Routing
Reglas por cliente que matchean contra el TEXTO del mensaje — se evalúan antes del modo de ruteo base del cliente (Manual/1a1/LCR/etc). Primera regla activa que matchea (por prioridad) gana.
País/Operador
Prioridad
Tipo
Patrón
Vendors
Activa
Elegí un cliente
Seleccioná un cliente arriba para ver o crear sus reglas de Content Routing.
Sender ID Routing
Reglas por cliente que matchean contra el SENDER ID (source_addr) del mensaje — se evalúan antes del Content Routing y del modo de ruteo base. Primera regla activa que matchea (por prioridad) gana.
País/Operador
Prioridad
Tipo
Patrón
Vendors
Activa
Elegí un cliente
Seleccioná un cliente arriba para ver o crear sus reglas de Sender ID Routing.
HLR & MNP
Estadísticas de caché
Números en caché
—
Lookups hoy
—
Lookups últimos 7 días
—
Expirados y refrescados
—
Configuración
—
Lookups habilitados
Apagado = solo se usa la caché existente (o network desconocido)
HLR Dip Rules
Fallback HLR condicional: solo se dispara si el número cae en un rango catch-all (sin operador específico) del catálogo MCC/MNC y el cliente tiene una regla activa para ese país.
Lookup Vendors
Nombre
Tipo
Costo/lookup
TTL caché
Estado
Cargando…
Reglas
Cliente
MCC / País
Lookup Vendor
Estado
Cargando…
HLR Usage Report
"Total Lookups" cuenta solo lookups REALES contra el proveedor (nunca cache hits) — no es lo mismo que "cuántos mensajes cayeron en catch-all".Costo Totales visibilidad interna del costo del lookup HLR — nunca se traslada ni se factura al cliente.
Elegí filtros y presioná Submit
HLR Dip Test
Dos pasos: la resolución por catálogo es gratis e instantánea; la consulta al proveedor es un dip REAL, cuesta y queda registrada en el HLR Usage Report.
Paso 1 — Catálogo interno (gratis)
Paso 2 — Consulta en vivo al proveedor (dip real)
Consulta siempre en vivo: nunca usa la caché, aunque el número ya esté cacheado. Solo aparecen los lookup vendors activos y reales.
HLR Rates
País
MCC
Costo por lookup
Cargando...
Rate Profiles
Nombre
Default
Tarifas cargadas
Cargando...
Tarifas
País
Operador
MCC
MNC
Precio
Vendor Rates
Nombre
Modo
Status
Costos cargados
Cargando...
MCC/MNC Database
MCC
MNC
Country
Operator
Prefijos
Cargando...
Reportes / EDR
Total enviados
—
% Entregados
—
% Fallidos
—
Costo total
—
Fecha
Cliente
Vendor
Origen
Destino
Mensaje Original
Mensaje Enviado
Network
HLR
País
Estado
Estado DLR
Costo
Venta Total
Costo Vendor Total
Margen
ID Customer
ID Vendor
Elegí un rango rápido o aplicá filtros para ver resultados
Motor de modificación de TEXTO del SMS (redacción, tildes, OTP a palabras, rotación de plantillas) — no decide vendor, eso es Content Routing/Sender ID Routing. Una regla nueva arranca inactiva: corré el preview manual y activala a mano cuando estés conforme con el resultado.
Nombre
Categoría
Scope
Prioridad
Activa
Cargando…
Tools — Send Test SMS
Envío real de submit_sm directo a un vendor específico — sin cliente, sin rating/crédito, sin Content Rules. Para aislar problemas de vendor sin armar una campaña de prueba en el Portal. No queda mezclado en ningún reporte/EDR/NOC de clientes reales.
Desactivalo para pruebas rápidas sin depender del HLR — el costo estimado queda N/A sin mcc/mnc resuelto.
Resultado
Vendor usado
—
Red resuelta (HLR)
—
Costo estimado (vendor)
—
Submit
—
Estado DLR
—
Historial de pruebas (client_id = NULL — nunca mezclado con EDR/NOC de clientes reales)
Fecha/Hora
Vendor
Destino
Sender ID
Mensaje
Costo est.
Submit
DLR
Cargando…
Nueva regla
Identidad y scope
Acción
Esta categoría usa un transform fijo del motor (ver content-rules.js): no tiene regex ni plantilla configurable.
{captured}: lo que capturó el regex_pattern. {otp}: primer código de 4-8 dígitos detectado en el mensaje (sin necesidad de regex propio).
Usá {otp} donde va el código — se reemplaza por el código real detectado en cada mensaje.
Tester manual — dry-run, no toca la DB ni requiere guardar
Preview sobre EDR real — opcional
Asistente IA — Próximamente
El asistente conversacional (llamada a la API de Claude, corre 100% desacoplado del pipeline de envío — nunca en submit_sm) todavía no está construido. Usá "Modificación simple" para crear reglas a mano mientras tanto.
Asignación Unificada
El camino real que sigue el tráfico de esta troncal — content rules, HLR, routing y tarifas
en un solo lugar. Clic en cualquier etapa para editarla.
—
0/4 configurado
✏️Content Rules
📡HLR & Sender ID
🧭Routing
💰Rates & Billing
Tools — Simulador de Envío
Muestra qué pasaría con un envío real —HLR, tarifa, crédito, routing y Content Rules— sin enviar nada
y sin ningún efecto secundario: no crea el mensaje, no dispara un HLR Dip pago, no avanza el ciclo de
reparto, no marca episodios de saldo ni manda correos.
Currency Exchange
Mantenimiento de tasas de cambio — todavía no conectado a Rates/Vendor Rates (esos siguen siendo USD implícito). USD es el ancla (rate=1) y no es editable.
Moneda
Tasa a USD
Origen
Actualizado
Cargando...
General
Se actualiza automáticamente al generar facturas — no editable acá.
Cada bloque de N mensajes reales de una ruta con carga reparte los % exactos entre vendors (no es azar mensaje a mensaje). Aplica a todas las rutas con carga de la plataforma — cambiarlo recalcula todas sus secuencias.
Datos del emisor
Datos fiscales de SendMasivo que se imprimen en el encabezado de las facturas.
Sin estos campos el PDF sale con el bloque del emisor incompleto.
Domains
Referencia de la topología de la plataforma. Estos valores son
solo documentación: hoy ningún envío, link ni webhook los lee —
cada uno sigue saliendo de su variable de entorno actual. Cambiarlos acá no
redirige tráfico ni reescribe links ya generados.
Este mismo panel. Hoy no se referencia desde ningún lado del código.
Host TCP contra el que los clientes hacen bind SMPP — no es la URL del panel.
Se envía en el correo de credenciales al crear una troncal, junto al puerto
(—, que sale de SMPP_PORT del .env).
Vacío = el correo sale con el placeholder sin resolver.
El valor que se usa de verdad sale de PORTAL_BASE_URL (.env),
con fallback https://app.sendmasivo.com — este campo todavía no lo reemplaza.
Base contra la que los clientes HTTP pegan /api/http-submit.
La configura cada consumidor por su lado (SENDMASIVO_SMPP_BASE_URL en el Portal), no este campo.
Dominio de los links acortados de campaña. Lo genera el Portal desde
SHORT_LINK_BASE — y depende además de nginx/DNS, así que no es
un valor que se pueda cambiar solo desde acá.
URL a la que se notifican los DLR de clientes HTTP que no traen webhook propio.
Vacío = se sigue usando el default vigente
(—), derivado de Portal.
Branding
Aparece en el título de la pestaña, el login, la barra superior y la barra lateral.
Vacío = SendMasivo SMPP. Las iniciales de la barra lateral colapsada
(SM) se derivan solas del nombre.
Pinta botones primarios, foco de campos, ítem activo del menú y el cuadro de marca.
El preview es en vivo — si salís sin guardar, se revierte al recargar.
Sin logo
JPG, PNG o WEBP — máximo 5 MB. Sin logo se usa el cuadro de marca con el color de acento.
32
16
Sin imagen
ICO, PNG o SVG cuadrado — recomendado 512×512, máximo 5 MB. Se sirve tal cual (no se redimensiona en el servidor).
Sin favicon se usa el logo.
Sin imagen
PNG o SVG cuadrado — recomendado 96×96, máximo 5 MB. Se muestra en el riel cuando la barra lateral está colapsada.
Sin ícono se usan las iniciales del nombre.
Sin imagen
JPG, PNG o WEBP — recomendado 1920×1080, máximo 5 MB.
Hoy no se muestra: desde el rediseño del login (21-ago-2026) la pantalla
es una ventana con barra de título, logo animado y panel lateral, y una foto de
fondo a pantalla completa apagaría justo eso. La imagen queda guardada por si
vuelve a haber lugar para ella.
Bank Accounts
Banco
Titular
Número de cuenta
Moneda
SWIFT
Estado
Cargando…
Email
Servidores SMTP y templates de correo — nada de esto envía nada todavía, es captura y configuración.
Servidores configurados
Nombre
Host
Sender Email
Seguridad
Puerto
Límite/seg
Estado
Cargando…
Probar →
Elegí un template de la lista para editarlo.
Historial de envíos
Fecha
Para
Asunto
Origen
Servidor
Estado
Cargando…
Companies
Nombre
Moneda
Troncales
Cargando...
Nuevo cliente
Password generado
⚠ Este password no se vuelve a mostrar. Guárdalo ahora.
Identificación
Tipo de cliente
"Puerta de entrada" del tráfico — routing/Tools/Rates/Billing/NOC son los mismos motores sea cual sea el tipo.
Si se asigna, el precio de cada mensaje se resuelve por la tabla de tarifas del reseller (sección abajo) en vez del Perfil de tarifa normal — sin fila para ese mcc/mnc, el envío se rechaza (nunca cae al precio normal en silencio).
Integración HTTP
—
Usada en el header X-Api-Key de POST /api/http-submit y GET /api/http-status.
Se llama cuando un mensaje llega a status final (delivered/failed/expired). Vacío = sin webhook, solo log interno.
—
Firma HMAC-SHA256 del body en el header X-Webhook-Signature.
Lista vacía = sin restricción de origen. Se valida formato IPv4 antes de agregar.
Reseller
Un Reseller agrupa el pricing de otros clientes: no bindea por SMPP ni usa la API HTTP, así que no tiene sección de transporte propia.
Reseller — tarifas de este cliente
Precio reseller→cliente por mcc/mnc — match exacto, sin catch-all de país ni DEFAULT (a diferencia del Perfil de tarifa normal). Moneda: — (la Company de este cliente — reseller_client_rates no tiene su propia moneda).
MCC
MNC
Rate
Sin tarifas todavía
Conexión SMPP
Límite duro real (con cola/backpressure, nunca rechazo) — default 20 si no se edita.
IP Whitelist
Lista vacía = sin restricción de IP. "Máx. sesiones" es opcional por IP — vacío = sin límite (el placeholder es solo una sugerencia, no un tope forzado; hay clientes con hasta 10 sesiones legítimas).
Avanzado (SMPP)
Reconexión, enquire link interval y Source/Dest TON/NPI: guardados por consistencia con el modal de vendor — hoy sin efecto real del lado cliente (el server solo responde al enquire_link que manda el cliente, nunca inicia una reconexión saliente hacia él, y no fuerza TON/NPI en ningún PDU de esta dirección).
Si el vendor asignado también fuerza un encoding, el del vendor gana.
Tope de submit_sm recibidos sin resp todavía en esta sesión. Vacío = sin límite (default).
Reglas especiales
Cuenta interna de test
Excluye a este cliente de las auditorías de venta bajo costo y de la validación de margen. No afecta la facturación: su tráfico se factura igual.
Asignar routing y rate plan
Ruteo & facturación
Independiente del Routing mode de arriba — si el número destino matchea un plan MSISDN, ese vendor gana antes de mirar el Routing mode.
Nuevo cliente HTTP
Cliente creado — credenciales generadas
⚠ Estos 3 valores no se vuelven a mostrar juntos. Pasáselos al cliente ahora.
Identificación
Admin en el Portal (app.sendmasivo.com)
Integración HTTP
Por default: https://app.sendmasivo.com/api/webhooks/sendmasivo-smpp (mismo que usa Portal SendMasivo)
Nuevo vendor
Identificación
Conexión SMPP
Máximo 8 caracteres — es el límite del campo password del bind SMPP (v3.4). Varios operadores rechazan credenciales más largas.
Para cambiar el password usá el botón "Reset" en la tabla.
Cómo nos conectamos NOSOTROS a este vendor.
Tipo & capacidad
Vendor mock
Sandbox local, no hace conexión SMPP real
Límite duro real (cola/backpressure) — default 20.
Avanzado (SMPP)
Reconexión y enquire link solo aplican a vendors reales (is_mock=false) — no tienen efecto en un vendor mock.
Si el cliente también fuerza un encoding, éste (el del vendor) gana.
Habilitar solo tras validar Class 0 contra este trunk real. Si está apagado, los mensajes flash ruteados a este vendor se degradan a SMS normal (logueado).
Permitir tráfico a pérdida
Apagado (default): si el costo de este vendor supera la venta al cliente en una ruta, no recibe ese tráfico — se reparte entre los demás, y si no queda ninguno el mensaje se rechaza. Encendido: sí lo recibe, y cada mensaje se envía a pérdida conocida. No aplica cuando el costo no se puede medir: sin tarifa resoluble el vendor queda afuera igual.
Max. requests en vuelo (windowing)
Tope de submit_sm mandados a este vendor sin resp todavía. Vacío = sin límite (default).
Simulación (solo mock)
% Rechazado en submit
% Delivered
% Expired
Delay de submit min (ms)
Delay de submit max (ms)
Delay de DLR min (s)
Delay de DLR max (s)
Nueva Company
Identificación
Nombre (interno)
Razón social — opcional, para facturas
RUC / Tax ID — opcional, para facturas
Dirección — opcional
Moneda
Logo — opcional, override del de plataforma
Contactos — todos opcionales
Email general
Email soporte
Email tarifas
Email facturación
Teléfono
Estado de cuenta
Estado
Informativo: suspender no corta el tráfico por sí solo.
Fecha de alta
—
Última modificación
—
Alerta de crédito — opcional
Enviar a
Correo
Avisar cuando quede
% de saldo disponible
Reporte diario de tráfico — opcional
Enviar reporte diario
Resume el tráfico del día anterior completo (enviados, entregados,
fallidos). Deshabilitado, esta company ni se evalúa.
Hora de envío
En la zona horaria de la company (la de Billing Setup, o la de plataforma si no tiene).
El reporte sale en el primer ciclo posterior a esa hora — el chequeo corre cada 5 minutos.
Enviar a
Correo
Detalle del mensaje
Detalle de PDU
⚠ Vendor Mock — no hubo un PDU real por un socket, esto es una simulación equivalente (mismos datos que se hubieran mandado).
Request
⚠ HexDump reconstruido desde campos ya decodificados — no son los bytes crudos originales que viajaron por la red.
HexDump
Response
⚠ HexDump reconstruido desde campos ya decodificados — no son los bytes crudos originales que viajaron por la red.
HexDump
Nuevo Entry
MCC
MNC (vacío = catch-all país)
Country
Operator (opcional)
Prefijos
Prefix Start
Prefix End
Sin rangos todavía
Prefix Start
Prefix End
Importar Excel — MCC/MNC Entries
Archivo (.xlsx, .xls, .csv)
Mapear columnas
Formato de MCC/MNC en el archivoMCC y MNC en columnas separadasColumna combinada (MCCMNC) — ej. export de Phoenix: "412" (catch-all) o "704003" (MCC 704 + MNC 003)
Columna de MCC
Columna de MNC
Columna MCCMNC combinada
Columna de Country
Columna de Operator
Combinada: los primeros 3 dígitos son el MCC, el resto es el MNC — un valor de exactamente 3 dígitos (ej. "412") se toma como catch-all de país (MNC vacío), igual que en modo separado con la celda de MNC vacía. Operator es opcional — puede quedar vacío.
Revisar e importar
Único modo: merge — actualiza país/operador si el mcc+mnc ya existe, agrega los que no existen, nunca borra nada.
Importar Excel — Prefijos
Archivo (.xlsx, .xls, .csv)
Mapear columnas
Formato de MCC/MNC en el archivoMCC y MNC en columnas separadasColumna combinada (MCCMNC) — ej. export de Phoenix: "412" (catch-all) o "704003" (MCC 704 + MNC 003)
Columna de MCC
Columna de MNC
Columna MCCMNC combinada
Columna de Prefix Start
Columna de Prefix End
Combinada: los primeros 3 dígitos son el MCC, el resto es el MNC — un valor de exactamente 3 dígitos (ej. "412") se toma como catch-all de país (MNC vacío). Country/MCCMNC del archivo (si vienen) se ignoran para el match — el match es por MCC+MNC contra Entries ya existentes.
Revisar e importar
Filas sin Entry (mcc+mnc) que matchee se omiten sin bloquear el resto. Rangos que se solapan con otros ya cargados se avisan como advertencia, sin bloquear la carga.
Registrar pago
Tipo
Nombre
Monto
Moneda
Fecha de pago
Método
Referencia
Notas
Facturas a aplicar (sugerido FIFO, editable)
Elegí owner y monto para ver la sugerencia.
Factura
Total
Monto a aplicar
Nueva cuenta bancaria
Banco
Titular
Número de cuenta
Moneda
SWIFT
Notas
Explicación de la decisión
Correo enviado
Cambios de tarifa sin avisar
Nuevo servidor SMTP
Conexión
Nombre
Host
Puerto
Seguridad
Límite por segundo
Sender Email
Credenciales — opcionales
Usuario
Contraseña
Estado
Estado del servidor
Editar vendor asignado
Cliente
Vendor
Trace SMPP
Vista en vivoactivo
Últimos PDUs en memoria, sin costo de disco. Siempre encendido.
Guardar en discopróximamente
La persistencia con vencimiento llega en una entrega aparte. El password de bind se guarda redactado siempre, en las dos capas.
Sesiones
Línea de tiempo
Los enquire_link no se listan acá: se resumen arriba, por sesión. Así el buffer queda para el tráfico real.
← lo que recibimos · → lo que enviamos. Siempre relativo a la plataforma, igual para clientes y vendors.
Hora
Sesión
Dir
Comando
Status
Campos
Nuevo Lookup Vendor
Nombre
Modo mock
Simula los 5 resultados posibles sin llamar a un proveedor real — para pruebas
Protocolo
Define cómo se arma la consulta y cómo se interpreta la respuesta. Elegir el equivocado hace fallar todos los dips de este proveedor.
Endpoint URL
Provider ID
Password
Distribución (deben sumar 100) — o forzá un resultado puntual para pruebas deterministas.
% OK
% Subscriber Absent
% Invalid Subscriber
% Subscriber Roaming
% Subscriber Ported
Forzar outcome (pruebas)
Costo por lookup
TTL de caché (días)
Nuevo costo por país
País
La lista sale del mismo catálogo de operadores que usan Content Rules y Rate Profiles.
Costo por lookup
Costo interno que cobra el proveedor de HLR. No se le factura al cliente.
Importar CSV — HLR Rates
Archivo (.csv, .xlsx, .xls)
Mapear columnas
Columna de MCC
Columna de Costo
Las filas cuyo MCC no exista en el catálogo se omiten en silencio.
Revisar e importar
Merge — actualiza el costo de los países que ya están, agrega los que faltan, nunca borra.Reemplazar todo — borra el tarifario actual de este proveedor y carga solo lo del archivo.
Add HLR Dip Rule
Cliente
MCC / País
Lookup Vendor
Settings / Action / Billing
Outcome
Action
Nuevo perfil
Nombre
Moneda
Moneda propia del perfil — independiente de la Company del cliente que lo usa.
Perfil default
Solo un perfil puede ser el default a la vez
Agregar tarifa
País
Precio
Vendor
Vendors (orden de intento)
Agregar ruta
País
Reparto por vendor (debe sumar 100)
Agregar ruta MSISDN
Números (uno por línea)
Si un número ya está en este plan, se reemplaza el vendor (no se duplica).
Vendor
Agregar regla
País(es) + Operador(es)
País
Operador
Coincidencia exacta — sin catch-all país, esta regla solo aplica al operador elegido.
Tipo de match
Prioridad
Menor número = se evalúa primero.
Patrón
Activa
Editar ruta —
Nuevo plan
Nombre
Importar Excel — Vendor Rates
Archivo (.xlsx, .xls, .csv)
Mapear columnas
Columna de MCC
Columna de MNC
Columna de Precio
Si la celda de MNC viene vacía en una fila, esa fila se toma como catch-all de país.
Revisar e importar
Merge — actualiza precio si ya existe esa combinación mcc+mnc, agrega las que no existen, nunca borra nada.Reemplazar todo — borra (soft) todas las tarifas actuales del vendor excepto el DEFAULT global, y carga solo lo del archivo.