Usá o Espacio

Un poco de contexto

Soy Marcos Barrientos, el CTO de Incontacto (in-contacto.com), una eventech con presencia directa en 9 países, Colombia, Guatemala, Costa Rica, República Dominicana, Panamá, Ecuador, Perú, Estados Unidos y España y un portafolio de más de 60 servicios: registro, credenciales, control de acceso con reconocimiento facial, plataformas virtuales, votaciones y, de forma transversal, comunicación y mailings .

Detrás de la operación hay más de 20 empleados directos y más de 200 indirectos en 9 países, por lo cual el volumen de requerimiento diario operativo es muy alto.

Marcos Barrientos

Tickets Incontacto

Es una plataforma de tickets interna para la mesa de ayuda. Centraliza todo el flujo de requerimientos internos en un único lugar con roles claros, ciclo de vida del ticket, trazabilidad y estadísticas que generan mas valor.

La construí para reemplazar una herramienta cerrada y rígida que utilizamos actualmente, y para resolver dolores concretos del día a día.

El punto de partida

Una plataforma cerrada que no se acomodaba totalmente a nuestras necesidades

Hasta hoy trabajamos con una plataforma rígida, que no nos suministra mucha información y es muy limitada en sus funciones para lo que necesitamos en el día a día. Se queda corta para atender la operación real de la empresa:

  • Todos los tickets son idénticos: Con un campo para el título y otro para la descripción, sin campos específicos por tipo de ticket. Un soporte técnico, un trámite administrativo o un envío de email solicita la misma información, que en ocasiones no nos generan todo el contexto necesario y hay que interactuar por chat para aclarar el requerimiento.
  • Estadísticas muy limitadas: La plataforma actual sí trae estadísticas pero no como las necesitamos, no permiten ver el volumen ni la carga desglosada por sede, categoría o agente.
  • Trazabilidad y roles limitados: Existe trazabilidad y los roles son claros, pero no con el nivel de detalle que necesitamos para auditar y controlar la operación como queremos.

La motivación

Construir una plataforma propia que entienda nuestra operación en lugar de obligarnos a adaptarla a la herramienta, que se adapte al tipo de solicitud (campos personalizados), que nos dé visibilidad real (estadísticas por rol y sede) y que resuelva dolores concretos como el flujo del ticket o los comentarios en el mismo. La idea es que mejore notablemente la velocidad y el proceso con los que hoy se atienden los requerimientos internos.

Parte 1

Por donde comencé

Tenía que entender que lo primero que había que cambiar era el ciclo de vida de un ticket, ya que en la herramienta actual, el ticket se crea, se asigna y se cierra, pero ese flujo no siempre es así, en la empresa nos pasa mucho que un agente no lo puede atender luego de estar asignado, o en ocasiones se tiene que reabrir el ticket porque el solicitante pide nuevos cambios sobre el mismo y no queremos perder todo el contexto que llevamos creando uno nuevo.

Pero no solo era definir un flujo que se acomode a nuestras necesidades actuales. También nos faltaba que cada ticket pudiera tener adjuntos e imágenes para dar más contexto al agente, comentarios públicos y privados para separar lo que ve quien abrió el ticket de lo interno del equipo, texto enriquecido (negrilla, subrayados, URLs y más) para darle más valor y contexto a la descripción, y un historial de estados siempre presente en el ticket para no perder la trazabilidad de nada de lo que va pasando.

Ciclo de vida del ticket

Como es el flujo en la aplicación

Cada ticket recorre un flujo bien definido, con transiciones automáticas de acuerdo a las necesidades actuales. Nadie tiene que acordarse de cambiar el estado a mano, el sistema lo hace solo según lo que va pasando. Si quien abrió el ticket comenta sobre uno que ya estaba resuelto porque necesita un ajuste, el ticket vuelve a abrirse sin perder nada del contexto acumulado. Así el flujo se acomoda a la realidad de la operación, donde un agente a veces no puede atender un ticket ya asignado y quiere liberarlo para otro agente; o el solicitante pide cambios sobre algo que se dio por cerrado.

Pendiente
Asignado
Resuelto
Reabierto
Evaluado

Reapertura automática

Si quien abrió el ticket comenta sobre uno resuelto porque necesita un ajuste, se reabre automáticamente.

Liberar ticket

Si un agente ve que no puede atender un ticket que tiene asignado, lo puede liberar para que vuelva a la cola y otro agente se lo asigne.

Evaluación del ticket

