Case study 02 · Client work at Setup Phils, Inc.
International Student Fair PlatformOne frontend for fairs in 40 cities across 18 countries
- Role
- Sole frontend developer (with a separate backend team)
- Client
- BMI Global Education (part of Times Higher Education)
- Timeline
- Live since 21 October 2024 · ongoing
- Stack
- Next.js, React, Headless WordPress, Amazon S3, Cypress
The 30-second version
- What it is
- Websites where students find international education fairs and register to attend.
- The problem
- The old WordPress sites reportedly took two to five minutes to load, and every brand needed its own look.
- My role
- The only frontend developer: multi-domain rendering, performance, caching, security, and Cypress tests.
- Key challenge
- Changing one shared codebase without breaking any individual site.
Outcome
The client reported a faster platform and happier marketing, student, and exhibitor audiences.
Client-reported
Overview
A family of fair websites in different countries, languages, and brands — all running from one shared repository.
Students discover in-person education fairs and register to attend. Universities and schools exhibit to meet them.
Business context
- The fair websites are one part of a 14-system platform that runs 60–80 international student-recruitment fairs a year, in 40 cities across 18 countries.
- Each brand has its own layout, language, and content.
- The marketing team still manages content in WordPress — that workflow had to stay.
The problem
The previous WordPress sites had substantial performance problems.
- Some pages reportedly took two to five minutes to load.
- Registration is the whole point of the site — slow pages put that at risk.
- A faster stack still had to respect each brand's design.
My role
I was the only frontend developer on the platform. The backend team owned the APIs and content pipeline; everything students see was mine:
- Developed and maintained frontend experiences across multiple domains.
- Made sure WordPress-managed content rendered correctly on each site.
- Supported different designs and configurations in the shared repository.
- Worked on performance optimization and caching.
- Wrote Cypress automated tests to catch regressions, later handed over to the QA team.
- Built language-aware steps in the multi-step registration flow, with session-backed progress so students can't land on the wrong step.
- Added calendar and mobile wallet pass actions to the registration confirmation page.
- Blocked registration for cities that are already at full capacity.
- Improved city fair page titles and metadata for search and sharing.
- Set up Sentry error monitoring and fixed hydration, missing-data, and browser-specific layout bugs.
- Wrote unit tests for date-range formatting and webinar sorting.
Technical approach
WordPress supplies content, images, SEO data, and site configuration. A shared frontend renders it per domain.
WordPress
Content, images, SEO, site config
JSON on Amazon S3
Prepared by the backend
Shared frontend
One repository · Next.js caching
Rendered per domain
- ExpoPosgrados
- ExpoEstudiante
- Education in Ireland
- Salão do Estudante
- THE Vietnam
- + more brands and cities
More technical detail
The backend prepares WordPress content as JSON and stores it in Amazon S3. The frontend reads those files rather than querying WordPress on every request.
The backend team refreshes those JSON files every 6 hours. Early on, the backend and frontend cache refreshes overlapped, so I set the Next.js cache to revalidate every 24 hours and the browser cache to every 6 hours.
Domain-level configuration decides which layout, language, and branding each site gets.
I reworked how content files are loaded: site IDs are normalized, file reads are cached, and a few unnecessary internal request hops were removed.
A missing content file now fails loudly and is reported, instead of quietly returning nothing — and a missing translation falls back to the default language so the page stays usable.
URL building was hardened to work correctly behind proxies and forwarded hosts.
A shared language list with flags and labels covers more than 15 languages; registration and exhibitor pages are localized in English, Portuguese, Spanish, and Vietnamese.
UI/UX decisions
- Keep each brand's identity, language, and content intact instead of forcing one template.
- Protect the registration flow above everything else.
ExpoEstudiante
Spanish · 2 screenshots
Challenges & trade-offs
- Optimizing performance across many domains at once.
- Keeping cached content correct — fast but stale isn't a win.
- Bots and attackers probing the sites for WordPress admin pages, repository files, and environment files.
- Preserving each site's branding and layout requirements.
- Preventing a fix on one site from breaking another.
- Keeping event registration reliable throughout.
Shutting out bot traffic
While monitoring Sentry, I noticed a steady stream of bot traffic: requests for WordPress admin pages that no longer existed, and attempts to fetch repository and environment files.
I rewrote the middleware to accept only the country and city routes where fairs are actually running. Anything else is blocked before it reaches a page.
I also traced the patterns behind the remaining bot traffic and reported them to the team's AWS engineer, who blocked them at the infrastructure level.
Results & evidence
- Client-reported· From analytics and A/B testing
+67% event sign-ups on the new platform.
- Client-reported
The client reported that the new platform was faster.
- Project notes· Measured with Pingdom
Pages load in about 2 seconds.
- Client-reported
The client reported that the marketing team, students, and exhibiting schools were happier with the experience.
- Work record
Cypress end-to-end tests covering 27 websites in 5 languages, later handed to the dedicated QA team.
- Platform usage · whole team· 2025
Since going live in October 2024, the platform has taken over 110,000 registrations across 2025.
- Platform usage · whole team· Spring 2026
Over 53,000 registrations in Spring 2026.
- Platform usage · whole team· to 9 Oct 2026
Over 51,000 registrations so far in Fall 2026, with more fairs still to run.
| Period | Reported visitors |
|---|---|
| Jan – Jun 2025 | 51,032,747 |
| Jul – Dec 2025 | 63,641,137 |
| Jan – Jun 2026 | 68,375,548 |
| Jul 2026 – presentpartial period | 26,848,412 |
Platform-wide figures provided by the client. They aren't unique people, the latest period is partial, and changes aren't attributed to the migration alone — so no growth rate is claimed.
Lessons learned
- At this scale, consistency is a feature — shared components and tests protect every site.
- Caching decisions are product decisions: they decide how quickly content updates reach students.
- Good test coverage is easier to hand over than tribal knowledge.