Catalizadora × Truly Nolen International · 3 de septiembre de 2026

El prospecto de GlobalLink, dentro del sistema de TNI

Cómo se crea el prospecto en el sistema de gestión de TNI, qué lo detona, campo por campo a dónde va cada dato, cómo vuelve lo que TNI cambia, y cómo se entra a GlobalLink desde su sistema con un clic.

1 · El flujo de 0 a 100

Dos sentidos: lo que GlobalLink escribe en minutos, y lo que TNI cambia vuelve cada noche

El prospecto vive como un cliente en estado 4, Potencial, en la ficha de clientes de TNI. Cada avance se registra como un renglón en su bitácora de contactos. Lo que TNI modifique en esa ficha o en esa bitácora vuelve a GlobalLink por el espejo nocturno.

GLOBALLINK SISTEMA DE GESTIÓN DE TNI TIEMPO ↓ 1 · Nace el prospecto con dueño «Enviar a Truly Rocket» o «Modo Manual» + vendedor app.leads · id_lead · evento prospecto_creado minutos Alta en dbo.Clientes IdStatusCliente = 4 · IdVendedor · marca GLOBALLINK en Observaciones devuelve IdCliente → queda guardado en el negocio IdCliente → app.leads.id_cliente_creado 2 · Primer contacto correo, WhatsApp o llamada; por Rocket o por el vendedor Renglón en dbo.Contactos FechaContacto · IdVendedor · Observaciones «contactado · canal» 3 · Cita agendada la agende el bot o el vendedor · es el «Potencial» del acta del 10 de agosto Renglón en dbo.Contactos FechaProgramada · Observaciones «cita agendada para …» 4 · Propuesta enviada el negocio entra a negociación, con monto Renglón en dbo.Contactos Observaciones «propuesta enviada · USD …» 5 · Ganado el vendedor cierra en GlobalLink evento cierre_ganado · ya construido Alta en dbo.Servicios y dbo.Propuestas + renglón Servicios.IdCliente · Propuestas.IdServicio · FechaAlta la ficha sigue en estado 4: TNI la activa cuando factura de vuelta · espejo nocturno · sólo lo que cambió A · TNI factura y activa al cliente Clientes.IdStatusCliente 4 → 1 su flujo de siempre; nosotros no tocamos la ficha esa noche El negocio queda cerrado y sincronizado app.leads.status → won → tni_synced si el vendedor no lo había cerrado, se cierra solo, con la fecha de TNI B · Alguien anota una visita o llamada en TNI renglón nuevo en Contactos, sin la marca GLOBALLINK los que llevan la marca son nuestros y se ignoran al volver Aparece en la línea de tiempo del negocio app.lead_activity · «visita registrada en TNI por …» si estaba en «nuevo», pasa a «contactado» C · TNI cambia el vendedor, el teléfono o el contacto Clientes.IdVendedor · Telefono · Email · ContactoVentas* la ficha de TNI manda sobre los datos del cliente Se reasigna el dueño y se actualiza la ficha app.leads.assigned_rep_user_id · app.contactos · app.companias cada cambio queda anotado como «cambio hecho en TNI» D · TNI da de baja al prospecto Clientes.IdStatusCliente → 3 · o FechaBaja con valor El negocio pasa a perdido app.leads.status → lost · motivo «dado de baja en TNI» se puede reactivar desde GlobalLink: vuelve a nacer como en el paso 1 6 · Perdido desde GlobalLink con motivo obligatorio; la ficha de TNI no se toca Renglón en dbo.Contactos Observaciones «perdido · motivo» · TNI decide si da de baja Ida: cola de salida + programa de escritura, en minutos. Vuelta: espejo nocturno con marca de motor, cada 24 h; puede correr cada hora porque trae sólo lo que cambió.
Cinco detonantes de ida escriben en TNI sin modificar nunca una fila existente. Cuatro cambios de vuelta se detectan por el espejo y actualizan el negocio en GlobalLink. Todo cabe en las cuatro tablas ya autorizadas: Clientes, Contactos, Servicios y Propuestas.
2 · Qué detona qué

Cada momento del negocio, y lo que produce en TNI

Cada detonante deja un aviso en la cola de salida. El programa de escritura lo toma, elige la base por la oficina y escribe. Si falla, reintenta; si se repite, no duplica.