Cuando el agente resuelve el ticket, le llega automáticamente la evaluación al solicitante, así cada ticket resuelto se evalúa y se mide la calidad de la atención.

Qué no teníamos

Funciones del día a día que no teníamos en el flujo normal

Comentarios públicos y privados

Comentarios visibles para quien abrió el ticket y comentarios internos reservados al equipo de agentes, para separar lo que se comunica del trabajo interno.

Adjuntos por ticket

Cada ticket puede llevar archivos adjuntos para que el agente tenga todo lo necesario para diagnosticar desde el primer momento.

Historial siempre en el ticket

El historial de estados queda registrado y siempre visible dentro del ticket, así no se pierde la trazabilidad de nada de lo que va pasando.

Notificaciones con etiquetas

Emails personalizables ante cada evento del sistema.

Texto enriquecido

La descripción del ticket soporta negrillas, subrayados, URLs y más, para que sea más clara y lleve más información desde el primer momento.

Contador de tiempo

Cada ticket muestra cuánto lleva en su estado actual, sea sin atender o en atención, para que el agente vea la urgencia real en todo momento.

Dashboards de estadísticas por rol y por sede

Administrador, agente y solicitante ven solo lo que les corresponde, con gráficos de creados vs. resueltos y distribución por categoría, prioridad y sede. El agrupamiento por sede es clave para una empresa que opera en 9 países: permite ver, de un vistazo, cuál es la sede que más demanda genera y cómo se reparte la carga entre regiones. Esa visibilidad global es uno de los argumentos más fuertes para tener una plataforma propia: la decisión se toma sobre datos vivos del sistema, no sobre una planilla de Excel.

Parte 2

Ir un poco más allá

Más allá de cubrir lo básico, aproveché para mejorar, optimizar y crear cosas que hicieran la operación más ágil y, sobre todo, que el día a día del equipo fuera más llevadero y gratificante. Estas son algunas de las decisiones que tomé con ese objetivo.

Novedad 1

Campos con formato, por tipo de ticket

Ya sabíamos que necesitábamos campos diferentes según el tipo de ticket. Aprovechando eso, también definí qué tipo de campo era cada uno (numérico, texto, selección, fecha) para que la información tuviera formato y no llegara como texto libre, y que se pudiera marcar cada campo como obligatorio o no según conviniera.

Además, cada tipo de ticket se puede marcar con un color, para que el agente lo identifique a simple vista en la cola sin tener que leer el título.

Así cada tipo de ticket captura exactamente lo que necesita, con el formato correcto, desde el momento en que se crea.

Soporte técnico del sistema

Sección del software · Navegador · Error que sale

Administrativo

Tipo de ayuda · Aplicación donde se requiere · Sistema operativo

Envío de email

Nombre del remitente · Correo del remitente · Asunto

Novedad 2 · La solución a nuestra "piedra en el zapato"

Tickets de envío de email con plantillas + IA

Para nosotros, el envío de comunicaciones y mailings es parte central de lo que hacemos. Pero los tickets de email eran un problema crónico: la persona que crea el ticket no tiene claro cómo quiere que se envíe el email, o el cliente final nunca le especificó el formato, los colores, el orden de los contenidos.

El agente terminaba improvisando el HTML a mano, o iterando por chat con el solicitante.

El flujo, paso a paso

De la plantilla al email listo, sin saber HTML

Categorías orientadas a email

Se marca una categoría para indicar que sus tickets generan envíos de email. La aplicación, automáticamente activa un botón para interactuar con todo el tema de plantilas de email.

Repositorio de plantillas

El administrador puede tener un repositorio de plantillas que puede generar como base para que los agentes las usen e iteren sobre ellas. Pero si el agente o el solicitante tiene una, o le mandaron algo, o quiere hacerla desde cero, también tiene la posibilidad de hacerlo.

Iteración con IA en lenguaje natural

Los cambios se solicitan a un agente de IA, sin necesidad de saber HTML ni CSS. Cada usuario cuenta con hasta 5 iteraciones por ticket para refinar el resultado. Tanto agente como solicitante pueden utilizar la función

No es solo usar IA

Construida para ser segura y controlable

Aunque esta funcionalidad se va a utilizar al interior de la empresa por usuarios que únicamente el administrador cree, siempre hay que pensar en la seguridad y en hacerlo con buenas prácticas, por eso tuve en cuenta:

Agente acotado a su tarea

Solo modifica HTML de plantillas de correo y rechaza cualquier instrucción que se desvíe del tema.

