Back to work

Director of Engineering & CISO · 2023 - now

Consentio

I joined a five-person team on a legacy MySQL stack in late 2023, and I still write code every week. Three years later the platform runs on PostgreSQL behind a firewall I wrote, has passed two ISO surveillance audits, and the team has doubled.

consentio.co
orders, to 500k+ a year
2×
of orders read from emails and PDFs, 2023 → 2026
14% → ⅔
people on the team
5 → 10
merged PRs a year, my own
~170

The problem

Consentio is a B2B trading platform for fresh produce. Suppliers publish offers, buyers order, and Magic Order, our AI parser, turns retailers' order emails and PDFs into orders. More than 1,500 suppliers have traded on it, with retailers such as Aldi, Carrefour, Kroger and Metro.

Produce is perishable and margins are thin. The job was to keep shipping product while making a legacy platform reliable and secure enough for enterprise retailers and their security reviews.

Key moments

The cutover night

Moving from MySQL to PostgreSQL could not be a big-bang rewrite. I designed a parallel environment re-imported from production every night, wrote a runbook for each environment and ran the first migration myself. The team wrote most of the application changes; I sequenced the work, held back a merge so two risky releases would not ship together, then ran the production cutover night. Nine months, no big bang, and it unlocked the move to our new Kubernetes clusters.

Six months before the first block

Enterprise retailers integrate from fixed IPs, so a badly tuned firewall would cut off the customers we most needed. I wrote the Cloud Armor WAF and rate limiting in Terraform, enforced them in development first, then ran them in preview on six months of production traffic, 24M requests, and reordered partner allowlists before switching them on. They went live with zero false-positive blocks. Along the way I taught Terraform to every backend engineer, so infrastructure changes no longer have to go through me.

The worst outage of 2026

One June morning, during the ordering window, the read replica saturated and the platform went down for about 80 minutes. Following the rule I gave the team, reproduce first, fix second, I traced it from a Kubernetes auto-upgrade at peak time to a reconnect storm and a query that could not use an index. I shipped the index myself (570 ms to 6 ms) and moved maintenance windows off-peak the same week, then wrote blameless internal and customer post-mortems and opened a database audit with the team.

Also shipped: backend for live offers, tenders and change requests · an OAuth integration framework that partner integrations plug into · a retailer's ERP order exporter · our infrastructure-as-code module library · an SFTP server for EDI customers · NATS JetStream messaging · internal Claude Code agents and tooling.

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
Simplified architecture of the Consentio platform

Beyond the code

Team & hiring

  • I grew the team from 5 to about 10 across Spain and Colombia, writing the job descriptions and working with agencies and engineering schools, and made the business case for a technical product manager.
  • I set up a twice-weekly release train, on-call and QA gates, and moved the team to AI-assisted coding with written review rules.

Customers & product

  • I was the named technical lead on a major retailer's supplier marketplace: on-site integration workshops, the partner API spec and 14 ADRs, kickoff to Phase 1 in five months.
  • I was the technical counterpart for a retail cooperative whose orders grew about 20× after go-live, and took over product specs when product capacity ran short.

Security

  • As CISO, I ran the ISO 27001, 27017 and 27018 programme through two surveillance audits, plus the first pentest and enterprise customer security reviews.

Decisions and trade-offs

  • Stopped a marketplace integration before a costly data audit, and owned my scoping miss

    Why: consumer addresses are personal data, and the audit cost more than the account justified

    Cost: shelved proof-of-concept work; the customer went live on a cheaper route.

  • LLM order parsing across several providers with a fallback ladder, not one model

    Why: no single provider outage stops orders

    Cost: more moving parts to monitor. I set the direction and wrote the specs; the team built it.

  • Count format complexity, not formats per week, in customer delivery plans

    Why: ten hard formats are not ten easy ones

    Cost: a harder promise to sell, but plans we could keep. The CEO adopted it.

  • Weighted scoring instead of an optimisation solver for supplier allocation

    Why: a small team had to run it and buyers had to trust it

    Cost: not optimal; the API leaves room for a solver later.

Stack

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

Takeaway

Speed with enterprise retailers came from de-risking, not from skipping it: a nightly rehearsal copy, written runbooks, six months of firewall logs. That is what let a small team keep shipping twice a week while passing enterprise security reviews.