Momento en GlobalLinkAviso en la colaQué se escribe en TNIQué vuelve
El negocio queda con dueño
Rocket o vendedor, en la misma transacción del alta
prospecto_creadonuevoAlta en dbo.Clientes con estado 4 y todos los campos del cruce de idaIdClienteapp.leads.id_cliente_creado
Primer contacto
el negocio pasa a «contactado»
contactadonuevoRenglón en dbo.Contactos: fecha, hora, vendedor, canalIdContacto, sólo para auditoría
Cita agendada
por el bot o a mano
lead_potencialya existeRenglón en dbo.Contactos con la fecha programada de la visitaIdContacto
Propuesta enviada
el negocio pasa a «negociación»
propuesta_enviadanuevoRenglón en dbo.Contactos con el montoIdContacto
Ganadocierre_ganadoya existeAlta en dbo.Servicios, alta en dbo.Propuestas, renglón en dbo.Contactos. La ficha sigue en estado 4.IdServicio, IdPropuesta. Cuando TNI factura, el estado 1 vuelve por el espejo y cierra el ciclo.
Perdido
con motivo
perdidonuevoRenglón en dbo.Contactos con el motivoNada. TNI decide si da de baja la ficha.
Reactivado
de perdido vuelve a nuevo
reactivadonuevoRenglón en dbo.Contactos. No se crea otra ficha: se reutiliza el IdCliente guardado.Nada
Un aviso por hito, nunca dos. Cada tipo de aviso lleva un índice único por negocio en la cola: agendar, cancelar y volver a agendar no produce dos renglones de «cita». Los avisos se procesan en orden de creación, así que el alta siempre llega antes que el primer renglón de bitácora.
3 · Cruce de ida

Campo por campo, de GlobalLink a TNI

Nombres reales de las dos bases. Las columnas de TNI son las que el proceso nocturno lee todas las noches, verificadas contra sus tres bases el 30 de julio.