Anti manipulación

La entrada del usuario se delimita y aísla para mitigar intentos de manipular el comportamiento del agente.

Auditoría completa

Cada interacción queda registrada, visible por el administrador.

Concurrencia segura

Si dos personas editan el mismo email, el sistema avisa quién y cuándo lo modificó para que no se pierda el HTML construido.

Novedad 3

Plantillas de email totalmente editables

Lo que empezó como una necesidad lo convertí en una novedad: todas las plantillas son editables por el administrador, trabajan con todos los campos del sistema y se manejan sin tocar una línea de código.

Cualquier campo del sistema

Cada plantilla puede usar cualquier campo del sistema como etiqueta que el sistema reemplaza automáticamente al enviar el correo.

{{cliente_nombre}} {{ticket_numero}} {{agente_nombre}} {{enlace_evaluacion}}

Editables por el administrador

El administrador crea y edita cada plantilla: asunto, cuerpo, remitente, qué campos reemplazar. Todo desde un panel, sin pedirle nada a desarrollo.

Auditoría de envío

El envío se hace con SendGrid y de cada correo se guarda el messageId, para poder rastrear y auditar qué llegó y qué no, en caso de que haga falta.

Así la comunicación que sale de la plataforma se mantiene y se ajusta sin pasar por código y cada mensaje llega con la información específica que se requiera.

Novedad 4

Pausas activas y competencia entre agentes

El trabajo de soporte en la empresa es intenso y el volúmen de tickets que reciben nuestros agentes a diario es muy alto. Por eso la decidí incluír un espacio pensado para que los agentes hagan pausas activas y compitan entre ellos de forma sana, con un ranking que los motiva a despejarse y volver al trabajo mas animados.

Porque la idea: hacer el día a día del agente más agradable, premiando el descanso activo y generando mas interacción y conexiones entre el equipo de agentes.

No solo jugable

Si bien lo mas importante es que los juegos pudieran ser jugables fácil,emte, los agentes de la empresa son personas con un perfil técnico muy alto. Conociendo esa capacidad, fue necesario construir el sistema de forma que no se pudiera alterar el resultado de los juegos, no por desconfianza, sino porque para un equipo así sería trivial manipular un marcador sin seguridad.

El puntaje, el momento del juego y el jugador viajan firmados para que el servidor verifique que el resultado fue genuino. Así el ranking refleja de verdad quién jugó mejor. Un respeto por la inteligencia de nuestros agentes.

Novedad 5

Notas personales

Cualquier usuario, sin importar su rol, tiene un espacio propio de notas personales dentro de la plataforma. Es un lugar para hacer anotaciones, llevar bitácoras y guardar esas cosas que uno necesita tener a la mano en cualquier momento.

Favoritos

Las notas se pueden marcar como favoritas, así las más importantes quedan siempre en una sección aparte.

Bitácoras y apuntes

Ideal para registrar cómo se resolvió cierto tipo de ticket, atajos, comandos o cualquier conocimiento que uno no quiere perder.

Para cada uno

Cada usuario tiene sus propias notas, privadas. No se comparten ni se mezclan con las del resto del equipo.

Por ejemplo, cuando un agente descubre cómo resolver un tipo de ticket complicado, lo anota ahí y la próxima vez que le pase algo del estilo ya sabe que en las notas tiene como se resuelve.

Novedad 6

Magic links para acceso y evaluación

Acceso sin contraseña

Para ser mas efectiva la plataforma, aunque existe el ingreso con las credenciales, pense que en ocasiones los agentes sobre todo manejan el acceso a múltiples plataformas y no siempre tienen en la cabeza el usuario y clave de esta plataforma, adicional que tanto agentes, como comerciales, como cualquier rol de la empresa van de un evento a otro y se mueven en diferentes lugares. Por lo cual, cree una funcionalidad donde el administrador puede mandar tanto un link por correo o copiarlo y pegarlo en un chat de Whatsapp y con solo ingresar al link el usuuario queda logeado, con un único uso y con expiración rápida.

Evaluación sin iniciar sesión

Al igual que el link de acceso único, tanto el sistema a la hora de resolver el ticket como el administrador, pueden enviar un correo con un link único de calificación de la atención del ticket al solicitante, sin necesidad de iniciar sesión, esto con el fin de reducir la fricción para asegurar la evaluación.

Novedad 7

Control de sesiones por dispositivo

