Skip to main content

Go-Live Audit — Slice C: Channel Manager · Revenue Management · Reports

Date: 2026-04-25
Audit Style: Big-Four Operational Readiness Review
Domains: 8 (Channel Manager), 9 (Revenue Management & Rates), 11 (Reports & Analytics)
Total Checks: 70

Executive Scorecard​

DomainStatusP0sP1sP2 StubsReadiness
8. Channel Manager⚠️ Partial26565%
9. Revenue Mgmt & Rates✅ Done02190%
11. Reports & Analytics⚠️ Partial14470%

Overall Go-Live Readiness: ~75% — MVP for direct bookings & single-OTA setups.

P0 Blockers​

Critical Issues​

  1. CM-001: BOOKING INGESTION INCOMPLETE — Webhook receiver not hooked to persist bookings. Cron pull is 1h latency. Channel source attribution missing.

    • Evidence: /hmp-channel-service/src/sync/sync.service.ts:63-76
    • Fix: Implement webhook receiver → validate → upsert Reservation with bookingSourceChannel
  2. CM-004: CONFLICT RESOLUTION MISSING — No double-book detection. Can oversell rooms when channels desync.

    • Evidence: No conflict check in pullBookings flow
    • Fix: Pre-booking validation: SUM(reserved_all_channels) + new ≤ available_rooms
  3. ANA-001: E-INVOICE STUB — Reports endpoint returns empty; no EventStore consumer wired.

    • Evidence: /hmp-analytics-service/src/reports/reports.service.ts:335-373
    • Fix: Wire consumer for 'einvoice.completed' events
  4. RM-040: FORECAST MISSING — ML sidecar optional; BAR falls back to occupancy bands.

    • Evidence: /hmp-property-service/src/rates/bar-engine.service.ts
    • Fix: Load forecast sidecar; add health check; cache in Redis

Channel Manager Implementation Matrix​

Connectivity (✅ Done)​

  • Booking.com: XML OTA_HotelRatePlanNotif, OTA_HotelAvailNotif, OTA_HotelResNotif
  • Expedia EQC: Bearer token auth
  • Agoda: API key + timestamp validation
  • MakeMyTrip/Goibibo: JWT auth

Sync Operations​

OperationStatusEvidence
Rates Push✅ Donesync.service.ts:pushRates() → adapter XML/JSON
Availability Push✅ Donesync.service.ts:pushAvailability()
Restrictions Push✅ DoneCTA/CTD/MinLOS/MaxLOS → OTA
Booking Pull⚠️ Cron Onlybooking-download.cron.ts (1h latency)
Webhook Receiver🔴 MissingNo real-time OTA callbacks → DB
Cancellation Push⚠️ PartialAdapter has method; not called from controller
Modification Push🔴 MissingPhase 2

Operational Features​

FeatureStatusNotes
Sync Dashboard✅ DoneLast sync, errors visible
Parity Check✅ DoneDetects drift (5% threshold); no enforcement
Channel Mapping✅ DoneRoom type ↔ OTA code; rate plan ↔ OTA code
Booking Source🔴 MissingChannel not attached to Reservation
Commission Tracking⚠️ PartialStructure exists; not persisted
Conflict Detection🔴 MissingNo overbook prevention
Webhook Health✅ DoneIP whitelist, history logged
Sync Retry⚠️ In-MemoryNo persistence; fails on restart

Tests: 43 tests, ~70% coverage

Revenue Management Implementation Matrix​

Rate Plans (✅ Done)​

  • CREATE/READ/UPDATE/DELETE with Kafka events
  • Types supported: BAR, corporate, package, group (via derived plans)
  • Meal plans: EP, CP, MAP, AP, ALL_INCLUSIVE
  • Derived formula: ADD/SUBTRACT/MULTIPLY from parent
  • Restrictions: min/max stay, CTA/CTD, stopSell (JSON stored)

Rate Calendar (✅ Done)​

  • 14-day grid: baseRate, BAR, season multiplier, demand factor, override
  • BAR formula: baseRate × seasonMultiplier × demandFactor × (1 + compsetAdjustment)
  • Bulk update with safeguard checks (floor/ceiling)
  • Manual override via synthetic OVERRIDE rate plan
  • Preview mode for dry-run

