
Tioman Dive Buddy AEO Success Story
June 13, 2026A hotel PMS built from scratch,
running as a product.
Reservations, front desk, housekeeping, folios and live OTA channel sync — one Laravel codebase serving many properties, each with its own isolated database. Built in-house because nothing off the shelf fit how independent properties actually run.
Not a mockup.
The live platform.
Built with Livewire and Filament so the whole thing behaves like a desktop application — inline edits, instant filtering and no full-page reloads between screens.
Open full size ↗
A room sold twice
costs more than the room.
Independent hotels and resorts run on tight, seasonal inventory. Rooms get sold through Agoda, Booking.com, Traveloka and the front desk at the same time — on spreadsheets and separate OTA extranets that have no idea the others exist.
Take a walk-in booking at the front desk and nothing closed that room on the OTAs. Someone books the same night online an hour later and you're relocating a guest who has flown in for a dive trip. It's the single most expensive failure mode in small-hotel operations, and it happens quietly.
- Manual inventoryAvailability tracked in spreadsheets, updated by hand after each booking.
- Separate extranetsEach OTA managed in its own portal, with no shared source of truth.
- Direct bookings invisibleA front-desk sale never reduced availability on the channels.
- No group viewEach property reported separately; no consolidated occupancy picture.
One source of truth,
pushed everywhere.
Every booking — wherever it originates — writes to the PMS first. Availability then propagates out to every connected channel, so the room that just sold at the front desk closes online too.
Thirteen modules,
one operating system for the property.
Reservations
Create, amend and cancel bookings with rate, occupancy and stay-date validation.
Front Desk
Check-in and check-out flow, room moves, walk-ins and same-day availability.
Tape Chart
Drag-free availability grid across rooms and dates, colour-coded by source and status.
Rooms & Rates
Room types, inventory counts, seasonal rate plans and per-channel pricing.
Channel Sync
Two-way availability and rate push to every connected OTA via the channel manager.
Housekeeping
Room status board, cleaning assignments and turnover tracking against departures.
Guest Profiles
Guest history, contact records, repeat-stay recognition and notes across properties.
Folio & Billing
Room charges, extras, tourism tax, deposits and split folios per guest.
Payments
Payment capture and reconciliation against each folio and booking source.
Reporting
Occupancy, revenue, source mix and arrival/departure manifests by date range.
Roles & Access
Granular permissions so front desk, housekeeping and management each see their own scope.
Multi-Property
Tenant provisioning with a separate database per property under one deployment.
Configuration
Tax rules, policies, room mapping and per-property settings without redeployment.
Built to be maintained,
not just shipped.
Application
- Laravel11
- PHP8.3
- Livewire3
- Filament3
Data
- MySQL8.4
- Rediscache & queue
- TenancyDB per property
Infrastructure
- VPSContabo SG
- OPcacheproduction tuned
- Channel APIChannex.io
Hosting sits in Singapore for latency to Malaysian properties and the regional OTAs. Each property gets its own database, so one client's data never touches another's — and a new property can be provisioned without forking the codebase.
Got a process no off-the-shelf tool fits?
That's usually the point where a custom web application pays for itself. Tell us how your operation actually runs and we'll scope what it would take to build around it.