Integrated Multiple PMS and Hotel Data Sources
MEV built and stabilized integrations for systems including Opera v5 and Oracle extracts, Opera Cloud/OHIP, Stayntouch, SMS|Host, RoomMaster, RoomKey, Marriott, and Hilton data feeds.
Source channels: REST APIs, SFTP, email through AWS SES, and S3 uploads.
Format handling: XML, CSV, JSON, TXT, XLSX, and zipped DBF exports were detected, converted, and routed to the correct workflow.
Common analytics format: Each integration used source-specific rules but produced records that the same analytics product could process.
Built the Serverless Ingestion and Normalization Pipeline
The pipeline separated source ingestion, format conversion, normalization, database writes, and snapshot creation into observable AWS workflows.
File ingestion: S3 events triggered Lambda functions that mapped hotel IDs, identified the integration and file format, and converted files to Parquet or CSV when required.
Workflow orchestration: EventBridge scheduled property-specific processing. AWS Step Functions selected the integration flow and coordinated choice, wait, iteration, sequential, and parallel processing paths.
Query and normalization: Athena and the AWS Glue Data Catalog queried processed files in S3. Python functions applied common and PMS-specific transformation rules.
Analytics writes: Normalized rows were written to the analytics database and used to create daily data snapshots.
Implemented Daily, Historic, Validation, and Recovery Workflows
Hotel data did not arrive in one consistent pattern. Each integration had its own file combinations, arrival times, and processing deadlines.
Daily builds: Incremental processing ran according to the property schedule and the readiness of required source files.
Historic builds: Longer rebuilds supported property onboarding, corrupted-data recovery, and features that required backfilled records.
Processing controls: The system prevented duplicate daily builds, processed missed dates in order, and limited bulk historic work to protect database replication and queues.
Validation and alerts: Source-file status, data validation, Step Functions execution results, Slack alerts, and email reports showed when data was missing or a workflow failed.
Built the Analytics Application and Production Operations Layer
The application separated operational configuration from processed analytics data and exposed the results through APIs and reporting interfaces.
Dual-database design: The application database held users, property settings, and configuration. A separate analytics database stored normalized hotel data and snapshots.
Application layer: A Revenue App API and internal Revenue API connected the PostgreSQL data layer to the Vue.js product.
Reporting: QuickSight reports and product dashboards presented hotel performance, revenue, pace, forecasting, and historical trends.
Production operations: CircleCI, CloudWatch, Sentry, Slack, and failed-task queues supported deployment, monitoring, troubleshooting, rebuilds, and ongoing data operations.