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.
