Volver a proyectos
Gráfico de Mapper: la meta antes de producción era 87 % de empresas bien; en una muestra chica de 15, llegó a 93 % (14 de 15). En la que falló, un dominio en venta pasó como su web.
Revisión a mano de 15 empresas del directorio, con la meta fijada antes de su primera ejecución en producción.

Mapper

Un agente que espera a una persona antes de investigar

Tres herramientas comerciales para una firma de datos e IA. Los modelos investigan y redactan; ninguno puntúa prospectos ni le escribe a nadie.


La firma y mi papel

Trabajo en una firma que vende análisis de datos, automatización e IA a pymes y medianas empresas en Colombia, y me encargo de su ingeniería. Lo más lento de su proceso comercial era encontrar empresas con las que valiera la pena hablar, preparar la primera reunión y escribir la propuesta después.

El agente de prospección que construí contrasta cada empresa con el registro mercantil nacional y se detiene hasta que una persona confirma que es la correcta. Es una de tres piezas que construí para el proceso comercial de una firma de datos e IA, junto con un directorio de empresas y un flujo que convierte una oferta aprobada en propuesta. Las tres siguen una misma regla: los modelos investigan y redactan, las personas deciden, y nada llega a un prospecto sin que una persona lo envíe.

El informe de prospección

El informe que deja el agente trae solo hechos: ningún veredicto sobre si vale la pena el prospecto y ningún precio. Quien va a la reunión se forma su propio juicio con datos que puede rastrear hasta su fuente.

Cómo funciona

Una vez confirmada, la ficha de la empresa funciona como filtro: cualquier dato posterior que no coincida con su NIT, ciudad, web o perfiles se descarta. Tres ayudantes investigan en paralelo con un modelo más pequeño, uno para el negocio, otro para quien decide y otro para la competencia, y sus únicas herramientas son buscar y leer en la web. El agente principal revisa él mismo las bibliotecas de anuncios en un navegador, vuelve a verificar los datos clave y escribe un informe en una unidad compartida, más una tarea por área en el gestor del equipo, a través de MCP.

El directorio es un conjunto de flujos de n8n sobre una cola en PostgreSQL en Supabase. El flujo de propuestas solo empieza después de que el dueño aprueba la oferta. Genera un PDF para el cliente y otro interno, y corre controles automáticos sobre ambos. Un panel consultivo de revisores, todos modelos, puede señalar problemas, pero no bloquear ni aprobar; decide el dueño.

El directorio, a propósito sin modelo

La segunda pieza es un directorio de empresas colombianas con su ubicación y sus contactos. Parte del registro nacional, encuentra la web de cada empresa y la lee en busca de datos de contacto. Leer las webs subió del 74 % al 77,5 % las empresas con un correo de contacto que no es el de contabilidad.

La decisión más importante del directorio fue qué no construir. Una puntuación hecha por un modelo parecería precisa sin tener ningún dato sobre qué empresas terminan siendo clientes, y un mensaje automático hablaría por la firma sin que nadie lo hubiera revisado.

Una cola que aguanta una caída

El directorio toma el trabajo de su cola con FOR UPDATE SKIP LOCKED, así que dos ejecuciones nunca tienen la misma empresa a la vez. Cada empresa queda reservada 20 minutos y tiene 3 intentos: si un proceso se cae, sus empresas vuelven a la cola cuando vence la reserva, y repetir el trabajo no duplica filas porque las escrituras son idempotentes. Cada empresa tiene una sola fila, que se actualiza, y los contactos se guardan con ON CONFLICT sobre empresa, tipo y valor.

Producción puso a prueba la cola cuando el DNS falló durante tres minutos. Los procesos no podían llegar a la base, así que un lote hizo su trabajo y no lo pudo guardar. Como cada empresa queda reservada solo por un tiempo, la mayor parte volvió sola a la cola al vencer la reserva. Nueve empresas que ya iban por su tercer intento quedaron marcadas como fallidas, que es justo lo que quiero: un fallo visible en lugar de un reintento sin fin.

