Back to Portfolio
FitRoom Experience — Gym Site & Membership Platform

FitRoom Experience — Gym Site & Membership Platform

FitRoom Experience needed a public face and the software to run the business behind it, so the site is both. The front is a bilingual one-pager — hero, eleven services, the live weekly timetable, an about section and contact — plus a memberships page carrying twenty plans and nine offers taken from the owner's printed price card. Behind the sign-in a member registers without choosing a password, books from a timetable that walks forward a whole quarter, joins a waitlist when a class is full, sets one standing weekly booking that renews itself, sees what she has paid and what she still owes, and can export or erase her own data. The owner gets seventeen back-office screens: clients, plans, class types, the schedule, closures, offers, page content, subscriptions, payments, debts and their ageing, the class register, a check-in kiosk for a tablet on the door, an email log with resend, and statistics — revenue, a capacity heatmap, attendance by class family, expiring subscriptions and a CSV export. Nineteen email templates in both languages run over a vendored PHPMailer with retry backoff. Underneath it is plain PHP 8.5 on MySQL across forty-four tables, with Greek as the canonical language: no framework, no Composer, no build step.

Technologies

PHP 8.5 MySQL 9.5 Vanilla JS GSAP PHPMailer Stripe i18n (EL/EN) SEO

Challenges

A gym timetable is not a calendar. A class has capacity, a waitlist, credits that pay for it and a closure that can cancel it, and the owner needed all of that on the one screen she already uses. The gym also had 158 members on the previous website who had to be able to sign in from day one.

Solutions

Credits, bookings and money are one model rather than three, so cancelling a class takes its charge with it and refunding one carries the void along. The recurring-booking window is derived from the booking horizon instead of being its own setting, so the two cannot drift apart. Legacy passwords came across wrapped rather than stored raw, so the existing membership signed in without a reset. Greek is canonical, with accent- and final-sigma folding in every client search so a name is findable however it is typed.