PBS
Business-management platform for maritime operations covering voyages, bookings, fleet, ports, payments, role-based workflows (captain, commercial, admin) and a Xero accounting integration.
Role
Full-stack developer — Laravel API, business workflows and integrations
Context
PBS is a business-management platform for a maritime shipping operation — coordinating voyages, bookings, fleet availability, ports of call and payments across role-based workflows for admins, commercial staff and ship captains.
System
A Laravel API, with Passport-based OAuth2 authentication, backs a React/Redux admin and role-specific front end. Voyages, bookings, ships and ports are modeled as related entities in MySQL; booking payments run through a payment gateway; invoices and bills of lading are generated as PDFs; bookings and customer data can be exported to Excel; a Xero integration maps completed bookings to accounting invoices.
Problem
Running a shipping operation means coordinating who can book a voyage, which ship is available on which route, how a booking gets paid and invoiced, and how that revenue reaches the company's accounting system — across roles (captain, commercial staff, admin) that each need a different view of the same underlying data.
Engineering challenge
Keeping voyages, bookings, ships and ports consistent across booking, payment and invoicing — a booking can be partially paid, needs a PDF invoice and bill of lading, and eventually has to reconcile in Xero — and building a real OAuth2 integration against Xero's accounting API rather than a one-off export.
My contribution
- Built role-based workflows and views for captain, commercial and admin users on top of the same booking/voyage/fleet data.
- Implemented booking, voyage, fleet and port management, including ship availability by date and voyage-to-port linking.
- Built the payment flow against a payment gateway, and PDF generation for invoices and bills of lading.
- Implemented the Xero OAuth2 integration — authorization, token refresh, and mapping a booking's shipper, products and voyage detail to a Xero invoice.
Technical decisions
- Used Laravel Passport for API authentication rather than a custom token scheme, since the app needed OAuth2-style API access alongside its own role-based authorization.
- Generated invoices and bills of lading as PDFs server-side rather than in the front end, so the same documents stay consistent whether printed, emailed or archived.
- Modeled ports as a many-to-many relation through voyages, rather than a fixed origin/destination pair, so a voyage can call at more than two ports.
Technology
- Laravel (PHP)
- REST API and business logic for voyages, bookings, fleet and ports.
- Laravel Passport
- OAuth2-based API authentication.
- MySQL
- Relational data for voyages, bookings, ships, ports and payments.
- Xero API (OAuth2)
- Maps completed bookings to Xero invoices for accounting export.
- Payment gateway integration
- Processes booking payments.
- Laravel DomPDF
- Generates invoices and bills of lading as PDFs.
- Excel export
- Data exports for statistics and customer records.
- React / Redux Toolkit / MUI
- The admin, commercial and captain-facing front end.
Result
A platform covering the booking-to-invoice path for a maritime operation across role-based front ends, with an OAuth2-based Xero accounting integration built and wired end to end.
What I learned
Business software like this lives or dies on whether the data model actually matches how the business operates — getting voyages, bookings and payments modeled as real relations, not loosely-linked tables, is what made the PDF generation and Xero export tractable.