La lógica vive en módulos de JavaScript puro con sus propias pruebas, y un script los incrusta en las definiciones de los flujos, así que se prueba fuera de n8n. El esquema no está expuesto en la API pública, tiene Row Level Security, y n8n se conecta con su propio rol limitado. Respeta robots.txt y cuesta cero dólares al mes: solo usa fuentes y cuotas gratuitas. Los agentes corren como skills de Claude Code a propósito: una persona aprueba cada paso, y con tan pocas ejecuciones un servicio alojado añadiría superficie sin añadir control.

Lo que se rompió en producción

Una tienda en línea tenía 687 formularios en su portada. El parser volvía a limpiar la página en cada vuelta del bucle y, como cada coincidencia guardaba una referencia a su copia de la página, un lote llevó el proceso a 2 GB de memoria y lo tumbó. Cambié el parser para que limpie cada página una sola vez y lo volví a desplegar; esa página quedó como caso de prueba. La misma tienda ahora toma 97 ms con 256 MB de heap.

Los controles de la propuesta

Sobre cada borrador corren controles automáticos: ninguna palabra vetada, ningún resto del cliente anterior, frases cortas, todas las fuentes incrustadas y un archivo lo bastante liviano para abrirse en el celular. La versión interna no puede contener un solo precio.

Decisiones de diseño

  • La identidad antes que cualquier cosa costosa. Investigar la empresa equivocada es el peor fallo que puede tener el agente, y que una persona la confirme es el paso más barato, así que va primero.
  • Ningún modelo en el directorio. Encuentra empresas y contactos, y nada más: no puntúa prospectos, no redacta mensajes ni envía nada. El primer contacto con una empresa lo hace una persona, no un modelo.
  • Cada dato lleva su fuente, la fecha en que se vio y si se vio o se supuso. El agente nunca adivina una cantidad, una fecha o una cifra; cuando una página no se puede leer, el informe lo dice en lugar de rellenar el hueco.
  • Recoger lo mínimo, por ley. El informe vive en una unidad compartida, así que, según la ley colombiana de protección de datos, el agente guarda solo información profesional: nunca familia, dirección de casa, teléfono o correo personal, documentos de identidad, salud, política, religión ni fotos. Nunca contacta al prospecto ni llena formularios.
  • El modelo redacta las propuestas y nunca las envía. El dueño aprueba la oferta antes de construir nada, y el archivo final lo envía una persona.

Cómo lo comprobé

El directorio tuvo un umbral escrito antes de su primera ejecución en producción, y se comprobó a mano. Los agentes todavía no tienen un conjunto de evaluación formal: su calidad viene de controles estructurales sobre cada salida y de que una persona aprueba cada paso que sale de la empresa.

Medida Resultado
Umbral del directorio al menos 13 de 15 empresas correctas, fijado antes de la ejecución
Revisión manual 14 de 15 correctas, en 5 departamentos
Fallo encontrado una página de dominio en venta tomada como la web de la empresa
Después del arreglo nueva verificación de 91 de las 1.395 webs adivinadas: 3 rechazadas (3,3 %)
Empresas con web encontrada 10.380 (33,6 %)
Conjunto de evaluación formal para los agentes diseñado, aún sin correr (ver “Lo que sigue”)

Límites

La calidad del directorio se comprobó sobre una muestra pequeña, que alcanza para atrapar un error sistemático pero no para medir una tasa con precisión. Y como los agentes todavía no tienen un conjunto de evaluación, hoy no puedo decir con un número qué tan seguido acierta el informe.

Lo que sigue

Lo primero que voy a añadir es un conjunto de evaluación para el informe de prospección, hecho con los informes que el equipo ya usó: para cada dato, si era correcto y si importó en la reunión. Eso convierte “una persona lo revisa” en un número que puedo vigilar cuando cambie el prompt o el modelo.