Volver a proyectos

Director of Engineering & CISO · 2023 - now

Consentio

Me uní a un equipo de cinco personas sobre un stack MySQL heredado a finales de 2023, y sigo escribiendo código cada semana. Tres años después, la plataforma funciona sobre PostgreSQL detrás de un firewall que escribí, ha superado dos auditorías ISO de seguimiento y el equipo se ha duplicado.

consentio.co
pedidos, hasta más de 500k al año
2×
de los pedidos leídos de emails y PDF, 2023 → 2026
14% → ⅔
personas en el equipo
5 → 10
PR fusionadas al año, mías
~170

El problema

Consentio es una plataforma B2B de trading de productos frescos. Los proveedores publican ofertas, los compradores hacen pedidos y Magic Order, nuestro parser de IA, convierte los emails y PDF de pedido de los retailers en pedidos. Más de 1.500 proveedores han comerciado en ella, con retailers como Aldi, Carrefour, Kroger y Metro.

El producto es perecedero y los márgenes, ajustados. Había que seguir entregando producto mientras hacíamos una plataforma heredada lo bastante fiable y segura para grandes retailers y sus revisiones de seguridad.

Momentos clave

La noche del cambio

Pasar de MySQL a PostgreSQL no podía hacerse de golpe. Diseñé un entorno paralelo reimportado desde producción cada noche, escribí un runbook por entorno y ejecuté yo mismo la primera migración. El equipo escribió la mayor parte de los cambios de la aplicación; yo ordené el trabajo, retuve un merge para que dos releases arriesgadas no salieran juntas y después dirigí la noche del cambio en producción. Nueve meses, sin big bang, y el camino abierto hacia nuestros nuevos clústeres de Kubernetes.

Seis meses antes del primer bloqueo

Los grandes retailers se integran desde IP fijas, así que un firewall mal ajustado habría cortado a los clientes que más necesitábamos. Escribí el WAF de Cloud Armor y el rate limiting en Terraform, los activé primero en desarrollo y después los dejé en modo vista previa sobre seis meses de tráfico de producción, 24M de peticiones, reordenando las listas de permitidos de los partners antes de activarlos. Resultado: cero falsos positivos bloqueados. Por el camino enseñé Terraform a cada ingeniero de backend, para que los cambios de infraestructura ya no dependan de mí.

La peor caída de 2026

Una mañana de junio, en plena ventana de pedidos, la réplica de lectura se saturó y la plataforma cayó durante unos 80 minutos. Siguiendo la regla que di al equipo, primero reproducir y después corregir, rastreé la cadena: una actualización automática de Kubernetes en hora punta, una tormenta de reconexiones y una consulta que no podía usar un índice. Desplegué el índice yo mismo (de 570 ms a 6 ms) y moví las ventanas de mantenimiento fuera de hora punta esa misma semana; después escribí post-mortems sin culpables, internos y para el cliente, y abrí una auditoría de la base de datos con el equipo.

También entregué: el backend de ofertas en vivo, licitaciones y solicitudes de cambio · un framework de integración OAuth sobre el que se conectan las integraciones de partners · el exportador de pedidos al ERP de un retailer · nuestra librería de módulos de infraestructura como código · un servidor SFTP para clientes EDI · la mensajería NATS JetStream · agentes y herramientas internas de Claude Code.

Consentio platform: suppliers and buyers use the web app; retailers' order emails and PDFs go through Magic Order, LLM parsing with a fallback ladder across several LLM providers; both feed the trading API for offers, tenders and orders, which publishes events on NATS JetStream, stores data in PostgreSQL and talks to retailer ERPs and gateways through the integrations layer (OAuth, SFTP/EDI, ERP export); everything runs on GKE on GCP behind a Cloud Armor WAF, managed with Terraform. Written by me: Web app, Trading API, Integrations, NATS JetStream, PostgreSQL. Direction and specs by me, built by the team: Magic Order.GKE · Terraform · Cloud Armor WAFSuppliers & buyerswebRetailer ordersemails & PDFsWeb appReactMagic OrderLLM parsingTrading APIoffers · tenders · ordersIntegrationsOAuth · SFTP · ERPNATS JetStreameventsPostgreSQLmigrated from MySQLRetailer ERPsand gatewaysLLM providersOpenAI · Gemini · Claude
Arquitectura simplificada de la plataforma Consentio

Más allá del código

Equipo y contratación

  • Hice crecer el equipo de 5 a unas 10 personas entre España y Colombia, escribiendo las descripciones de puesto y trabajando con agencias y escuelas de ingeniería, y preparé el business case de un product manager técnico.
  • Puse en marcha un release train dos veces por semana, guardias y puertas de calidad, y llevé al equipo a programar con asistencia de IA con reglas de revisión escritas.

Clientes y producto

  • Fui el responsable técnico designado del marketplace de proveedores de un gran retailer: talleres de integración en sus oficinas, la especificación de la API de partners y 14 ADR, del arranque a la Fase 1 en cinco meses.
  • Fui el interlocutor técnico de una cooperativa de distribución cuyos pedidos se multiplicaron por unas 20 tras la puesta en producción, y asumí las especificaciones de producto cuando faltó capacidad.

Seguridad

  • Como CISO, dirigí el programa ISO 27001, 27017 y 27018 en dos auditorías de seguimiento, además del primer pentest y las revisiones de seguridad de grandes clientes.

Decisiones y concesiones

  • Detuve una integración de marketplace antes de una auditoría de datos costosa, asumiendo mi error de alcance

    Por qué: las direcciones de consumidores son datos personales y la auditoría costaba más de lo que justificaba la cuenta

    Coste: trabajo de prueba de concepto archivado; el cliente arrancó por una vía más barata.

  • Parsing LLM de pedidos con varios proveedores y una cadena de respaldo, en lugar de un solo modelo

    Por qué: ninguna caída de un proveedor detiene los pedidos

    Coste: más piezas que vigilar. Marqué la dirección y escribí las especificaciones; el equipo lo construyó.

  • Contar la complejidad de los formatos, no formatos por semana, en los planes de entrega al cliente

    Por qué: diez formatos difíciles no equivalen a diez fáciles

    Coste: una promesa más difícil de vender, pero planes cumplibles. El CEO lo adoptó.

  • Un scoring ponderado en lugar de un solver de optimización para asignar proveedores

    Por qué: un equipo pequeño debía mantenerlo y los compradores debían confiar en él

    Coste: no es óptimo; la API deja sitio para un solver más adelante.

Stack

Go · TypeScript · React · PostgreSQL · NATS · GKE · Terraform · Cloud Armor · Vertex AI · Prometheus · Sentry · Vanta

Conclusión

La velocidad con grandes retailers vino de reducir riesgos, no de saltárselos: una copia de ensayo cada noche, runbooks escritos, seis meses de logs del firewall. Eso es lo que permitió a un equipo pequeño seguir entregando dos veces por semana mientras superaba revisiones de seguridad de grandes clientes.