Skip to content
Camille Monis
All selected work

Case study 01 · Client work at Setup Phils, Inc.

Times Higher Education Events WebsiteGetting a five-minute WordPress site up to speed

Role
Frontend developer
Client
BMI Global Education (part of Times Higher Education)
Timeline
2023 · my first project at Setup Phils
Stack
React, Node.js, Express.js, Headless WordPress, Redis

The 30-second version

What it is
The public website where students find and join Times Higher Education's online events and webinars.
The problem
The WordPress site was very slow — some pages reportedly took around five minutes to load, discouraging students from registering for events.
My role
Frontend developer on a headless WordPress migration to React, Node.js, and Express.
Key challenge
Modernizing a slow legacy site while keeping events easy to manage.

Outcome

The client reported a GTMetrix Grade A — a first for their projects.

Client-reported

Overview

One of the first projects I worked on for this client: replacing a slow WordPress-rendered website with a headless WordPress setup and a React frontend.

It became my introduction to legacy modernization, performance work, and server-side caching.

Business context

  • The site promotes Times Higher Education's online events and webinars for students, and appears in THE's official events listing.
  • Students use it to discover events; the client team uses it to publish and manage them.

The problem

The original WordPress build had serious performance problems.

  • Some pages reportedly took around five minutes to load.
  • The slow experience made students less likely to register for events.

My role

I worked independently on the migration and its frontend experience. My contributions:

  • Contributed to migrating the legacy WordPress website.
  • Worked on performance and the overall experience.
  • Implemented Redis caching for homepage, article, location-based fair, and webinar question data.
  • Helped make event management easier for the client.
  • Optimized the navigation bar and started the shared filter and header components.
  • Moved third-party keys out of the contact and registration forms so they never reach the browser.
  • Worked on the registration submission flow, with spam protection verified on the server.
  • Set up separate development, test, and production environments.
  • Wrote unit tests for webinar date sorting and timezone conversion.

Technical approach

WordPress remained the content management system, while React rendered the site separately. The Express backend fetched content through APIs prepared by the backend team and cached the responses in Redis.

Before and after the migrationConceptual diagram · not a screenshot

Before

  1. Visitor

  2. WordPress site

    Some pages reportedly took ~5 minutes

After

  1. React frontend

  2. Node.js + Express

    Serves the data the pages need

  3. Redis cache

    Reuses data instead of refetching

More technical detail

This is a headless WordPress architecture: WordPress content is processed and exposed through APIs by the backend team. The Express backend fetches those APIs, checks Redis first for cached data, and on a cache miss fetches fresh data, stores it in Redis, and returns it. Homepage, article, location-based fair, and webinar question data are cached for 12 hours.

I also created a scheduled cron job to refresh the cache twice daily at midnight and noon. When enabled, it clears Redis, reloads homepage data, collects webinar slugs, and preloads related article pages. The job is defined in the server entry point but currently commented out, so scheduled refreshes are not running by default.

The homepage detects the visitor's country and shows the events most relevant to them first.

One of my biggest challenges was displaying webinar times correctly in each visitor's browser. The app detects the browser timezone, converts each webinar's original date and time to local time, and uses the converted time to display and sort upcoming and past webinars. Unit tests cover the sorting and timezone conversion.

UI/UX decisions

The priority was simple: get students to event information quickly, and keep publishing straightforward for the client.

Full-page screenshot of THE Student events listing, with country selection and previous webinar cards.
Events listing. The events landing page with country selection and a list of previous webinars.
Full-page screenshot of a webinar detail page with a recorded-video banner, contact form, webinar information, and speaker details.
Archived webinar page. An archived webinar detail page with its registration form. There is no current upcoming event available to capture.

Challenges & trade-offs

  • Modernizing a live site without disrupting upcoming events.
  • Improving performance while learning a new caching layer on the job.

Results & evidence

  • Client-reported

    The client reported receiving a GTMetrix Grade A for this site — described as a first for their projects.

  • User feedback

    Users reported that managing events became easier.

  • Client-reported

    The client was happy with the new experience.

  • Work record

    Unit tests for webinar date sorting and timezone conversion, including empty-input cases.

Lessons learned

  • Look past the page when something is slow — data fetching and caching are part of the experience.
  • Save a baseline before you start, so improvements can be shown, not just described.