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.
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.