va existe de los dos lados arreglar el código lo escribe mal hoy crear acá Catalizadora crear allá TNI
En GlobalLinkTransformaciónEn TNIEstado
Alta del prospecto → dbo.Clientes · una fila por negocio
app.leads.prospecto_nombretexto · nombre de la empresaSe recorta a 100 caracteresdbo.Clientes.Clientenvarchar(100) · obligatoriova
app.leads.id_oficinaentero · lleva la base adentroBase = id ÷ 1.000.000.000 (0 Truly · 1 TrulyNew · 2 TrulyRuso). IdOficina = restodbo.Clientes.IdOficinaint · obligatorio · en la base que correspondava
constanteel programa la poneSiempre 4dbo.Clientes.IdStatusClienteint · 4 = Potencialcrear acá confirmar
app.leads.assigned_rep_user_iduuid · el dueño del negociopublic.users.id_empleado_tni (columna nueva). Si no hay puente, va vacío y se avisadbo.Clientes.IdVendedorint → dbo.Empleadoscrear acá
app.companias.industriatextoTal cualdbo.Clientes.Rubronvarcharva
app.companias.direcciontextoTal cualdbo.Clientes.Direccionnvarcharva
app.leads.ciudadtexto · del enriquecimientoTal cual, si existedbo.Clientes.Localidadnvarcharva
app.companias.telefonotextoFormato local del país de la oficina, sin el prefijo internacional, como guarda TNIdbo.Clientes.Telefononvarcharva
app.contactos.moviltexto · el móvil de la personaMisma regla de formatodbo.Clientes.Movilnvarcharva
app.companias.emailtextoTal cualdbo.Clientes.Emailnvarcharva
app.companias.sitio_webtextoTal cualdbo.Clientes.Webnvarcharva
enriquecimiento del padrónNIT, RFC, RUT, CUITSólo si el registro oficial del país lo trajo. Nunca un provisionaldbo.Clientes.Identidadnvarcharva
app.contactos.nombretexto · la persona que decideTal cualdbo.Clientes.ContactoVentasnvarcharva
app.contactos.emailTal cualdbo.Clientes.ContactoVentasEmailnvarcharva
app.contactos.telefono_e164Formato localdbo.Clientes.ContactoVentasTelefononvarchar · el código dice «…Tel» y no existearreglar
app.leads.fecha_creacionfecha y hora con zonaFecha local de la oficina, sin hora. Hoy el código usa la fecha de cierredbo.Clientes.FechaAltadatetimearreglar
app.leads.id_lead · origen · metodouuid + dos textosGLOBALLINK:<id_lead> · origen=… · metodo=…dbo.Clientes.Observacionesntext · la marca de trazabilidadva
app.writeback_outbox.id_outboxuuid del avisoTal cualdbo.Clientes.idempotency_keyuniqueidentifier · columna nueva con índice únicocrear allá
Cada hito → dbo.Contactos · un renglón por aviso
app.leads.id_cliente_creadoel número que devolvió TNIResto de la división por basedbo.Contactos.IdClienteint · obligatoriocrear acá
app.leads.id_oficinaMisma regla de basedbo.Contactos.IdOficinaintva
app.leads.assigned_rep_user_idPor el puente de empleadodbo.Contactos.IdVendedorintcrear acá
fecha del hitostage_entered_at · occurred_atFecha y hora local de la oficina, separadasdbo.Contactos.FechaContacto · HoraContactodatetime · datetimecrear acá
app.lead_appointments.scheduled_atsólo en la citaFecha y hora localdbo.Contactos.FechaProgramada · HoraIniciodatetimecrear acá
tipo de aviso + detallecanal · monto · motivoGLOBALLINK:<id_lead>:<hito> · detalledbo.Contactos.Observacionesntext · con la marca, para no leerlo de vueltacrear acá
app.writeback_outbox.id_outboxTal cualdbo.Contactos.idempotency_keycolumna nuevacrear allá
Ganado → dbo.Servicios y dbo.Propuestas · ya construido
app.leads.id_cliente_creadoResto de la división por basedbo.Servicios.IdClienteintva
app.leads.fecha_cierreFecha localdbo.Servicios.FechaAlta · dbo.Propuestas.FechaPropuestadatetimeva
IdServicio devueltoTal cualdbo.Propuestas.IdServicioint · Propuestas no tiene IdClienteva
Lo que no se escribe. CodigoCliente lo numera la oficina. IdTipoCliente es el canal de venta de TNI, con tres valores, y queda vacío hasta que TNI diga cuál corresponde. ContactoAdmin y ContactoTecnico son otros roles; el prospecto sólo trae el de ventas. El país no existe como columna: va implícito en la oficina y en la base.
4 · Cruce de vuelta

Lo que TNI cambia, y cómo llega a GlobalLink

El espejo nocturno ya copia la ficha de clientes y la bitácora de contactos de TNI, y desde el 5 de agosto trae sólo las filas que cambiaron, usando la marca que pone el motor de SQL Server en cada modificación. Lo que falta es el paso siguiente: comparar lo que llegó contra los negocios de GlobalLink y aplicar el cambio.

