Private client · August 2026 – now · Sole developer

Shipment exception platform

An online parts retailer could see that a package had shipped, but not where it was or that it had stopped moving. I built the system that watches every parcel every day, finds the ones that have gone wrong, and puts them in one short list for the customer service team before the customer has to ask.

Role
Sole developer: design, build, deploy, operate
Stack
Node, TypeScript, Fastify, server-rendered HTML
Data
PostgreSQL, Drizzle ORM, pg-boss job queue
Hosting
Self-managed Linux VM, backups every 15 minutes
The staff work board: counts by exception type, then the flagged parcels with their reason, how long each has been quiet, the customer and the last carrier scan
The work board. Of everything in transit, it lists only the parcels that need a person, under their most serious problem, with the reason and the next step.
SOURCES CORE PEOPLE 3 carrier APIs Fulfilment Storefront Append-only event store Staff work board Customer tracking Digest + alerts daily polling webhooks + hourly sweep nightly reconciliation lost · stalled · overdue refused · held · voided derived at read time claim, note, resolve lookup + self-service health self-checks
How data flows. Nothing stores a "status": every exception is worked out from timestamps when it is read.

The problem

The retailer's fulfilment and store systems record that a label was printed and a box left the building. After that, the only way to learn a parcel was lost, sitting at a depot or refused was for the customer to write in. By then the customer was already unhappy, and the team had to look the parcel up by hand across several systems.

What I built

A walk through it

A typical morning: open the board, pick the most serious row, and work it from the parcel page without opening the fulfilment system, the store admin or the carrier's site.

Parcel page for a lost parcel: the reason it is flagged, links to the customer's view, the live carrier page, the whole order and an email draft, casework controls, and the shipment details
A parcel judged lost: nine business days without a scan, five past the threshold for its service. Claimed by a staff member, with a note that a carrier trace is open.
Customer tracking page on a phone: out for delivery today, with the latest carrier update and shipment details Customer tracking page on a phone: delivered, with the delivery time and shipment details The staff work board on a phone

What the customer sees, in the store's own branding, and the staff board on a phone.

Held by the carrier: every parcel whose latest scan is a hold, with the carrier's reason and how long it has been held
Holds: every parcel the carrier is holding, including the ones that are not yet exceptions, with the carrier's own words.

What it deliberately does not do

Hard parts

Outcome

The platform went live in October 2026. Of more than a thousand parcels in transit on a typical day, the board shows the 15 to 20 that need a person. In the first full measurement, 99.7% of parcels shipped in the previous week showed customers a useful tracking page, and the system reports how many "where is my order" contacts that page prevents.

The client's name and data are confidential. The screens on this page are the real application running on my machine against invented data, with a made-up store name and logo; the figures are rounded.

Next: novoFlight Aviator

Email me about a project