GoFeels · Senior Full-Stack Engineer / Tech Lead · since 2020
A hotel PMS: overbookings, releases and hardening
I traced overbookings to stale availability in the outbound channel sync, rebuilt the release pipeline from 30+ minutes to about 7, and ran a proactive security hardening program on a PMS used by +150 hotels.
- PHP
- Laravel
- AngularJS
- MySQL
- Docker
- CI/CD
Client, hotel and channel names are withheld. This study describes only the work and its results.
Problem
A hotel PMS does not sell rooms alone. Each property also sells through online travel agencies, so every reservation, cancellation and rate change has to reach every connected channel quickly and stay correct. Overbookings were being reported, and the trail ended in the outbound availability sync: a push could fail, or a later update could be processed before an earlier one, leaving a channel with availability the PMS had already sold.
The same platform had grown for years without a matching investment in delivery and security. A release took more than 30 minutes and depended on manual steps, and the PMS frontend carried critical and high dependency vulnerabilities: 2/44.
Decisions
The channel manager had to stop treating a push as fire-and-forget. I rebuilt the outbound sync as a transactional outbox: every availability or rate change is recorded first, collapsed to the latest state per property and date, and only marked sent once the channel confirms it. That removed the ordering problem and made every push auditable.
I isolated channels from each other and turned failed pushes into dirty dates that are retried with backoff, so one channel cannot stale the others. Pushes are batched by date range and logged end to end.
I made releases boring: Docker images with strict lockfiles, versioned releases, one-step rollback and an end-to-end suite that gates every release.
I extracted the shared CI components every repository now uses (linting, static analysis, secret scanning, dependency audits) and added an AI review gate to merge requests.
I ran a proactive security hardening program: 2FA, a content security policy, cookie-based sessions instead of tokens in browser storage, secret scanning and rotation, PCI redaction of stored card data, and dependency audits in CI.
I kept the AngularJS frontend running while planning its exit in phases, instead of betting the roadmap on a rewrite.
Result
Availability across channels now stays in continuous sync, and the stale-availability path behind the overbookings is gone.
+150 hotels with +2,000 rooms run their reservations, payments and daily operations on the platform. It has handled +750k room reservations in total and ~13× its 2020 yearly reservation volume by 2025.
Tens of thousands of online payments a year flow through the booking engine and payment links.
Releases take about 7 minutes instead of 30+, with one-step rollback.
Critical and high dependency vulnerabilities in the PMS frontend went from 2/44 to 0/1.