Cambió en TNILlega por el espejo aEfecto en GlobalLinkEstado
La llave que une los dos lados
dbo.Clientes.IdClientelo asignó TNI al crearsilver.clientes.id_clientecon la base sumadaSe busca el negocio por app.leads.id_cliente_creado. Sin esa columna escrita no hay vuelta posiblecrear acá
La ficha del cliente
dbo.Clientes.IdStatusCliente4 → 1 · TNI lo activósilver.clientes.id_status_clienteEl negocio pasa a ganado si no lo estaba, y luego a sincronizado. Fecha de cierre: la de TNIcrear acá
dbo.Clientes.IdStatusCliente→ 3 · o FechaBaja con valorsilver.clientes.id_status_cliente · fecha_bajaEl negocio pasa a perdido con motivo «dado de baja en TNI»crear acá
dbo.Clientes.IdStatusCliente→ 2 · inactivosilver.clientes.id_status_clienteSólo se anota en la línea de tiempo. Un prospecto no se vuelve inactivo: si TNI lo marca así, alguien lo revisacrear acá
dbo.Clientes.IdVendedorcambiósilver.clientes.id_vendedorSe reasigna el dueño del negocio por el puente de empleado. Si el empleado no tiene usuario en GlobalLink, se avisa al gerente de la oficinacrear acá
dbo.Clientes.Telefono · Movil · Email · Direccioncambiaronsilver.clientes.telefono · movil · email · direccionSe actualizan la empresa y el contacto en GlobalLink. TNI manda sobre los datos del cliente una vez creadocrear acá
dbo.Clientes.ContactoVentas · Email · Telefonocambiaronsilver.clientes.contacto_ventas · _email · _telSe actualiza la persona de contacto del negociocrear acá
La bitácora de contactos
dbo.Contactosrenglón nuevo para ese IdCliente, sin la marca GLOBALLINKsilver.contactoshoy trae 5 columnas; hay que sumar IdVendedor, IdMotivoContacto, HoraContacto, VentaDirectaEntra a la línea de tiempo como «visita o llamada registrada en TNI por …». Si el negocio estaba en «nuevo», pasa a «contactado»crear acá
dbo.Contactosrenglón con la marca GLOBALLINKsilver.contactosSe ignora: lo escribimos nosotros. Sin esta regla, cada hito volvería como si TNI lo hubiera anotadocrear acá
Servicios
dbo.Serviciosservicio nuevo para ese IdCliente que no creamos nosotrossilver.serviciosEs la prueba de que se contrató por fuera de GlobalLink: el negocio pasa a ganado con la fecha del serviciocrear acá
Cuándo. El espejo corre a las 04:00 UTC, las 22:00 de Guatemala. El cambio hecho en TNI durante el día se ve en GlobalLink a la mañana siguiente. El mismo mecanismo puede correr cada hora sin costo, porque trae sólo lo que cambió: unas 550 filas de clientes por día en toda la red.
5 · Cómo se inscribe

Las dos sentencias que escribe el programa

Sólo altas, con parámetros, en la base que corresponde a la oficina. El envoltorio de conexión rechaza cualquier otra instrucción antes de abrir la conexión.

-- 1 · el alta del prospecto · una sola vez por negocio
INSERT INTO dbo.Clientes
  ([Cliente], [IdOficina], [IdStatusCliente], [IdVendedor],
   [Rubro], [Direccion], [Localidad], [Telefono], [Movil], [Email], [Web], [Identidad],
   [ContactoVentas], [ContactoVentasEmail], [ContactoVentasTelefono],
   [FechaAlta], [Observaciones], [idempotency_key])
OUTPUT INSERTED.IdCliente
VALUES
  (@nombre, @id_oficina, 4, @id_vendedor,
   @rubro, @direccion, @localidad, @telefono, @movil, @email, @web, @identidad,
   @contacto_nombre, @contacto_email, @contacto_telefono,
   @fecha_alta, 'GLOBALLINK:' + @id_lead + ' · origen=' + @origen + ' · metodo=' + @metodo, @id_aviso);

-- 2 · cada hito · un renglón en la bitácora
INSERT INTO dbo.Contactos
  ([IdCliente], [IdOficina], [IdVendedor], [FechaContacto], [HoraContacto],
   [FechaProgramada], [HoraInicio], [Observaciones], [idempotency_key])
OUTPUT INSERTED.IdContacto
VALUES
  (@id_cliente, @id_oficina, @id_vendedor, @fecha, @hora,
   @fecha_cita, @hora_cita, 'GLOBALLINK:' + @id_lead + ':' + @hito + ' · ' + @detalle, @id_aviso);
Antes de escribir
Se pregunta si ya existe

Primero por la marca GLOBALLINK en observaciones. Después por teléfono exacto o nombre normalizado contra la cartera de esa oficina en el espejo, con el mismo criterio que ya usa GlobalLink para rotular «ya es cliente». Si existe, se enlaza el número y no se crea.

Si se repite
No duplica

El aviso lleva su propio identificador. Con la clave única que agrega TNI, el motor rechaza el segundo intento. Mientras no exista, la marca en observaciones cumple la misma función.

Si falla
Reintenta y avisa

Cinco reintentos con espera creciente. Un fallo por dato inválido no se reintenta: queda marcado y visible. Cada intento, con su resultado, se guarda en la bitácora de escritura.

Velocidad
Diez altas por minuto por tabla

En horario laboral de la oficina; treinta fuera de horario. Tope mensual acordado: cinco mil clientes, doce mil renglones de bitácora.

6 · Quién manda

Cuando los dos lados cambian lo mismo

Regla 1
TNI manda sobre el cliente

