Event Staffing System: from the application form to the margin on every shift
A web application that replaced scattered forms and Excel sheets: collecting applications, searching profiles, planning shifts and working out costs and margins in real time.
-
HTTP endpoints
-
domain models
-
active application forms
-
+
candidates handled
In brief
- The Event Staffing System is a web application in Python and Flask that handles the whole staffing cycle for events, from the application to the shift.
- Each partner agency has its own application form, configurable without touching the code, but they all write into the same data model.
- Profile search combines more than 20 filters and ready-made templates such as «Available now» or «5+ years experience».
- Supplier costs, client revenue and the margin on every shift are visible while you plan, not at the end of the month.
- In production since June 2025, with privacy consent recorded and documents reachable only through signed links that expire.
What the problem was
The agency was collecting applications through different online forms for each of the employment agencies it works with, and transferring them into Excel sheets by hand. That produced three problems that fed each other: every client wanted a different form, and every new form produced data that could not be compared with the rest; finding the right person, for example «a driver with a category D licence, available in Milan next week, who speaks English», meant opening several sheets and filtering by hand; and margins only came to light at the end of the month, when there was no longer any way to act on them.
On top of that, the data collected includes identity documents, driving licences and residence permits: consent had to be traceable and access control had to be up to GDPR standards.
Different forms, one single data model
Each partner agency has its own application form at a dedicated address. Which fields are visible, which are mandatory and the options in the dropdowns are all configured from the admin panel, without touching the code, and an existing form can be duplicated with its whole configuration.
The decisive choice was not making the database schema dynamic. Every form writes into the same normalised data model, and a configuration table decides for each one what to show and what to make mandatory: the forms are as flexible as if they were dynamic, but the candidates stay comparable and can be queried with ordinary queries. The candidate fills in a guided three-step process, often from a phone, with a CV and a profile photo taken on the spot.
Finding the right person in one click
The search combines more than 20 filters (licence, languages, city of availability, years of experience, rating) and ready-made filter templates that translate the recurring questions: «Recent applicants», «High rating», «Available now», «5+ years experience». They came out of how the operators phrased requests out loud, and they have become the most used way of searching.
Each operator saves their own columns and their order, because somebody looking for drivers and somebody planning shifts look at different data. Profiles are rated with configurable rating categories, archived rather than deleted, and exported to CSV, Excel and PDF.
The margin is visible while you plan
Every shift links a candidate to a supplier and to a client, each with their own hourly rate. The system works out actual hours, supplier cost, client revenue and profit, handling breaks, guaranteed minimum hours, which can differ between supplier and client on the same shift, and extra costs.
Every shift freezes the rate applied at the moment it was created, so adjusting a rate card does not rewrite history. And the calculation lives in a single place in the code: it gives the same result wherever it happens, from creation to inline editing with a double click to bulk import.
Sharing without giving out accounts
The agency’s clients want to see the lists of proposed candidates, but they cannot have an account on the system. Shared links solve the problem: for each one you choose which fields are visible and which filters are applied, with an optional password and expiry, and the number of views is counted. The same mechanism works for sharing shift days.
Personal data treated as such
For GDPR a tick box is not enough: you have to be able to show which notice was accepted, when and by whom. Every consent records the date and time, the IP address, the browser, and the version and fingerprint of the notice in force, and from there the consent PDF for the individual candidate gets generated.
CVs, documents and photos sit in private storage on Azure and the application never exposes their direct address: it generates a signed link with an expiry every time. A link copied and passed on to somebody else stops working by itself.
How it is built
Flask with server-generated pages instead of a single page application: the users are back-office operators on desktops, and server-side rendering cut development time and the maintenance surface. The parts that genuinely need to be responsive (tables, filters, charts, inline editing) are fed by dedicated JSON APIs.
The code is split by functional area into nine blueprints, which made it possible to add the shifts module, which arrived as a later client request, without touching the candidate side already in production. Sensitive features sit behind switches that can be flipped at runtime, to be turned off in seconds without a new release. Azure SQL database with versioned migrations, automatic release to Azure App Service with GitHub Actions.
What was delivered
- Requirements analysis with the agency
- Data model and database on Azure SQL
- Flask back end with 184 endpoints
- Responsive interface with Bootstrap 5 and Chart.js
- Continuous release to Azure with GitHub Actions
- Ongoing development in production
Technical details
- Platform: Web application on Azure
- Year: 2025
- Status: In production
- Technologies: Python, Flask, SQLAlchemy, Azure, Chart.js, Web App, Database
The screenshots come from the production environment: names and contact details are fictitious, and the client’s brand, the partner agencies and the amounts are blurred.
Do you need software like this?
If you have a process you handle by hand today and would like to automate, tell me about it: we work out together whether it makes sense to build a tool on top of it.
Need something similar? This project is an example of custom web app and business system development. The first meeting and the quote are free: write to me and we will talk it through.

