Fleet management ERP
The system that runs a large company’s transport operation: missions, vehicles and drivers, built to catch waste and theft and to keep every vehicle legal and maintained.
- Role
- Full-stack engineer, co-founder of the studio
- Team
- Small team, 275+ commits
- Stack
- Java 25, Spring Boot 4, PostgreSQL, Redis, Flyway, Next.js, Docker, GitHub Actions
- Users
- Admins, fleet managers, data-entry agents, sales reps, drivers
The problem
Running a big fleet leaks money in quiet ways: fuel that disappears, toll cards nobody tracks, vehicles driven until they break, insurance and inspections that lapse because a driver forgot. The company needed one system that plans the work and also notices when something is off.
What we built
A back office for the office teams and an API for the drivers’ mobile app, on one Spring Boot backend.
- Missions: planning with stops, pick-ups and per-city pricing with estimated distances, and replanning when the day changes.
- Money per trip: planned versus real duration, amounts owed and paid at every stop, and trips flagged when they are overcharged.
- Drivers: trip stops and statuses from the phone, an SOS alert, and forced app updates so nobody runs an old version.
Catching waste and theft
- Every refuel is checked against the distance driven since the previous one. When a vehicle’s consumption drifts from its norm, it is flagged, which is how fuel theft and abuse show up.
- Motorway toll cards are tracked per device: top-ups, deductions and history, so you know where the money went and when a card needs refilling before a driver gets stuck.
- Every figure is attached to a vehicle and a driver, so patterns point to a person, not just a number.
Maintenance before breakdowns
- The next oil change is predicted by kilometres and by date, and the interval is learned from the vehicle’s own history.
- Tyres, work orders with estimated and real time in the workshop, and the cost of each intervention are tracked per vehicle.
- Vehicles that are not looked after stand out, instead of failing on the road.
Papers that never expire unnoticed
About twenty alert types cover what drivers and offices tend to forget: insurance, registration, technical inspection, road tax, tachograph, fire extinguisher, refrigeration unit, driver licence, medical check-ups and more. Alerts are scoped to the people who should act on them.
Security
- Five roles, and a permission check on every endpoint (more than a hundred), not just on the menu.
- Sign-in tokens can be revoked instantly: a stolen phone or a departing employee is cut off at once.
- Vehicle papers and fuel receipts are only reachable through signed links that expire.
- Optimistic locking on every record: if two people edit the same mission, the second save is refused with a clear message instead of silently overwriting the first.
- Deleting a mission is audited.
Performance
- Every list is paginated, so screens stay fast as years of missions pile up.
- Queries load related data in one go instead of one query per row (the classic “N+1” problem).
- Business figures such as consumption deviation, unpaid amounts and real durations are computed by the database itself, so dashboards read them ready-made.
- Every schema change is a versioned migration (20 so far): the database evolves without manual fixes.
Delivery pipeline
Every push runs the test suite against real PostgreSQL and Redis instances, builds a container image, and deploys it automatically to development, staging or production depending on the branch, with a health check that fails the deployment if the new version doesn’t come up.