Skip to main content
Our work

Product · anonymised

A fair-rostering platform for Microsoft 365

Turning a spreadsheet roster into a system that's actually fair.

  • Product strategy
  • Constraint-solver design
  • SharePoint Framework development
  • Accessibility
  • Testing

The problem

An operations team needed to keep a duty roster running across two daily shifts, every day of the week, for a team of around a dozen staff — and they were doing it by hand in a spreadsheet.

That sounds simple until the real constraints show up. Not everyone can work every shift: some staff are only ever rostered mornings, some only afternoons, some either — a hard, physical constraint, not a preference. Everyone still needs a fair share of the workload, but "fair" can't just mean an even morning/afternoon split, because that would penalise someone who's structurally only available for one shift type. Leave, accrued time off and short-notice unavailability all have to be respected without ever leaving a shift silently uncovered. When someone becomes unavailable, the team needs to resolve it themselves — swap with a colleague or post the shift for anyone eligible to claim — without a manager approving every routine handover, but without that self-service creating double-bookings or bypassing eligibility rules either. And whatever got built had to live inside the organisation's existing Microsoft 365 environment: no new infrastructure, no new vendor, nothing outside what IT already manages and secures.

Off-the-shelf workforce-scheduling tools solve pieces of this. Very few solve the actual fairness problem — most leave "fair" as a manual judgement call exercised while a manager drags shifts around a calendar, rather than something the system actually optimises for.

What was built

A custom web application, built directly on the organisation's existing Microsoft 365 tenant using the SharePoint Framework, that generates a full multi-week roster automatically, lets staff resolve day-to-day changes themselves, and gives managers a clear picture of fairness and coverage without needing to approve every routine handover.

Constraint solver

Generates a full multi-week roster automatically

A deterministic fairness algorithm equalises each person's total shift count over the cycle, while strictly respecting who's capable of which shift, who's on leave, and never double-booking anyone. Every generated roster is reproducible: the same inputs always produce the same result, which matters when a manager needs to explain why the roster looks the way it does.

Self-service

Lets staff resolve day-to-day changes themselves

Staff can request a direct swap with a named colleague, or post an open cover request any eligible colleague can claim, without needing a manager to approve every routine handover — while every hard eligibility rule is still enforced underneath.

Manager view

Routes only the requests that genuinely need a decision

Managers get a clear, at-a-glance picture of roster fairness and coverage health, and only see the requests that actually require their judgement rather than every routine swap.

Everyday reliability

Directory-synced, and built for real devices

Staff profile information syncs from the organisation's own directory rather than being duplicated by hand, and the application works fully across light, dark and system appearance modes, at every screen size from a phone up.

Why this was hard

The interesting engineering problem here wasn't the CRUD — it was the constraint solver. Every generated roster has to satisfy hard rules that can never break (capability, availability, no double-booking) while optimising a soft goal (equal workload) that has no single obviously-correct answer, and doing it deterministically enough that a manager can trust and reproduce the result.

The second problem was trust boundaries. SharePoint doesn't have field-level permissions, so any self-service workflow that lets one person act on a record someone else created needs careful, explicit thought about what that access actually allows — and an honest, documented decision about where the risk boundary sits, rather than treating client-side validation as a security control.

What Friendly Geek delivered

  • SharePoint Framework
  • React
  • TypeScript
  • PnPjs
  • A deterministic fairness algorithm for automatic multi-week roster generation
  • Self-service shift swap and open-cover workflows with enforced eligibility rules
  • Manager triage view with at-a-glance fairness and coverage reporting
  • Directory-synced staff profiles across light, dark and system appearance modes
  • 160+ automated tests covering every hard rostering rule
  • Full keyboard and screen-reader accessibility, including Windows high-contrast support
  • Self-service swap and cover flows verified end-to-end with real signed-in users, not just simulated

The system is live and in daily use, replacing a manual, spreadsheet-based process — generating fair multi-week duty cycles automatically and giving staff a genuine self-service way to handle the routine reshuffling that used to land entirely on one manager's desk.

This case study deliberately does not name the organisation or any individual involved. No screenshots are shown, since a real screenshot of an internal system risks identifying the organisation this description is protecting.

Have a useful software idea that deserves careful treatment?

Talk to Friendly Geek about your idea