rizalfarhan.dev
B2B Agent PortalLaravelVue.jsPostgreSQL

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

MetricBeforeAfter
Agent bookings per day~12 bookings/agent~22 bookings/agent
Average booking completion time18 minutes2.5 minutes
Double-booking incidents1–2 per week0
Manual inventory checksRequired on every bookingReal-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 Platform3.2% direct booking conversion — bypassing $93K/year in OTA commission fees