MZSS Patrol System
From shift sign-up to a GPS-verified QR check-in and payroll.
The challenge
MZSS, the association of ski resort rescuers that I co-founded, staffs ski patrol shifts all winter. Coordinating who works which day, keeping every day within its staff limit, confirming that patrollers were actually on the slope, and calculating what each person is owed used to run through messages and spreadsheets. The association needed one system that handles the whole season, from sign-up to payment, with checks to reduce invalid attendance records.
My contribution
Built a custom WordPress plugin that the association uses through the season. Patrollers sign up for days on a weekly schedule. Admins approve or reject sign-ups, assign a team leader for each day, and configure the season, daily capacity and non-working days. On the day, patrollers check in and out by scanning a QR code at the base, and the plugin turns verified attendance into payments, a weekly budget overview and PDF reports. Email notifications keep everyone informed along the way.
How it works
Check-in is protected in several layers. The QR code carries an HMAC signature, so an altered or incorrectly signed link is rejected. The patroller must be logged in, and the browser's Geolocation API sends their position, which must be accurate to within 150 m and fall inside a 30 m radius of an approved location at the resort, with a small allowance for weaker GPS. The patroller must have an approved shift for that day, and the scan must happen inside the morning check-in window or the afternoon check-out window. Every failure shows a clear message with what to do next, such as going outside for a better GPS signal. A day counts as worked only when both check-in and check-out are recorded, or when an admin confirms attendance manually.
From approved shift to payroll
Apply for a shift
The weekly schedule controls capacity and availability.
Approve the assignment
An administrator confirms the patroller and shift.
Validate QR attendance
Check the signed QR, login, GPS and time window.
Calculate worked days
Check-in and check-out feed pay, budgets and PDF exports.
Failed checks show a corrective message. Administrators can also confirm attendance manually.
Payments & budget
Each patroller has a minimum and a maximum daily rate. The plugin groups checked-in days into streaks of consecutive days, and the daily rate rises step by step from the minimum toward the maximum over up to seven days in a row, rewarding longer commitments. Admins see totals per patroller and per week, compared with a weekly budget they set, including the 11.1% tax, the budget with tax, and what remains. Each patroller's days and earnings can be exported as a PDF, generated by the plugin itself without an external library.
What it covers
- Weekly schedule with capacity per day and non-working days
- Approvals, rejections and a team leader per day
- Trainee patrollers can join days that are already full
- QR check-in and check-out with an HMAC-signed code
- GPS check within a set radius of approved locations, with accuracy limits
- Time windows for check-in and check-out
- Pay rate that grows with consecutive days, between each patroller's min and max
- Weekly budget with tax and remaining balance
- PDF export per patroller, built without libraries
- Approval emails batched with a 10-minute delay, plus rejection and cancellation emails
Gallery
Outcome
The association runs its whole patrol season in one place: patrollers sign up and check in from their phones, QR attendance is checked against location and time rules, with a manual admin confirmation option, and payments and the budget are calculated automatically from verified days instead of by hand.



