Cutting a EU hotel group's agency staffing spend by 70% with intelligent staff allocation
2,000+ employees across multiple properties had no visibility across each other. The agency-temp call kept getting made even when staff sat idle next door.

The challenge
A multi-property hotel group's staffing problem looks like a scheduling problem. It's actually an information problem.
Each property in this group managed its workforce independently. Front desk supervisors, housekeeping leads, food service managers — all scheduled their teams based on local data. Their own bookings, their own headcount, their own read of upcoming demand. Accurate for that hotel. Completely blind to the rest of the group.
The consequence was predictable. A Lisbon property running at 45% occupancy might have housekeeping staff with three free shifts this week. A second property across the city runs at 95% occupancy and scrambles to fill those same shifts through a staffing agency. Neither manager knows the other's situation. The outsourcing call gets made.
This pattern repeated across the portfolio, across every busy period, throughout the year. Outsourcing agencies charge premium rates for last-minute requests at peak times. The group was paying those rates constantly, for shortfalls internal capacity could have covered — if anyone had been able to see it. More than €1M a year in agency spend that nobody had a clear picture of and nobody had a clear plan to reduce.
Beyond the cost, the operational standardisation problem made cross-property rotation impractical even when managers wanted to try it. Different properties had evolved different shift structures and staffing ratios over time. Moving a staff member between properties created scheduling friction.
What we learned
Local optima compound to wasteProperty managers making rational local choices, blind to peer capacity, create systematic group-level overspend.Surplus costs as much as shortageAgencies charge full premiums for gaps that internal capacity could cover — if anyone knew the capacity existed.Independent evolution blocks rotationWhen each property built different shift structures over time, moving staff between them creates friction.
The solution
The discovery insight that shaped everything else: the problem wasn't bad judgment. Managers were making rational decisions with incomplete information. A property manager looking at next Tuesday's booking sheet with no visibility into other properties will make a sensible local decision that produces a bad group-level outcome. The challenge was informational. If managers could see cross-property capacity and demand in one place, they'd naturally make better allocation decisions before resorting to agencies. The AI optimisation layer would then amplify that effect by finding solutions across the combinatorial complexity no human could navigate manually.
That sequencing — visibility first, then optimisation — shaped every subsequent engineering decision.
Twistag delivered the full platform in four months. The foundation is a unified data layer that aggregates booking, occupancy, and staffing data from every property. This was the hardest engineering problem on the project. Hotel groups often run properties on different PMS platforms due to acquisitions, brand standards, and legacy infrastructure. We built a normalisation layer that ingests occupancy data regardless of source PMS, creating a consistent canonical representation of each property's state — rooms occupied, staffing levels active, capacity available by department and shift.
On top of that data layer sits the optimisation engine, built on Google OR-Tools. Given the canonical state of every property's capacity and demand for the upcoming planning window, OR-Tools calculates optimal staff rotations across properties subject to operational constraints: shift structures, role qualifications, geographic feasibility, employee preferences. It produces specific, actionable recommendations — "rotate three housekeeping staff from Property A to Property B for Tuesday-Thursday, projected saving €X" — alongside the cost saving for each suggestion.
The infrastructure runs serverless on AWS. App Runner handles the application services, Lambda manages the optimisation jobs that fire when occupancy data updates. The system stays cheap when nothing's changing and scales when demand patterns shift across the portfolio.
What this shaped
| Visibility before optimization | Let managers see cross-property capacity first — most savings happen once they can act on it. |
| Normalise before you optimise | Translate every PMS into one canonical schedule state so any algorithm can reason across properties. |
| Recommend, don't mandate | Show specific rotation options with savings per option — managers move faster when they're advised, not instructed. |
The impact
The group went from blind to visible across 2,000+ employees in four months. The mechanism for the cost reduction was simpler than the math: for the first time, managers could see what they had before deciding they needed more.
The result was a 70% reduction in agency-temp spend. The €1M+ annual outsourcing line item became a small fraction of itself, with internal capacity covering most of what used to be a permanent shortfall.
The architectural lesson — and the reason Twistag now defaults to "visibility first, optimisation second" on operations work — is that most cost in operations-heavy businesses is paid at the local-decision level by managers who don't have group-level information. The optimisation layer is valuable. The data layer is what makes it possible.
What this proved
| Information asymmetry was the cost | Once each manager could see peers, rational local decisions started producing good group outcomes on their own. |
| Visibility plus algorithm compounds | First gain comes from seeing capacity. Second gain comes from algorithmic pattern matching on top of it. |
| Silos pay their own price | Operational isolation between locations costs more than any single optimization reclaims — the structure itself was the bug. |
Technologies used
- Google OR-Tools
- AWS Lambda

