Series · 7 parts Published June 18, 2026

Shift scheduler

A serverless scheduler that takes the headache out of staff rotas for a small team. The manager sets who’s available and the shifts that need covering; it drafts a fair weekly schedule that respects availability and hours, publishes it to staff once approved, and handles swap and time-off requests — finding a qualified replacement and routing the swap to the manager for a quick yes or no. It only proposes; the manager approves every schedule and every swap. Seven posts on the same system — one diagram at a time — with an engineering reference at the end.

  1. 01

    A shift scheduler on AWS for a few dollars a month

    The whole system on one page — an intake, a drafter, and a publish piece, plus the rule that the manager approves every schedule and every swap before anything reaches staff.

  2. 02

    How a shift week gets set up

    Three lanes feed the week — the Drive sheet itself, a time-off note lane that reads plain-English requests into dates for one-tap approval, and a recurring template lane that fills in the shifts that look the same every week.

  3. 03

    How a fair rota gets drafted

    A weekly run reads availability, hours targets, and skills, then places people into shifts by rule, preferring whoever is furthest below their target. It picks one of four outcomes per shift: filled, fair-swap, short-staffed, or held. No model on the draft.

  4. 04

    How a schedule reaches the team

    Manager approval first, then per-person delivery, quiet hours, calendar invites, Slack DMs with each person’s own shifts, email fallback, and the four guardrails between the approved draft and the schedule actually landing.

  5. 05

    How a shift swap gets approved

    Three actions on a swap request: cover (find a qualified replacement, route to the manager), drop (give the shift back to the open pool), and time-off (hold the day for the next draft). Every action is logged and needs a manager yes.

  6. 06

    What the shift scheduler costs

    Pennies a month at small-team volume. The drafter runs once a week, calls no models on the draft, and only fires Bedrock on the time-off note lane and the weekly fairness summary.

  7. 07

    Engineering reference: the shift scheduler architecture

    Same system, drawn purely for engineers. Service names, resource identifiers, region, Bedrock model IDs, Lambda inventory, IAM scopes, the SES inbound rule set, EventBridge Scheduler config, and the DynamoDB schemas.

What is a shift scheduler?
A small serverless system that takes the headache out of staff rotas for a small team. The manager sets who’s available and the shifts that need covering; it drafts a fair weekly schedule that respects availability and hours, publishes it to staff once the manager approves, and handles swap and time-off requests by finding a qualified replacement and routing the swap to the manager for a quick yes or no. It only proposes; the manager approves every schedule and every swap.
How much does it cost to run?
About $2.20/month at typical small-team volume (around 15 staff and 80 shifts a week). The fixed cost is essentially zero. The variable cost is dominated by the once-a-week draft run and the swap-matching that fires only when somebody asks to swap. Bedrock is used sparingly, so it stays a small sliver. At 60 staff the bill lands around $9.
Which AWS services does it use?
Lambda (Python 3.14, arm64) with Function URLs for the approve and swap buttons, EventBridge Scheduler for the weekly draft run and publish reminders, DynamoDB on-demand, S3 (with versioning), SES inbound + outbound, Secrets Manager, CloudWatch Logs (7-day retention), AWS Budgets, and Bedrock (Claude Haiku 4.5 via Global cross-Region inference) for reading plain-English time-off notes and the weekly summary. No API Gateway, no NAT Gateway, no always-on compute.
Where does the staff list live?
In a Google Sheet in a Drive folder. One tab lists staff with their role, weekly hours target, and the skills they’re cleared for. Another tab holds each week’s availability and the shifts that need covering. A small drive-sync Lambda mirrors the sheet to S3 every 15 minutes; the scheduler reads from S3 to keep Drive API calls predictable and to get S3 versioning for free.
Does the scheduler use AI?
Sparingly. The draft itself uses no AI — it’s plain Python that places people into shifts by rule. Bedrock Haiku 4.5 fires only when somebody sends a free-text time-off note (it reads “off next Friday for a wedding” into structured dates for the manager to confirm) and once a week for a short fairness summary. The hot path is deterministic by design, so the manager can always see why a shift went to a given person.
Does it ever publish a schedule on its own?
No. The scheduler only proposes. Every draft lands in the manager’s inbox with an Approve, Edit, or Re-draft button. Nothing reaches staff until the manager taps Approve. Swaps work the same way — a qualified replacement is found and the swap is routed to the manager for a quick yes or no, never auto-confirmed. The human stays in the loop on anything that changes who works when.
How does it keep hours fair?
Each person has a weekly hours target in the staff sheet. The draft tracks a running total as it places shifts and prefers whoever is furthest below their target for the next open slot, so the load evens out across the team week to week. It also respects a max-hours cap, required rest gaps between shifts, and skill requirements per shift. A weekly fairness summary shows each person’s hours against target so the manager can spot drift early.
All posts