Estado de la ficha, vendedor asignado, teléfono, correo, dirección. Lo que TNI cambie ahí se adopta en GlobalLink y queda anotado como cambio hecho en TNI.

Regla 2
GlobalLink manda sobre la conversación

Contactado, cita, negociación: esas etapas no existen en TNI. Se registran allá como renglones de bitácora, pero se deciden acá.

Regla 3
Activar es de TNI, cerrar es de los dos

Un negocio se cierra como ganado en GlobalLink cuando el vendedor lo cierra o cuando TNI activa la ficha, lo que pase primero. Sólo TNI pasa la ficha de Potencial a Activo.

Regla 4
Nunca una modificación desde acá

GlobalLink sólo agrega filas en TNI. Si algo tiene que cambiar en una ficha ya creada, lo cambia TNI y vuelve por el espejo.

7 · El acceso

Entrar a GlobalLink desde el sistema de gestión, sin escribir contraseña

La persona ya se identificó en el sistema de gestión. Al hacer clic, ese sistema emite un pase firmado que dura cinco minutos y sirve una vez; GlobalLink lo verifica y abre la sesión con el país, la oficina y el rol de esa persona. Ninguna contraseña viaja.

👤 PABLO ESTRADA | TNI | 🔒 Close | [TRULY]
TNI Management System
Home
Reports ▾
Truly Nolen GlobalLink ↗
TNI Management System > Sales > Services > List
Country / Office
Customer
Sales Person

Reconstrucción de su pantalla. La pestaña nueva conserva el aspecto del sistema; la flecha avisa que abre otra aplicación.

TN GlobalLinkGuatemala · Oficina 679 Pablo Estrada
InicioProspectarTruly RocketNegociosConversacionesInformes
Entró desde el sistema de gestión. Sin usuario ni contraseña: la sesión es la de Guatemala, oficina 679.
Prospectos
1.087
En Rocket
124
Citas
18
Ganados
7

Cifras de ejemplo.

Dato del paseDe dónde lo saca TNIPara qué lo usa GlobalLink
subidentificador estable de la personaSu tabla de usuarios: usuario_inter.id_usuarioEncontrar o crear la cuenta: public.users.external_sub
email · nameLa misma tablaMostrar quién es y avisarle por correo
countrydos letrasEl país del usuarioEl alcance: qué datos puede ver
franchise_idla oficinaLa oficina del usuarioLa oficina de sus negocios y su Rocket
roleSu perfil, traducido a nuestros siete rolesQué puede hacer: ver, crear, asignar
exp · jtivence en 5 min · únicoLos genera el emisorRechazar pases viejos o repetidos
8 · El reparto

Quién hace qué

El programa que escribe en TNI y el que lee lo que vuelve los construye y los opera Catalizadora. TNI provee accesos, dos columnas y dos confirmaciones.

Catalizadora

  1. Corregir el nombre de columna del mapeoY una prueba que compare contra las columnas reales, no sólo contra las inventadas.
  2. Los cinco avisos nuevos en la colaProspecto creado, contactado, propuesta enviada, perdido, reactivado. Cita y ganado ya existen.
  3. El mapeo de alta y el de bitácoraEstado 4, fecha de creación, todos los campos del cruce de ida, la marca en observaciones.
  4. El puente vendedor → empleadoColumna nueva en usuarios, relleno por correo contra los empleados de la oficina, informe de los que no casen.
  5. La consulta de duplicados antes de escribirCon el criterio que ya rotula «ya es cliente».
  6. Guardar el número de cliente que devuelve TNIEn la columna del negocio que ya existe.
  7. El paso de vuelta después del espejoComparar ficha y bitácora contra los negocios y aplicar los cambios de la sección 4. Ampliar la copia de la bitácora con las cuatro columnas que faltan.
  8. Operar el programa de escrituraTopes, reintentos, auditoría de cada intento, alerta si la cola se atasca.
  9. El punto de entrada del accesoMás el logo y el fragmento de la pestaña, listos para pegar.

