Skip to content
Camille Monis
All selected work

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.

How content reaches every fair siteConceptual diagram · not a screenshot
  1. WordPress

    Content, images, SEO, site config

  2. JSON on Amazon S3

    Prepared by the backend

  1. 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.

Reported website visitor figuresClient-reported
PeriodReported visitors
Jan – Jun 202551,032,747
Jul – Dec 202563,641,137
Jan – Jun 202668,375,548
Jul 2026 – presentpartial period26,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.