All work
05Client project — business platform

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.

Architecture
Client
React (admin / commercial / captain)
API layer
Laravel (Passport OAuth2)
Data
MySQL
Integrations
Xero (invoices)
Payment gateway