Market Intelligence & Crisis Analysis
The Profit-Yield Crisis
Occupancy Paradox
Hotels are filling rooms at 91.6% capacity, yet revenue is declining. High occupancy masks a deeper ADR erosion problem — hotels are discounting to fill beds rather than optimizing yield.
ADR Trap
3-star properties have seen a 13.8% ADR decline to MOP 898. This race-to-the-bottom pricing erodes margins while maintaining the illusion of strong demand through high occupancy numbers.
Target Segment
The “Value-Quality” Traveler: visitors who want quality hotel experiences but are price-conscious. 62% arrive same-day from mainland China, making real-time pricing essential.
ADR Decline by Hotel Category
Strategic & Tactical Demand Drivers
Strategic Drivers — Seasonal Pricing
Transit Catalyst — LRT Barra Station
LRT Barra Station Impact
The new Light Rail Transit Barra Station connects Macau Peninsula hotels directly to the border gate and casino district. This reduces transit friction for same-day visitors, creating opportunities for “unplanned overnight” conversions through strategic pricing triggers.
Tactical Triggers
| Trigger | Threshold | AI Action |
|---|---|---|
| Heat Index | > 33°C | Increase ADR 8–10% — heat drives demand for air-conditioned accommodation |
| Border Wait | > 60 minutes | Activate “Unplanned Overnight” bundles — long waits incentivize staying |
| Event Density Surge | > 175k visitors/day | Increase rates 20% — e.g., ATEEZ at Venetian Arena, March 28 |
| Ferry Delay | > 45 minutes | Activate overnight bundles (15% premium) — stranded travelers need rooms |
| RMB/MOP Rate | > 1.14 | Currency premium for mainland visitors — higher exchange = perceived discount |
| Occupancy | > 85% | Scarcity premium (10% buffer) — high demand justifies yield optimization |
Success-Based Business Model
of Incremental Yield
/month per hotel
Revenue Flow
The hotel only pays when the AI demonstrably increases revenue. Zero risk, pure upside alignment.
Full-Stack AI Architecture
Three-Layer Architecture
Data Factory — Signal Intelligence
15+ Real-Time Data Sources
Real-time crossing wait times, daily visitor counts
Temperature, heat index, severe weather alerts
Monthly occupancy rates, visitor spending data
Upcoming events, festival schedules, concert data
Ferry schedules, delay notifications, capacity data
OTA rate monitoring, competitor pricing signals
Real-time temperature, humidity, forecast data
Travel sentiment, trending Macau content & reviews
Trending topics, travel intent signals from social
Location check-ins, viral travel content analysis
Review sentiment scoring, competitive reputation
Monthly casino GGR, gaming sector health indicator
Public holidays, Golden Week, school breaks forecast
Crowd density estimation via computer vision
Alibaba OTA rates, package deal monitoring
Signal Processing Pipeline
Signal Processor
class SignalProcessor:
"""Process raw data signals with anomaly detection and smoothing."""
def __init__(self, z_threshold=3.0, alpha=0.3):
self.z_threshold = z_threshold
self.alpha = alpha # Exponential smoothing factor
self.history = defaultdict(list)
def process(self, source: str, value: float) -> dict:
self.history[source].append(value)
window = self.history[source][-100:]
# Anomaly detection via Z-score
mean = np.mean(window)
std = np.std(window) or 1e-6
z_score = abs(value - mean) / std
is_anomaly = z_score > self.z_threshold
# Exponential smoothing
if len(window) < 2:
smoothed = value
else:
smoothed = self.alpha * value + (1 - self.alpha) * window[-2]
return {
'source': source,
'raw': value,
'smoothed': round(smoothed, 4),
'z_score': round(z_score, 2),
'is_anomaly': is_anomaly,
'action': 'FILTERED' if is_anomaly else 'PASSED'
}
Smart OTA Collection (Anti-Detection)
| OTA Source | Selector Target | Rate Limit | Status |
|---|---|---|---|
| Ctrip | .hotel-price .price-num | 5 req/min | Active |
| Meituan | .price-wrapper .total | 3 req/min | Active |
| Fliggy | .price-box .price | 4 req/min | Active |
class OTAScraper:
"""Anti-detection OTA price collector using undetected-chromedriver."""
def __init__(self):
self.options = uc.ChromeOptions()
self.options.add_argument('--headless=new')
self.user_agents = self._load_user_agents()
self.proxy_pool = ProxyRotator()
async def collect_price(self, source: str, hotel_id: str):
driver = uc.Chrome(options=self.options)
driver.execute_cdp_cmd('Network.setUserAgentOverride', {
'userAgent': random.choice(self.user_agents)
})
await asyncio.sleep(random.uniform(2, 5)) # Human-like delay
# ... price extraction logic
return {'source': source, 'price': extracted_price}
OTA Channel Inventory Parity
Real-time room inventory status across major OTA channels. When channels show "tight supply," consumer panic-buying psychology enables higher ADR.
ML Prediction Engine
Ensemble Model Architecture
XGBoost Feature Importance
LSTM Architecture
Mean Absolute % Error
Practical ceiling for Macau volatility
Mean Absolute Error
7-day horizon
Ensemble Model Service
class EnsembleModelService:
"""Weighted ensemble combining XGBoost and LSTM predictions."""
def __init__(self, xgb_weight=0.6, lstm_weight=0.4):
self.xgb_model = XGBRegressor(n_estimators=500, max_depth=8)
self.lstm_model = LSTMPricePredictor(
input_dim=20, hidden_dims=[128, 64, 32],
attention=True, dropout=0.3
)
self.weights = {'xgb': xgb_weight, 'lstm': lstm_weight}
self.scaler = RobustScaler()
self.drift_detector = DDM() # Drift Detection Method
def predict(self, features: dict, sequence: np.ndarray) -> dict:
xgb_input = self.scaler.transform(pd.DataFrame([features]))
xgb_pred = self.xgb_model.predict(xgb_input)[0]
lstm_input = torch.FloatTensor(sequence).unsqueeze(0)
lstm_pred = self.lstm_model(lstm_input).item()
ensemble_pred = (
self.weights['xgb'] * xgb_pred +
self.weights['lstm'] * lstm_pred
)
ci_low, ci_high = self._bootstrap_ci(features, sequence)
return {
'price': round(ensemble_pred, 2),
'confidence_interval': (ci_low, ci_high),
'xgb_contribution': xgb_pred,
'lstm_contribution': lstm_pred,
'drift_score': self.drift_detector.score
}
Regional Supply Intelligence (v8)
Supply-side features integrated into the ensemble model to predict scarcity-driven pricing opportunities before occupancy thresholds are reached.
Real-time available 3-star rooms within 2km radius. When area supply drops below 15%, price elasticity collapses — aggressive pricing enabled.
Competing hotels’ remaining room count. If 5 nearby competitors all below 10 rooms, supply exhaustion triggers ceiling-price recommendation.
4-5 star hotel vacancy rate. When upper tier hits “Last Room Available,” demand cascades to 3-star — cross-category spillover effect.
Macau ADR / Zhuhai ADR ratio. When gap exceeds 3.5×, loss-to-Zhuhai risk spikes. Constrains aggressive pricing to prevent cross-border leakage.
OTA-visible room count across Ctrip, Meituan, Fliggy. Scarcity signals on OTA channels boost conversion rate — enables micro-ADR uplift.
Economic Intelligence
Price Elasticity Matrix
| Segment | Weekday | Weekend | Holiday |
|---|---|---|---|
| Leisure | -1.8 | -1.2 | -0.6 |
| Business | -0.4 | -0.5 | -0.3 |
| Group | -1.1 | -0.9 | -0.5 |
Optimal Price Finder
Revenue Lift Attribution
7-Day Demand Forecast
Anomaly Detection
Sudden border crossing surge — 40% above rolling average. Likely event-driven.
OTA pricing anomaly — competitor 3-star dropped 18% below market. Possible error.
Xiaohongshu sentiment spike — viral Macau food tour post driving search interest.
Weighted Competitor Position Analysis
| Competitor | Weight | Their ADR | Gap |
|---|---|---|---|
| Grand Lisboa | 30% | MOP 1,082 | -17.0% |
| Wynn Palace | 25% | MOP 1,250 | -28.2% |
| MGM Cotai | 25% | MOP 1,180 | -23.9% |
| Sands Cotai | 20% | MOP 1,150 | -21.9% |
Weather & Event Impact Model
(<6hr to typhoon)+30%
class AdvancedWeatherModel:
TYPHOON_MULTIPLIERS = {1: 1.05, 3: 1.20, 8: 1.40, 10: 1.60}
HEATWAVE_THRESHOLD = 35 # Celsius
RAIN_THRESHOLD = 5 # mm/hr
def calculate_premium(self, weather: dict) -> float:
premium = 1.0
if signal := weather.get('typhoon_signal'):
premium *= self.TYPHOON_MULTIPLIERS.get(signal, 1.0)
if weather.get('hours_to_landfall', 999) < 6:
premium *= 1.30 # Stranded traveler premium
if weather.get('temperature', 0) > self.HEATWAVE_THRESHOLD:
premium *= 1.25
if weather.get('rainfall_mm', 0) > self.RAIN_THRESHOLD:
premium *= 1.15
return round(premium, 3)
Price Sensitivity Map — Macau Districts
Pricing Engine
Yield-Intensity Formula
Price = Base × (1 + ΣMultipliers) × e(Occupancy × 0.45)Exponential scarcity factor ensures prices accelerate as inventory tightens
Quick Presets
Baseline ADR
Weekday March 2026 average for 3-star Macau Peninsula hotels.
Trigger Multipliers
Value-Gap Ceiling Rule
Dynamic ceiling based on real-time 5-star average
Live Pricing Simulator
Cross-Border Price Barrier (Zhuhai Linkage)
Zhuhai port-area hotels act as virtual auxiliary supply. When Zhuhai is also full or border friction is high, Macau gains pricing sovereignty.
Yield Command Center
Accumulated this month
Incremental Profit Lift — 30 Days
Historical Performance Playback
A/B Strategy Comparison
Conservative Sentiment
Max Yield
Revenue Leakage Tracker
Same-Day Conversion
Mainland visitor walk-in conversion probability
Veto Probability — March 2026
Monthly Earnings Calculator
Recent Price Overrides
| Time | Old Price | New Price | Reason | Multipliers |
|---|
Smart Alert Settings
WeChat Alert Architecture
Real-time pricing opportunity alerts pushed directly to management via WeChat Work for instant verification or veto.
Veto Response Statistics (7-Day)
15-minute response window — defaults to Conservative Sentiment strategy if no action taken.
async def check_pricing_opportunity(recommended_price, current_adr):
"""
Identifies if a pricing increase meets the notification threshold.
"""
increase_pct = (recommended_price - current_adr) / current_adr
if increase_pct >= 0.15: # Calibrated to 15% for v9 pilot
alert_payload = {
"type": "REVENUE_OPPORTUNITY",
"severity": "high",
"message": f"AI identified {increase_pct:.1%} increase opportunity.",
"details": f"Recommended: MOP {recommended_price} | Current: MOP {current_adr}",
"action_required": "Confirm or Veto within 15 mins"
}
# Pushes to the registered WeChat webhook
await trigger_wechat_webhook(alert_payload)
Supply-Demand Imbalance Alert
When city-wide 3-star room supply drops below critical thresholds, the system triggers "Max Yield" strategy recommendations.
Normal pricing mode. 247 rooms available across 12 properties.
Kill-Switch Workflow
| Action | Database Status | User Experience |
|---|---|---|
| Active Service | is_active: true | Full access to command center and live signals. |
| Pending Payment | is_active: true | Access continues; warning banner displayed. |
| Access Withdrawn | is_active: false | Immediate logout; redirected to “Service Suspended” gate. |
Competitor Watcher
No 4-star undercutting detected.
Monitoring 5 nearby 4-star properties
Booking Pace Monitor
42% booked, 90 days out. Normal pace.
Price Freshness
Optimal
Neighborhood Price Heatmap
React Dashboard Code
function YieldCommandCenter() {
const { data: signals } = useQuery('signals', fetchSignals);
const { data: metrics } = useQuery('metrics', fetchMetrics);
return (
<DashboardLayout>
<KPIRow>
<KPICard label="Success Fee Pool" value={metrics?.feePool} format="currency" trend={metrics?.feeTrend} variant="success" />
<KPICard label="Avg ADR Lift" value={metrics?.adrLift} format="percentage" trend={metrics?.liftTrend} />
</KPIRow>
<ProfitChart data={metrics?.dailyProfit} />
<SignalPanel signals={signals} />
</DashboardLayout>
);
}AI Partnership Agreement
Key Partnership Terms
AI-Powered Dynamic Pricing Collaboration
Veto Power
Hotel management maintains final veto authority over all AI-recommended pricing changes. The system recommends; humans decide.
Data Masking
All personally identifiable information is masked using Faker library for PDPA compliance. Only aggregated, anonymized demand signals are processed.
Trial Period
90-day pilot with full performance analytics. No success fees during the first 30 days.
Success Metrics
- ADR improvement ≥ 8% over baseline
- RevPAR growth maintained or improved
- Guest satisfaction scores held ≥ 4.0/5.0
- Pricing recommendation acceptance rate ≥ 70%
RAM/IAM Access Levels
| User Role | Access Method | Security Requirement |
|---|---|---|
| Revenue Managers | Live URL via RAM User | MFA + Office IP Whitelist |
| Operations Staff | Webhook Alerts | Signed/Encrypted Webhook URLs |
| Automated Agents | API Keys / STS | 90-Day Key Rotation + Minimal Scoped Access |
Management Final Approval
Please sign below to authorize the AI pricing partnership agreement.
Production Architecture
Deployment Checklist
System Health
Healthy
Standby
Inactive
Circuit Breaker States
CI/CD Pipeline
name: Deploy Pricing Engine
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t macau-engine .
- run: docker push registry/macau-engine:latest
- run: kubectl apply -f k8s/deployment.yaml
- name: Smoke Test
run: |
curl -sf https://api.macau-engine.com/healthz
curl -sf https://api.macau-engine.com/predict/test
Docker Compose Architecture
Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: pricing-engine
spec:
replicas: 3
selector:
matchLabels:
app: pricing-engine
template:
spec:
containers:
- name: pricing-engine
image: macau-engine:latest
resources:
limits:
cpu: "2"
memory: "4Gi"
livenessProbe:
httpGet:
path: /healthz
port: 8000
Infrastructure Architecture
WeChat Work Interactive Card Payload
async def trigger_wechat_webhook(alert_payload):
"""
Sends a structured card to WeChat Work with Approval/Veto buttons.
"""
wechat_card = {
"msgtype": "template_card",
"template_card": {
"card_type": "button_interaction",
"main_title": {"title": alert_payload["message"]},
"sub_title_text": alert_payload["details"],
"button_list": [
{
"text": "Approve Increase",
"style": 1, # Green button
"key": f"APPROVE_{alert_payload['opportunity_id']}"
},
{
"text": "Veto (Keep Base)",
"style": 2, # Red button
"key": f"VETO_{alert_payload['opportunity_id']}"
}
]
}
}
async with aiohttp.ClientSession() as session:
await session.post(WECHAT_WORK_WEBHOOK, json=wechat_card)
Veto Response Handler (FastAPI)
Receives management decisions from WeChat Work buttons and updates the Pricing Engine in real-time.
@app.post("/api/v1/veto-handler")
async def handle_management_decision(payload: dict):
"""
Receives button interaction from WeChat Work
and updates the Pricing Engine accordingly.
"""
decision_key = payload["button_key"] # e.g., "VETO_12345"
action, opp_id = decision_key.split("_")
if action == "VETO":
# Lock price to MOP 898 baseline in the Feature Store
await feature_store.store_feature("price_lock", opp_id, 898.0)
# Log veto event for the Shadow Report audit
logger.warning(f"Management VETO for Opportunity {opp_id} recorded.")
else:
# Authorize the AI to push the high-yield price
await feature_store.store_feature(
"price_lock", opp_id, payload["recommended_price"]
)
logger.info(f"Management APPROVED increase for Opportunity {opp_id}.")
return {"status": "success", "action": action}
Border-Adjusted Pricing Engine (v8)
def calculate_border_adjusted_price(
macau_base: float,
macau_occupancy: float,
zhuhai_supply: float,
clearance_time: int,
local_ceiling: float = 973
) -> dict:
"""v8: Cross-border price barrier with Zhuhai linkage."""
# 1. Macau local scarcity score
macau_scarcity = 1.15 if macau_occupancy > 0.85 else 1.0
# 2. Zhuhai price anchor factor
# If Zhuhai also full (<10% vacancy) → release pricing power
# If Zhuhai has excess supply (>40%) → suppress Macau markup
if zhuhai_supply < 0.10:
zhuhai_anchor = 1.25 # Zhuhai sold out → Macau sovereignty
elif zhuhai_supply > 0.40:
zhuhai_anchor = 0.85 # Zhuhai plenty → constrain pricing
else:
zhuhai_anchor = 1.0 # Neutral zone
# 3. Border friction factor (clearance time as "cutoff" index)
# >60min wait → travelers won't cross back to Zhuhai
friction_factor = 1.12 if clearance_time > 60 else 1.0
# 4. Supply attrition composite
supply_factor = (1 / max(zhuhai_supply, 0.05)) ** 0.3
# 5. Final adjusted price (capped at dynamic ceiling)
adjusted = macau_base * macau_scarcity * zhuhai_anchor * friction_factor
return {
"adjusted_price": min(round(adjusted, 2), local_ceiling),
"factors": {
"macau_scarcity": macau_scarcity,
"zhuhai_anchor": zhuhai_anchor,
"friction_factor": friction_factor,
"supply_attrition": round(supply_factor, 3)
},
"ceiling_hit": adjusted >= local_ceiling
}
Access Code Validation Middleware
from fastapi import Header, HTTPException
async def verify_subscription_access(access_code: str = Header(...)):
# Query your Supabase 'subscriptions' table
sub_data = supabase.table("subscriptions").select("*").eq(
"code", access_code
).single().execute()
if not sub_data.data or not sub_data.data['is_active']:
raise HTTPException(
status_code=403,
detail="Access withdrawn. Please contact finance."
)
return sub_data.data
Security & Documentation
Model FactSheet
- Training data sourced from Macau PSP (border crossings) and SMG (meteorological services)
- Ensemble model: XGBoost (60%) + LSTM with Attention (40%) — dynamic rebalancing
- Model accuracy: MAPE 4.2% | R² 0.94 | MAE MOP 38
- Feature count: 20 features across 15+ real-time data sources
- Retraining schedule: Weekly incremental, monthly full retrain
- Baseline freeze: MOP 898 (3-star Macau Peninsula, March 2026 weekday avg)
Operational Guardrails
- Auto-Veto: AI recommendations are automatically rejected if they exceed the 30% value-gap ceiling (MOP 1,015 based on 73% of 5-star average MOP 1,391)
- Value-Gap Logic: Price ceiling dynamically adjusts with real-time 5-star market average to maintain competitive positioning
- Management Override: Hotel management retains final veto authority over all AI-recommended pricing changes
- Guest Sentiment Guard: Pricing automatically softens when guest satisfaction scores drop below 4.0/5.0
- Rate Parity Check: Ensures AI-recommended rates don’t undercut OTA published rates by more than 5%
- Circuit Breaker: Automatically falls back to baseline pricing when data source reliability drops below 95%
System Health Guide
- Circuit Breaker States: Closed (normal) → Open (blocked, error rate >5%) → Half-Open (testing recovery). Click states in Production section to simulate.
- Drift Alerts: Score 0.0–0.3 = Within Tolerance (green), 0.3–0.6 = Elevated (yellow, investigate), 0.6+ = Retrain Needed (red, immediate action)
- API Rate Limits: PSP Border (30/min), SMG Weather (60/min), Ctrip OTA (5/min — throttled). Red bars indicate >80% utilization.
- Data Freshness: Green (<1hr), Yellow (1–4hr, acceptable), Red (>4hr, stale — triggers alert)
- Failover Cascade: Primary API → Secondary API → Redis Cache → Historical Average (last resort)
- Key Rotation: Access codes rotated every 90 days. API keys rotated quarterly. MFA tokens refreshed on login.
Network Security Layers
| Layer | Protection | Configuration |
|---|---|---|
| VPC / Network ACL | Subnet-level traffic restriction | Allow only trusted subnets |
| Security Groups | IP Whitelisting (inbound rules) | Hotel office + manager IPs only |
| WAF | SQL injection, XSS, Geo-blocking | Block traffic outside Macau/China |
| SSL/TLS | Data-in-transit encryption | HTTPS enforced, HSTS enabled |
| URL Signing | Temporary authorized URLs | Expiry-based token validation |
System Observatory
Model Drift Detection
Feature Store Status
Latency: <10ms • 847 features cached
Batch updated: 2h ago • 2.4M rows
Prometheus Metrics
Live API Rate Limits
Advanced Metrics Dashboard
Alert Configuration
Alert when price data is > 4 hours old
Alert when drift score exceeds 0.6
Alert on > 15% deviation from forecast
Alert on 3+ consecutive API failures
Performance Dashboard (Live)
Signal Type Action Matrix
Real-time signal classification drives automated pricing actions with UI warnings for management oversight.
Cross-Category Spillover Monitor
When upper-tier hotels (4-5 star) approach capacity, demand cascades downward to 3-star properties, granting temporary pricing power.
Dynamic Supply Attrition Index
Port congestion and ferry delays reduce the effective pool of travelers who can leave Macau, creating locked-in demand for overnight stays.
Security Monitoring
ActionTrail Audit
ActiveCloudMonitor Alerts
ActiveWAF Status
ActiveAccess Audit Log
Key Rotation Schedule
| Credential Type | Last Rotated | Next Rotation | Status |
|---|---|---|---|
| Access Codes | Mar 1, 2026 | Jun 1, 2026 | Current |
| API Keys (STS) | Feb 15, 2026 | May 15, 2026 | Current |
| WAF Rules | Jan 20, 2026 | Apr 20, 2026 | Current |
| SSL Certificate | Dec 1, 2025 | Dec 1, 2026 | Current |
Live Model Accuracy Tracker
Shadow Mode — 30-Day Live Validation
v9 model runs in shadow mode alongside the production engine. Shadow prices are logged but not applied to guests. This validates accuracy against live market conditions before full deployment.
of 30-day validation window
Avg daily revenue gap
Running prediction accuracy
Projected approval rate
Shadow Price Log (Live)
Every pricing cycle, shadow v9 generates a recommendation that is logged but never applied. Production continues using v8.
| Timestamp | Live Price | Shadow v9 Price | Delta | Would Approve? |
|---|
30-Day Milestone Timeline
Baseline calibration. Compare v9 shadow prices against live v8 output.
Veto threshold validation. Monitor 15% threshold acceptance rate in simulation.
Peak window analysis. Focus on 19:00–21:00 leakage delta between shadow and live.
Final decision. If shadow MAPE < 10% and acceptance ≥ 70%, recommend v9 full deployment.
Shadow vs Production Price Comparison
19:00–21:00 Peak Leakage Monitor
Model testing identified the 19:00–21:00 window as the highest revenue leakage period. This panel provides granular hourly monitoring focused on this critical two-hour window.
Activates during 19:00–21:00
Missed yield in window
19:00–21:00 multiplier
Revenue recovered vs leakage
Hourly Revenue Leakage Heatmap
Each cell shows estimated revenue leakage per hour. Red intensity = higher missed yield. Peak window (19:00–21:00) is highlighted.
7-Day Peak Window Leakage Trend
Peak Window Mitigation Actions
| Action | Impact | Status |
|---|---|---|
| Enable +6.5% peak premium during 19:00–21:00 | Recover ~MOP 2,100/week | Active |
| Pre-position WeChat alerts at 18:45 for manager readiness | Reduce veto response time by 40% | Active |
| Auto-trigger Max Yield if supply < 100 rooms during peak | Capture scarcity premium | Pending |
| Suppress OTA rate parity check during peak (Ctrip sync delay) | Avoid auto-match to lower OTA rate | Under Review |
Manager Training Module
Before live pilot begins, all duty managers must understand the v8 supply-side indicators that drive pricing recommendations. This module covers each indicator, how to read it, and when to approve or veto.
Training Completion Status
Module 1: Supply-Side Indicator Reference
| Indicator | What It Measures | Threshold | Action When Triggered |
|---|---|---|---|
| active_neighborhood_inventory | Available 3-star rooms within 2km | < 15% available | Approve aggressive pricing — guests have no alternatives |
| competitor_inventory_level | Nearby competitor remaining rooms | All < 10 rooms each | Approve ceiling-price recommendation |
| upper_tier_vacancy_rate | 4-5 star hotel vacancy | < 10% vacant | Spillover active — approve premium pricing |
| zhuhai_anchor_ratio | Macau ADR / Zhuhai ADR | > 3.5× | VETO — demand will divert to Zhuhai |
| ota_inventory_count | OTA-visible room availability | < 8 rooms on any channel | Approve micro-ADR uplift (scarcity signal) |
| supply_composite_cap | Combined supply-side multiplier | > 1.3× | System auto-compresses — verify output is reasonable |
Module 2: Reading Supply Signals on the Dashboard
Zhuhai Cross-Border Panel
Watch the Anchor Ratio display. When it exceeds 3.5×, the red alert activates. This is your strongest veto signal. A guest can take a 5-minute bus to Zhuhai and save 70%.
Spillover Monitor
When the trigger reads "SPILLOVER ACTIVE", 5-star hotels are near capacity and demand is cascading down. This justifies a premium. Approve recommendations during spillover events.
Supply Scarcity Gauge
Check the city-wide 3-star availability. Below 100 rooms = extreme scarcity. The Max Yield toggle enables ceiling-price recommendations. Only activate with GM approval.
OTA Inventory Panel
When any OTA channel shows "Tight Supply" (< 8 rooms), scarcity is visible to guests. They expect to pay more. Approve small ADR lifts in these windows.
Module 3: Approve/Veto Decision Framework
✓ When to APPROVE
- Spillover is active (upper tier near capacity)
- City-wide supply < 200 rooms
- OTA channels showing tight supply
- Price increase ≤ 15% over current ADR
- Zhuhai anchor ratio < 2.5×
- No major event cancellation in last 24h
✗ When to VETO
- Zhuhai anchor ratio > 3.5× (cross-border leakage)
- Competitor prices dropped > 10% in last hour
- Guest satisfaction scores below 4.0/5
- Supply composite exceeds 1.5× (over-adjustment risk)
- Typhoon signal is active but downgrading
- Group booking cancellation detected
Module 4: Managing the 19:00–21:00 Peak
The peak leakage window requires heightened attention. During this 2-hour period, walk-in demand spikes and pricing sensitivity drops.
Review the Peak Leakage panel 15 minutes before the window opens. Know the current supply state.
The 15-minute veto window is critical. If indicators support the recommendation, approve within 5 minutes to capture the opportunity.
The system auto-compresses supply-side multipliers above 1.3×. If you see the composite cap active, the system is already protecting against over-pricing.
After 21:00, review the peak leakage heatmap. Note which hours had the highest missed yield for the next day’s preparation.
12-Month ROI Dashboard
April 2025 – March 2026
vs. operating cost of $78.78/mo
Per month average
AI-Enhanced Revenue vs Static Baseline — 12 Months
ROI Attribution — Shapley Values
class ROIAttributionModel:
def __init__(self, lookback_hours=24, confidence=0.85):
self.lookback = lookback_hours
self.confidence_threshold = confidence
def shapley_attribution(self, revenue_data: pd.DataFrame) -> dict:
"""Multi-touch attribution using Shapley values."""
channels = ['ai_pricing', 'events', 'weather', 'seasonal']
shapley_values = {}
for channel in channels:
marginal = self._marginal_contribution(revenue_data, channel)
shapley_values[channel] = marginal
total = sum(shapley_values.values())
return {k: round(v/total * 100, 1) for k, v in shapley_values.items()}
7-Day Shadow Report
Competitor Displacement Analysis
| Hotel | Category | Their ADR | Our ADR | Parity Status |
|---|---|---|---|---|
| Grand Lisboa Palace | 4-Star | MOP 1,082 | MOP 952 | Healthy Gap |
| Hotel Riviera | 3-Star | MOP 920 | MOP 952 | Premium +3.5% |
| Hotel Sintra | 3-Star | MOP 880 | MOP 952 | Premium +8.2% |
| Emperor Hotel | 4-Star | MOP 1,050 | MOP 952 | Healthy Gap |
| Hotel Guia | 3-Star | MOP 860 | MOP 952 | Premium +10.7% |
Automated Report Templates
Go-Live Readiness Checklist
Access Code Administration
Generate, manage, and monitor subscription access codes
Code Generator
All Access Codes (4)
| Access Code | Hotel | Status | Expires | Actions |
|---|
Code Statistics
Admin Audit Log
v10 Value-Capture Engine
v10 NEWDynamic Ceiling Monitor
| Condition | Ceiling | Relief |
|---|---|---|
| 5★ Vacancy < 5% | MOP 1,096 | +8.0% |
| 5★ + 4★ Both < 10% | MOP 1,045 | +3.0% |
| Normal conditions | MOP 1,015 | 0% |
Peak Window Urgency (19:00–21:00)
Channel Optimization Advisory
All channels open — standard distribution
Reduce Ctrip/Trip.com allocation, prioritize direct bookings
Close OTA channels — direct bookings only (saves ~15% commission)
v11 Policy-Adaptation Engine
V11 NEWMacro Environment Dashboard
| Factor | Current Value | Model Impact | Status |
|---|---|---|---|
| RMB/MOP Rate | 1.161 | Elasticity ×0.80 | 🟡 Active |
| Visitor Density Peak | 172k/day | Baseline rebased +23% | 🔴 Record |
| Non-Mainland Share | 12% | Blended elasticity | 🟢 Tracking |