Los usuarios de la empresa se mueven entre eventos y varios lugares, y es fácil que dejen una sesión abierta o pierdan un equipo. Para cubrir eso, el administrador puede ver todas las sesiones activas de cada usuario con su IP, dispositivo, navegador y sistema operativo, y cerrar la sesión de un dispositivo en específico de inmediato.

Si alguien dejó la cuenta abierta en un computador que ya no tiene a mano, le avisa al administrador y este la cierra en segundos, sin tocar al usuario.

Visibilidad completa

De cada sesión se ve la IP, el dispositivo, el navegador y el sistema operativo, además de cuándo y desde dónde se inició.

Revocación inmediata

El administrador cierra la sesión del dispositivo que haga falta y el cambio se aplica al instante, sin esperar a que caduque por tiempo.

Novedad 8

Suscripción a tickets, con avisos en tiempo real

Desarrollé que el solicitante pueda suscribirse a un ticket y recibir notificaciones por email en tiempo real cada vez que cambia de estado. Esto no es para todos los tickets: cada solicitante decide a cuáles se suscribe y a cuáles no.

El solicitante decide

No es global ni obligatorio: cada usuario elige ticket por ticket cuál quiere seguir y cuál no.

Avisos por cambio de estado

Cada vez que el ticket cambia de estado, los suscriptores reciben un email de inmediato, sin esperar a entrar al sistema.

Novedad 9

Noticias de la empresa

El administrador puede publicar noticias y comunicados que se ven directamente en la página de inicio de la plataforma, visibles para todos los usuarios del sistema.

Así, en lugar de depender de canales externos, la empresa se entera de novedades, políticas y cambios importantes por medio de la plataforma

Comunicación centralizada

Novedades, políticas internas, mantenimiento programado, recordatorios: todo lo publica el administrador desde un panel y queda visible para todos sin mover a la gente a otra herramienta.

Parte 3

La parte técnica

Como se hizo

Arquitectura y pruebas

Arquitectura limpia en capas

Dominio → Aplicación → Interfaces → Infraestructura. Las dependencias siempre apuntan hacia adentro y el núcleo de negocio no depende de ningún framework. Un único punto de ensamblado con inyección por constructor.

Desarrollo guiado por pruebas (TDD)

Dos niveles de test: unitarios (mockeando el repositorio) e integración (contra base de datos real, en transacción reversible).

Stack tecnológico

Tecnologías, separadas por capa

Frontend

React 19 Typescript Tailwind CSS v4

SPA moderna con rutas lazy-loaded, diseño responsivo y componentes tipados estrictamente.

Backend

Node.js Express 5 TypeScript

API REST en arquitectura limpia, con acceso a datos por ORM.

Base de datos: PostgreSQL

La decisión fue por velocidad y agilidad. Además, Postgres permite usar campos tipo JSON, que son clave para guardar los campos personalizados de cada tipo de ticket sin tener que crear tablas nuevas cada vez.

Caché de sesiones en Redis

Las sesiones se guardan en Redis para agilizar la validación de cada petición y permitir expirar una sesión de forma inmediata cuando un usuario cierra sesión o un administrador la revoca.

Próximo paso: Enseñarle al sistema

La idea es que cada vez que un agente cierre un ticket, cuente cómo lo solucionó. Como esa solución suele ser larga, el agente la dicta por voz y una IA la transcribe y la deja en claro antes de guardar.

01

Dictado por voz

El agente cuenta la solución hablando; una IA la transcribe y la deja lista para guardar.

02

Doble guardado

En texto claro en la base de datos y como embedding en una base vectorial. La base de conocimiento crece con cada ticket.

03

Búsqueda al crear

Al poner un ticket, el sistema busca en segundo plano en la base de datos vectorial si ya existe una solución parecida.

04

Sugerencia al agente

Al asignarse el ticket, el agente ve: "otro agente ya resolvió algo parecido y fue así…", con el detalle.

Que cada solución se acumule y quede disponible para todos, para agilizar procesos y soluciones y que el conocimiento del equipo nunca se pierda.

Gracias por todo el aprendizaje de estos meses

Brais quiero agradecer por el máster, su excelente orientación y calidad del contenido. Gracias a lo que aprendí, hoy en Incontacto podemos llevar la operación de la empresa a un nivel más alto: hacer seguimiento real de las solicitudas, medir, mejorar de forma continua y tener una plataforma que crezca con la empresa.

Tickets Incontacto no es un punto de llegada, es el punto de partida para seguir optimizando cómo trabajamos.