Pharmaceutical logistics · 14 months

Cold-chain monitoring for a cross-border distributor

Vaccine shipments were being written off because temperature breaches were only discovered on arrival. Paper loggers gave no way to intervene while a truck was still moving.

ZephyrLoRaWANFastifyTimescaleDBReact
4,200loggers in circulation
63%fewer spoiled shipments
26 mobattery life on one cell
8 minmedian time to intervention

The situation

The distributor moves temperature-controlled pharmaceuticals across four countries, mostly by road, with handovers at depots along the route. Compliance required a temperature record for every shipment, and they had one: a single-use paper logger in the box, read when the box was opened.

What made it hard

The record was accurate and completely useless for prevention. By the time anyone knew a reefer unit had failed outside Vienna, the load had been at nine degrees for six hours and was already a write-off.

Two constraints shaped everything. The loggers travel inside sealed boxes with no mains power and no reliable cellular coverage, and the business would not accept a device that needed charging between shipments or a battery swap at the depot.

How we built it

A logger that lasts longer than the contract

Zephyr firmware on a low-power MCU, sampling every five minutes and transmitting a compressed batch every thirty. The power budget was modelled in week one and measured on real hardware in week four; the shipped device holds twenty-six months on a single cell, which comfortably outlives the two-year service interval.

LoRa at the depots, buffering in between

A gateway at each depot picks up loggers as vehicles arrive. Between depots there is no coverage at all, so every reading is written to flash with its device timestamp and replayed on the next contact. The console draws the gap explicitly rather than interpolating across it — dispatchers need to know what was measured and what was inferred.

Scoring against stability profiles, not a single threshold

A product is not spoiled by touching eight degrees; it is spoiled by cumulative exposure. The Node.js service scores every reading against the mean kinetic temperature profile for the product in that box, so the console can show a shipment consuming its allowance and flag it before the limit rather than after.

An interface for someone under time pressure

The dispatcher's screen shows shipments in the order they need attention, with time-to-breach as the sort key. Rerouting is two clicks and writes an audit record. Everything else is one level down.

What changed

Spoiled shipments fell by 63% in the first full year. The unexpected result was commercial rather than operational: the distributor now sells the temperature record as a service to manufacturers who previously ran their own loggers, which paid for the build inside eighteen months.

What we would tell the next team

  • The stability profile mattered more than the sensor accuracy. A cheaper sensor with correct scoring beat a precise one with a naive threshold.
  • Depot staff were the real users during rollout, not dispatchers. Making the gateway status visible on a wall display stopped three months of silent failures.
  • We spent too long on map views nobody used. The list, sorted correctly, was the product.
Figures are the client's own

Results above were measured by the client against their own baseline. We are happy to arrange a reference call where the contract allows it.

Tell us what you are trying to measure

An engineer reads every message and replies within one working day. The first call is a conversation about your problem, not a sales script.

See engagement models