Starting state
Spreadsheets and handwritten lists. Packages logged twice, shipments reconstructed from memory, and money moving with parcels tracked in a separate sheet from the parcels themselves.
Domain model
I modelled the business rather than the spreadsheets: clients, packages, shipments, and destinations, with provinces and municipalities as real entities because delivery routing depends on them.
Each package is registered once, grouped into a shipment, and follows a status through to delivery.
What the first version taught me
- Duplicate pending entries per client were the most common data error, so validation blocks them at intake rather than cleaning them up later.
- Remittances belong on the package record. Tracking money separately from the parcel it travels with guarantees the two drift.
- Manifests and labels need to be generated from the same records the operators edit, not exported and reformatted.
Platform
Laravel with Filament for the admin surface, role-based access control, record versioning, user impersonation for support, and a bilingual interface.
Result
8,638 packages and 43,199 parcels have moved through it, with shipment history and generated manifests for each.