← Back to all projects

New Hotels Development (Arcadia Resorts Club)

Portal V2 Backend (Arcadia)

Reservation, member, and finance aggregation API for a hospitality / timeshare resort membership portal.

Timeframe
May 2023
Team Size
2
Domain
Hospitality / Timeshare & Vacation Ownership
Dev environment

New Hotels Development (Arcadia Resorts Club)

Portal V2 Backend (Arcadia)

Portal V2 is the backend that powers an internal management portal for a hospitality and timeshare membership business. It aggregates and normalizes data from many external systems — the Shiji PMS, SuiteCRM, TrackResults, Equiant loan servicing, RCI exchange feeds, and several hotel platforms — into a single PostgreSQL data model.

The Express API serves authenticated portal users data on members, reservations, finances, and more, while scheduled jobs keep everything in sync. Where booking platforms exposed no API, I built headless Selenium scrapers to extract reservation data. The service runs in Docker on AWS ECS Fargate behind a load balancer, backed by RDS PostgreSQL.

  • Scheduled, incremental reservation sync from the Shiji PMS across multiple properties
  • Multi-source data aggregation (PMS, CRM, finance, and exchange systems) into a unified Postgres model
  • Selenium-based scrapers for hotel platforms lacking APIs (ChoiceAdvantage, SkyTouch, Little Hotelier, TrackResults)
  • Session-based authentication and role-based access control with Passport and a Postgres session store
  • Automated report ingestion from Outlook via Microsoft Graph and transactional email via Mailchimp
  • Document and file generation (docxtemplater, CSV exports, archiving)
  • Member finance and loan tracking (aging, due dates, loan status mapping) via Equiant
  • Cron-driven background jobs for syncing, caching, nights calculations, and scheduled reports

Problem

Several hotel booking platforms exposed no API for reservation data.

Solution

Built headless Selenium (Firefox/geckodriver) scrapers, containerized with the app, to log in and export reservation data.

Problem

Reconciling reservation, member, and finance records across many heterogeneous external systems.

Solution

Normalized all sources into a unified Sequelize/PostgreSQL schema with upsert-based sync and schema validation via Joi.

Problem

Third-party APIs required rate-limited, token-authenticated access at scale.

Solution

Added Redis-backed token caching with mutex-guarded refresh and Bluebird concurrency-limited batch requests.

Languages

TypeScriptJavaScript

Frameworks

ExpressSequelizePassport.js

Databases

PostgreSQLRedis

Tools

JoiPinonode-cronSelenium WebDriver (Firefox/geckodriver)BluebirdMulterdocxtemplaterPizZipArchiverjson2csvcsvtojsonbcryptGulpNodemon

Infrastructure

Deployment
AWS ECS (Fargate), AWS ECR, AWS RDS (PostgreSQL), AWS Elastic Load Balancer, nginx (reverse proxy), Certbot / Let's Encrypt
Cloud
AWS
Containers
Docker, Docker Compose
Other
AWS CloudWatch Logs, Manual deploy shell scripts

Shiji (Enterprise Platform)

Cloud PMS reservation, profile, and configuration data sync

Microsoft Graph API / Azure MSAL

Outlook mailbox automation (report email ingestion)

Mailchimp Transactional (Mandrill)

Transactional email delivery

Equiant

Loan / finance servicing data (aging, due dates, loan status)

RCI Exchange

Timeshare exchange report ingestion

SuiteCRM

CRM owner/referral/document/history sync

TrackResults

Sales CRM customer and purchase data API

ChoiceAdvantage (Choice Hotels)

Reservation data scraping via Selenium

SkyTouch HOS

Reservation data scraping via Selenium

Little Hotelier / SiteMinder

Reservation CSV export scraping via Selenium

  • Built a multi-integration hospitality data platform unifying a cloud PMS (Shiji), SuiteCRM, TrackResults, Equiant finance, and RCI exchange feeds into a single PostgreSQL model.
  • Engineered Selenium-based scrapers to extract reservation data from hotel platforms (ChoiceAdvantage, SkyTouch, Little Hotelier) that lacked public APIs.
  • Implemented scheduled, incremental reservation synchronization with concurrency-controlled batch processing and Redis-backed OAuth token caching.
  • Containerized and deployed the service to AWS ECS Fargate with RDS PostgreSQL, an Elastic Load Balancer, and nginx + Let's Encrypt TLS.