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
| Domain | Status | P0s | P1s | P2 Stubs | Readiness |
|---|---|---|---|---|---|
| 8. Channel Manager | ⚠️ Partial | 2 | 6 | 5 | 65% |
| 9. Revenue Mgmt & Rates | ✅ Done | 0 | 2 | 1 | 90% |
| 11. Reports & Analytics | ⚠️ Partial | 1 | 4 | 4 | 70% |
Overall Go-Live Readiness: ~75% — MVP for direct bookings & single-OTA setups.
P0 Blockers
Critical Issues
-
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
- Evidence:
-
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
-
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
- Evidence:
-
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
- Evidence:
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
| Operation | Status | Evidence |
|---|---|---|
| Rates Push | ✅ Done | sync.service.ts:pushRates() → adapter XML/JSON |
| Availability Push | ✅ Done | sync.service.ts:pushAvailability() |
| Restrictions Push | ✅ Done | CTA/CTD/MinLOS/MaxLOS → OTA |
| Booking Pull | ⚠️ Cron Only | booking-download.cron.ts (1h latency) |
| Webhook Receiver | 🔴 Missing | No real-time OTA callbacks → DB |
| Cancellation Push | ⚠️ Partial | Adapter has method; not called from controller |
| Modification Push | 🔴 Missing | Phase 2 |
Operational Features
| Feature | Status | Notes |
|---|---|---|
| Sync Dashboard | ✅ Done | Last sync, errors visible |
| Parity Check | ✅ Done | Detects drift (5% threshold); no enforcement |
| Channel Mapping | ✅ Done | Room type ↔ OTA code; rate plan ↔ OTA code |
| Booking Source | 🔴 Missing | Channel not attached to Reservation |
| Commission Tracking | ⚠️ Partial | Structure exists; not persisted |
| Conflict Detection | 🔴 Missing | No overbook prevention |
| Webhook Health | ✅ Done | IP whitelist, history logged |
| Sync Retry | ⚠️ In-Memory | No 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)
- Daily Sales Report (DSR) — revenue, ADR, RevPAR, occupancy, room nights
- Occupancy Report — available, booked, occupied, %
- Guest Report — arrivals, departures, in-house, cancellations, no-shows
- E-Invoice Report — stub (no events published)
- Source-Wise Revenue — by channel (OTA/DIRECT/CORPORATE/AGENT/WALKIN)
- Room-Type Revenue — per room type (from EventStore)
- ADR / RevPAR — metrics available
Advanced Reports (⚠️ Partial / 🔴 Missing)
| Report | Status | Evidence |
|---|---|---|
| ALOS | 🔴 Missing | No SUM(los) calculation |
| Conversion Rate | 🔴 Missing | No inquiry model |
| Period Comparison | 🔴 Missing | No YoY/MoM endpoint |
| Manager Flash Report | 🔴 Stub | No scheduled email |
| Night Audit Summary | 🔴 Stub | NightAuditLog exists; no report |
| Owner P&L / GOP | 🔴 Missing | No cost tracking |
| AR Aging | 🔴 Missing | No city-ledger report |
| Operational (HK, Maint) | 🔴 Stub | No housekeeping consumer |
| Financial Close | 🔴 Missing | No month-end workflow |
| Tax/GST GSTR | ⚠️ Partial | No return JSON export |
| C-Form / Compliance | 🔴 Missing | No 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)
| Risk | Impact | Likelihood | Mitigation |
|---|---|---|---|
| Overbooking due to 1h sync lag | Guest dissatisfaction, revenue leakage | HIGH | Webhook receiver (10m latency) + conflict check |
| Rate parity drift undetected | Revenue leakage, OTA relations | MEDIUM | Enforce on rate push (hourly check) |
| Booking source lost | No channel ROI tracking | MEDIUM | Add Reservation.bookingSourceChannel |
| GST compliance gap | Audit failure, fine risk | MEDIUM | EventStore consumer + GSTR export |
| Forecast sidecar missing | BAR undercuts demand | MEDIUM | Load & test forecast sidecar |
Go-Live Readiness
| Pillar | Status | Blocker? |
|---|---|---|
| Channel connectivity (4 OTAs) | ✅ Live | No |
| Booking ingestion | ⚠️ Cron only | YES |
| Rate sync | ✅ Tested | No |
| Parity enforcement | ⚠️ Detects only | YES |
| Rate plans & calendar | ✅ Complete | No |
| Forecast integration | 🔴 Missing | YES |
| Core reports (7x) | ✅ Live | No |
| Tax/GST compliance | ⚠️ Stub | YES |
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