← All case studies

Case study 01

Scaling an IoT platform for the cold chain

Growing AKO’s IoT SaaS from an initial MVP into a platform for the company’s shift from hardware to connected services.

Context

AKO manufactures components for the cold chain. Its IoT SaaS (Akonet.cloud / Akoneth.cloud) had to grow from an initial MVP into a platform able to support the company’s shift from selling hardware to selling software services, including a €7M PERTE project that added six new device types.

My role

Head of Software: owned the platform architecture and technical decisions, executed by a team of up to 14 people.

Constraints

  • Devices with intermittent connectivity, some battery-powered in remote locations.
  • Slow thermal dynamics (samples every 5 minutes), but critical alarms that need an immediate response.
  • A small internal team, extended with an external software factory.
  • A clear wish to avoid vendor lock-in.

Architecture I inherited

  • Protocols by device profile: MQTT for always-connected devices, CoAP over NB-IoT for low-power ones.
  • Generic input/output MQTT topics, following the application protocol of the edge devices.
  • Store-and-forward on the devices, which act as data loggers and keep readings until connectivity returns.
  • MongoDB for operational data and a specialized time-series platform, fed by a minimal in-house MQTT handler in Node.js.

Platform at a glance

  • Node.js/Express microservices with Angular frontends on a shared design system.
  • nginx as reverse proxy to internal services.
  • Public API with webhooks for client integrations; GraphQL piloted.
  • RabbitMQ queues between services.

Decisions I made

  • Replace the in-house MQTT handler (a Node.js server without full protocol support) with a market-standard broker such as EMQX, avoiding vendor lock-in.
  • Two latency paths: minutes of tolerance for regular telemetry, a real-time path for critical alarms.
  • Adopt TimescaleDB: consolidated 2.5 TB of time-series data as volumes grew, reducing storage costs at scale, and designed the consolidation of relational data (such as device–user relationships) from MongoDB into the same PostgreSQL-based store.
  • Selective AWS adoption: pushed the platform beyond self-hosting towards managed services where they reduced operational load, while keeping core components free of lock-in.
  • Secure the public endpoints: put AWS WAF and an Elastic Load Balancer in front of nginx, filtering malicious requests and balancing the load, plus a CDN to cache selected content.
  • Serverless where it fit: AWS Lambda with API Gateway for coordination tasks and an in-house URL shortener, which started as a proof of concept and reached production, instead of adding always-on services for small workloads.
  • End-to-end observability: introduced OpenTelemetry with a self-hosted Grafana to improve the observability of the services.
  • Unified NB-IoT protocol: contributed to the design, with the electronics team, of a unified protocol and device definition model to integrate six new device types under the PERTE project.
  • Professionalize delivery: created the SRE function and built CI/CD from scratch (GitHub Actions, GitLab CI) with QA gates, plus Architecture Decision Records so decisions stayed visible and could be challenged.
  • Map the business domain with strategic DDD: an initiative led from software and never completed, which still led manufacturing to change industrialization processes and improve product traceability.

Outcome

32k+connected devices, from 15k
6new device types through a unified protocol
2.5 TBtime-series data consolidated

The PERTE project was kept on schedule and on budget through to its final delivery phase. Grew the internal team from 2 to 5 and led up to 14 people across development, systems and QA, including an external software factory; created the SRE function and introduced CI/CD, QA gates and ADRs.