Tagline
SPA courier platform built on REST.
Tech Stack
PHP, Laravel, Vue, JavaScript, Mysql, TailwindCSS

SPA courier platform built on REST.
PHP, Laravel, Vue, JavaScript, Mysql, TailwindCSS
A courier platform built to a client brief, covering order tracking, parcel scans, and run management for dispatchers. Shipped on Digital Ocean behind Nginx, with Laravel and MySQL on the backend and a Vue SPA on the front, talking to everything over a REST API.
Senders enter parcel dimensions, weight, pickup and delivery addresses. A live quote calculates price across service tiers (same-day, next-day, economy).
Laravel · Vue SPA
tap a step to explore →
A courier business needed one system to run the whole parcel lifecycle — booking and live quoting, dispatch and run management for its couriers, and a public tracking page for the people waiting on a delivery. It was a client brief, so the constraint was a real budget and a single modest server, not unlimited infrastructure.
A single-page courier platform: a Laravel and MySQL backend behind a REST API, a Vue SPA on the front, deployed on Digital Ocean behind Nginx. Senders get a live quote across service tiers; an admin dashboard assigns couriers by zone and load; every scan updates parcel state; couriers capture proof of delivery; and completed runs roll up into per-account invoices.
The interesting call was how to make tracking feel live. Websockets give true push updates but add a persistent-connection layer to host, scale and keep alive. On a single Digital Ocean box serving this traffic, I chose REST plus polling for the public tracking URL — it's simpler to run, degrades gracefully, and the tradeoff is only a slightly staler ETA, which nobody refreshing a tracking page actually notices.
Polling was the pragmatic fit for the client's scale and budget, and the platform shipped against the brief. If scan volume grew to the point where polling became wasteful, the clean next step is server-sent events — one-directional push that fits the tracking use case without the full weight of websockets.



