Travelopia

TA Portal · Tech Lead · Oct 2023 — Present · 1 min read

Re-platformed the Travel Advisor portal off Salesforce Experience Cloud.

Internal tool
Travel Advisor Portal sign-in
ADRs
14
Test files
150+
Environments
3

The problem

The advisor portal ran on Salesforce Experience Cloud, so every content change depended on the Salesforce team.

What we did

  • Built the frontend in Next.js on the Helix design system, reading trip and resource content from headless WordPress over WPGraphQL.
  • Built a NestJS backend on Railway for Cognito login, registration with business approval, single-use emailed password links, agency lookup, profiles and downloads, backed by Salesforce and Postgres.
  • Added scheduled jobs for advisor account sync, expired-invite resend and an onboarding report.
  • Put CloudFront and AWS WAF (managed rules, rate limiting, geo deny-list, Bot Control) in front of the API, defined in AWS CDK for dev, staging and production.
  • Set up Vercel Flags, fast-forward release pointers with an approver gate, one-step rollback, 14 ADRs and a CI-checked feature map.

Key decisions

  1. 01

    Single-use password links emailed by our backend

    Trade-off: We own an email flow, in exchange for full control over how advisors set and reset passwords.

  2. 02

    A CloudFront and WAF edge defined in AWS CDK

    Trade-off: An extra layer to deploy per environment, in exchange for managed rules, rate limiting and Bot Control on every request.

  3. 03

    Release flags and fast-forward release pointers

    Trade-off: More process per release, in exchange for safe launches and one-step rollback.

Architecture

BrowserNext.json VercelWordPress CMSCloudFront+ WAFNestJS onRailwayCognitoSalesforcePostgres

Hover or tab through the components to trace the data path.

  • Browser — Travel advisors
  • Next.js on Vercel — Helix design system, Vercel Flags
  • WordPress CMS — Trips and resources over WPGraphQL
  • CloudFront + WAF — Managed rules, rate limit, Bot Control
  • NestJS on Railway — Auth, registration, profiles, jobs
  • Cognito — Advisor identities
  • Salesforce — Advisors, agencies, requests
  • Postgres — Prisma, account sync

Screenshots

  • Portal home with featured trips

  • Trips Hub with filters

Result

Advisors get an on-brand portal the business can update without the Salesforce team, shipped behind flags with staged releases and rollback.

What I learned

  1. 01

    Write the decision down (an ADR) while the trade-off is fresh; future you will ask why.

  2. 02

    A feature map checked in CI keeps a fast-moving codebase navigable for people and agents.

Stack

  • Next.js
  • NestJS
  • TypeScript
  • Prisma
  • PostgreSQL
  • AWS Cognito
  • Salesforce
  • WPGraphQL
  • AWS CDK
  • CloudFront + WAF
  • Railway
  • Vercel Flags

Want something like this for your business?