Truly Nolen International

  1. Depositar el documento de autorización firmadoEs el interruptor técnico del programa de escritura.
  2. Crear el usuario de escrituraSólo altas, sólo en las cuatro tablas, sólo desde nuestro servidor.
  3. Habilitar el acceso de red a ese usuarioDesde una única dirección, entregada por canal privado.
  4. Confirmar que 4 es el estado de prospectoY decir qué tipo de cliente corresponde a un prospecto de Rocket y a uno de vendedor.
  5. Agregar la columna anti-duplicadosidempotency_key con índice único en Clientes y Contactos. No afecta datos existentes.
  6. La pestaña en su sistemaCon el logo y el fragmento que entregamos.
  7. El emisor del pase y su llave públicaPara que GlobalLink verifique quién entra.
  8. La equivalencia de perfilesQué perfil de su sistema corresponde a cada rol de GlobalLink.
Bloque 1
Corrección del mapeo y los cinco avisosLos negocios empiezan a encolarse, sin salir todavía hacia TNI.
no depende de TNI
Bloque 2
Mapeo de alta completo, puente de vendedor y duplicadosVerificable en modo sombra, contra el espejo.
confirmación del estado
Bloque 3
El paso de vueltaLo que TNI cambie se aplica en GlobalLink cada noche.
no depende de TNI
Bloque 4
Primera escritura realDocumento en el servidor, usuario, red. Se enciende de a un paso.
accesos de TNI
En paralelo
Acceso desde su sistemaSe prueba contra nuestro emisor de laboratorio; con su llave pública sólo cambia una dirección.
llave y pestaña
9 · Detalles

Para quien quiera el fundamento

Por qué la ficha de clientes y no el embudo interno de TNI

TNI tiene una tabla de seguimiento comercial con 169.150 registros, con tareas agendadas por empleado y presupuestos. Encaja conceptualmente con un prospecto, y no es el camino por tres razones: el permiso de escritura acordado no la incluye; no está copiada en el espejo, así que no podríamos verificar lo escrito ni leer lo que vuelve; y tiene un circuito de aprobación propio dentro de su sistema. La ficha en estado Potencial da el mismo resultado con lo que ya está acordado, y la vuelta funciona porque esa tabla sí está en el espejo.

El nombre de columna mal escrito, y por qué ningún control lo ve

El mapeo de escritura usa ContactoVentasTel; la columna se llama ContactoVentasTelefono. El control que compara nombres contra el catálogo real sólo recorre la carpeta de la copia nocturna, y la prueba del mapeo de escritura sólo comprueba que no aparezcan columnas inventadas. Por eso hoy pasa en verde y la primera escritura real fallaría. Son tres literales en dos archivos.

Cómo se detecta lo que cambió en TNI

SQL Server pone en cada fila una marca de versión que el motor mueve en cada alta y en cada modificación, sin que la aplicación participe. Se midió comparando dos fotos completas con tres días de diferencia: la marca capturó el 100 % de los cambios reales en clientes, contactos, servicios y órdenes. La fecha de modificación que escribe la aplicación, en cambio, no se movió en el 100 % de los cambios de contactos. Por eso el espejo usa la marca del motor. Lo único que la marca no ve son los borrados; una vez por semana una foto completa reconcilia.

Base, oficina y país

TNI opera tres bases productivas y los números de oficina y de cliente se repiten entre ellas. GlobalLink guarda la base adentro del número de oficina y el programa la deshace antes de escribir; el mismo desplazamiento se aplica al leer. El país no viaja: se deduce de la oficina. La cuarta base del servidor es su copia de pruebas y está bloqueada por código.

El acceso, en detalle

El diseño está acordado por escrito entre los equipos técnicos desde el 5 de mayo de 2026: pase firmado con la llave privada de TNI, cinco minutos de vida, un solo uso, verificado por GlobalLink contra la llave pública, con rechazo de pases repetidos y comprobación de que el país y la oficina estén activos. Falta construirlo de los dos lados; hay un emisor de laboratorio para avanzar sin esperar. Si su plataforma no puede publicar una llave pública, la variante con secreto compartido cambia una línea de configuración de cada lado y nada más.

De dónde sale cada dato de este documento

Verificación de acceso al sistema de gestión del 24 de julio; mapeo medido contra las tres bases el 30 de julio; censo de tablas del 27 de julio; medición de la cola del 16 de agosto; medición de la marca de motor del 5 de agosto; acta del 10 de agosto; acuerdo de entrega del 7 de agosto; especificación del pase del 5 de mayo; respuesta escrita de TNI del 31 de julio. Todo el estudio se hizo en lectura.