Membership platform for Zagreb's largest student sports club
Enrolment, membership fees, training attendance and the member lifecycle for twelve sport sections, in one application the club ran for thirteen years — through a full rewrite of the stack, without losing a record.
The challenge
SUBOS runs twelve sport sections at the Martinovka student sports hall in Zagreb, and every semester thousands of students enrol, pay a fee and turn up to training. All of that lived on paper and in spreadsheets: who is a member, who has paid for which section, who came to training, and who has quietly stopped coming. The club needed a system its secretary and trainers could run themselves, and one that would keep working for years on a non-profit budget.
Our approach
We built the application around the three things the club does every week: enrol, collect fees and take attendance. A public enrolment form produces a signed sheet as a PDF, the secretary works from one dashboard with members, sections, reports and exports, and trainers record attendance from their own area per section and session. Fees are modelled per month and section, with warnings sent automatically and a way to waive one. A scheduled job moves members between active, passive, former and unregistered, so the status is always current. When the original stack aged out in 2017, we rewrote the application on a current framework and migrated the data to a new database without a gap in service.
The results
The club got one place where enrolment, money and attendance agree with each other, and ran it for thirteen years, until 2026. By the end of 2019 the database held more than 30,000 recorded training attendances across twelve sections — every one of them entered by the club itself, without us.
What we did
- Built the first version in 2013, with an admin area, a coach area and the public signup page
- Rewrote it in 2017 on a current framework and moved the data to a new database, keeping every member, payment and attendance record
- Built the public enrolment form with spam protection, which generates the signed enrolment sheet as a PDF and mails it to the applicant
- Built the admin and secretary dashboard: members, sections, reports, CSV and Excel exports, blocking, and bulk mail to members
- Built the trainer area, where attendance is recorded per section and session, with filters and sorting
- Modelled membership fees per month, section and member, with automatic payment warnings by mail and a flow for waiving a fee
- Put the member status lifecycle — active, passive, former, unregistered — on a scheduled job, so it no longer depended on anyone remembering
- Ran production for thirteen years: queued mail on background workers, caching, error tracking and a nightly database backup