TA Portal · Tech Lead · Oct 2023 — Present · 1 min read
Re-platformed the Travel Advisor portal off Salesforce Experience Cloud.

- 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
- 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.
- 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.
- 03
Release flags and fast-forward release pointers
Trade-off: More process per release, in exchange for safe launches and one-step rollback.
Architecture
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
- 01
Write the decision down (an ADR) while the trade-off is fresh; future you will ask why.
- 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?