Preloader
Drag
Dashboard del gestionale staffing eventi con filtri per evento e azienda
Web App

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 summary

In brief

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.

Form di candidatura su smartphone

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.

Filtri avanzati sui candidati per patente, lingue, disponibilita ed esperienza
Creazione di un turno con calcolo automatico di ore, costo del fornitore e ricavo dal cliente

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.

Link condivisi con campi selezionabili, password, scadenza e conteggio degli accessi

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.

Grafici di distribuzione dei candidati per occupazione, stato civile e taglia
The package

What was delivered

In detail

Technical details

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.

Let's talk

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.