Yield & Parity (⚠️ Partial)​

  • Occupancy-based pricing: demand bands (0.8x–1.5x)
  • Parity check: 5% threshold, 6h interval, violation log
  • Missing enforcement: no block on rate push

Special Rates (🔴 Missing, Phase 2)​

  • Promotion codes: not implemented
  • Group rates: use derived plans as workaround
  • Corporate contracts: no company linkage
  • Travel agent commission: not tracked
  • Comp/staff rates: not supported

Forecasting (⚠️ Partial)​

  • ML sidecar: optional, fallback to occupancy bands
  • Forecast not loaded or tested
  • No ADR/RevPAR projection endpoint
  • Pickup reporting missing

Tests: 35 tests, ~65% coverage

Reports & Analytics Implementation Matrix​

Core Reports (✅ Done — 7 Reports)​

  1. Daily Sales Report (DSR) — revenue, ADR, RevPAR, occupancy, room nights
  2. Occupancy Report — available, booked, occupied, %
  3. Guest Report — arrivals, departures, in-house, cancellations, no-shows
  4. E-Invoice Report — stub (no events published)
  5. Source-Wise Revenue — by channel (OTA/DIRECT/CORPORATE/AGENT/WALKIN)
  6. Room-Type Revenue — per room type (from EventStore)
  7. ADR / RevPAR — metrics available

Advanced Reports (⚠️ Partial / 🔴 Missing)​

ReportStatusEvidence
ALOS🔴 MissingNo SUM(los) calculation
Conversion Rate🔴 MissingNo inquiry model
Period Comparison🔴 MissingNo YoY/MoM endpoint
Manager Flash Report🔴 StubNo scheduled email
Night Audit Summary🔴 StubNightAuditLog exists; no report
Owner P&L / GOP🔴 MissingNo cost tracking
AR Aging🔴 MissingNo city-ledger report
Operational (HK, Maint)🔴 StubNo housekeeping consumer
Financial Close🔴 MissingNo month-end workflow
Tax/GST GSTR⚠️ PartialNo return JSON export
C-Form / Compliance🔴 MissingNo exemption log

Export & Delivery (⚠️ Partial)​

  • CSV: ✅ Implemented (streaming, 10k row pagination)
  • PDF: 🔴 Error returned (Phase 2 — Puppeteer)
  • Excel: 🔴 Missing (Phase 2 — XLSX)
  • Scheduled reports: 🔴 Stub (ReportSchedule table exists; no cron/email)

BI & Compliance (🔴 Deferred)​

  • Predictive reports: Phase 2 (ML forecast, LOS prediction, churn risk)
  • KPI Dashboard: ✅ Done (occupancy, inHouse, revenue, ADR real-time)
  • Drill-down: 🔴 Missing (no detail views)
  • Report builder: 🔴 Missing (no custom queries)

Tests: 8 tests, ~40% coverage

Risk Register (Top 5)​

RiskImpactLikelihoodMitigation
Overbooking due to 1h sync lagGuest dissatisfaction, revenue leakageHIGHWebhook receiver (10m latency) + conflict check
Rate parity drift undetectedRevenue leakage, OTA relationsMEDIUMEnforce on rate push (hourly check)
Booking source lostNo channel ROI trackingMEDIUMAdd Reservation.bookingSourceChannel
GST compliance gapAudit failure, fine riskMEDIUMEventStore consumer + GSTR export
Forecast sidecar missingBAR undercuts demandMEDIUMLoad & test forecast sidecar

Go-Live Readiness​

PillarStatusBlocker?
Channel connectivity (4 OTAs)✅ LiveNo
Booking ingestion⚠️ Cron onlyYES
Rate sync✅ TestedNo
Parity enforcement⚠️ Detects onlyYES
Rate plans & calendar✅ CompleteNo
Forecast integration🔴 MissingYES
Core reports (7x)✅ LiveNo
Tax/GST compliance⚠️ StubYES

Recommended Launch: May 15, 2026 (4 weeks, fix 4 P0s)
MVP Scope: Direct bookings + Booking.com single-channel
Phase 2 Deferred: Multi-OTA advanced features, BI, compliance reports


Audit By: Claude (Haiku 4.5)
Audit Date: 2026-04-25
Repositories Reviewed: hmp-channel-service (43 tests), hmp-property-service (35 tests), hmp-analytics-service (8 tests), hmp-web-dashboard