Portal Extranet
Doubled agent productivity (12→22 bookings/day) with zero double-booking incidents
$146K
Estimated annual savings
88%
Faster booking flow
12→22
Bookings per agent/day
Business Context
Bali Realty's B2B partner network — travel agents, concierge services, and regional resellers — was processing bookings through email threads, phone calls, and a legacy portal with stale inventory data. Agents spent more time confirming availability than closing sales.
The business needed a portal that agents could trust without calling operations — one that reflected the same real-time inventory as the central PMS and eliminated the double-booking incidents that eroded partner confidence.
The Challenge
Agents averaged 12 bookings per day with an 18-minute completion flow — most of that time spent on manual availability verification and back-and-forth with operations staff.
Core technical problems:
- Stale cache layers showing available dates that were already sold
- No role-based workflows — junior agents could mutate inventory directly
- Fragmented booking states across email confirmations and the legacy system
- No audit trail when disputes arose over who booked a date first
Each double-booking cost partner relationships. Operations spent hours weekly reconciling agent bookings against the master PMS.
Architecture Decision
Chosen: Laravel API backend with Vue.js SPA frontend, real-time inventory polling against the authoritative PMS database, and granular RBAC with booking-state machine enforcement.
Rejected: Embedding the portal inside the existing PMS admin — rejected because agent UX requirements (speed, simplified flows, mobile-friendly) conflicted with internal admin patterns, and coupling would slow iteration for both user groups.
Why direct PMS reads over cache: A short-lived cache (30s TTL) with cache-bust on webhook events gives agents real-time trust without hammering the database. Stale data was the root cause of double-bookings — freshness beat raw performance.
Why Vue.js SPA: Agents needed sub-second filter/search across 80+ properties with instant date-picker feedback. Server-rendered page reloads added 3–4 seconds per inventory check — unacceptable for a booking-per-minute workflow target.
Key Results
| Metric | Before | After |
|---|---|---|
| Agent bookings per day | ~12 bookings/agent | ~22 bookings/agent |
| Average booking completion time | 18 minutes | 2.5 minutes |
| Double-booking incidents | 1–2 per week | 0 |
| Manual inventory checks | Required on every booking | Real-time · automated |
Lessons
- B2B portals fail when agents can't trust inventory in real time — speed gains come from eliminating doubt, not just prettier UI.
- RBAC must mirror business roles exactly; over-permissioning creates accidental inventory mutations that are harder to debug than permission errors.
Next Project
Villa Website Platform →3.2% direct booking conversion — bypassing $93K/year in OTA commission fees