Part 6 of 7 · Shift scheduler series ~3 min read

What the shift scheduler costs

The scheduler is one of the cheapest systems in this whole series. The weekly draft reads a CSV from S3, does some matching, writes a few rows to DynamoDB, and posts a handful of messages to Slack. It calls no models on the draft. Bedrock fires only when somebody emails a plain-English time-off note and once a week for the fairness summary. At typical small-team volume, the bill is a couple of dollars a month, fixed cost essentially zero.

Key takeaways

  • Around $2.20/month at typical small-team volume (around 15 staff, 80 shifts a week).
  • Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
  • The weekly draft costs pennies — no model calls.
  • Bedrock fires only on time-off notes (a few a week) and the weekly fairness summary.
  • At 30 staff the bill is around $5. At 60 staff it’s around $9.

Cost at three volumes

Monthly cost at three team sizes, broken out by component A vertical stacked-bar chart showing monthly cost in US dollars at three team sizes. The leftmost bar represents 15 staff and shows a total around $2.20, dominated by the everything-else slice (Lambda, DynamoDB, S3, EventBridge Scheduler, CloudWatch) with a small sliver for Bedrock and a tiny sliver for SES. The middle bar represents 30 staff and shows a total around $5, with the same shape — the everything-else slice grows roughly linearly with team size because the weekly draft and the per-person publish scale with headcount. The rightmost bar represents 60 staff and shows a total around $9, with everything-else still dominant; Bedrock and SES stay small in absolute terms because they only fire on the time-off note lane (a handful of notes a week) and the weekly summary. Below the chart is a legend explaining the four sections of each bar: Bedrock (only on time-off notes and the weekly summary), SES (only on inbound time-off notes and email fallback), AWS Budgets and Secrets Manager (small fixed amounts), and an everything-else bucket for Lambda runtime, DynamoDB on-demand, S3, EventBridge Scheduler, and CloudWatch. A note at the bottom: the weekly draft and per-person publish are the dominant cost, and even those are fractions of a cent per person per week. $0 $5 $10 $15 $20 15 staff ~$2.20 30 staff ~$5 60 staff ~$9 Bedrock (time-off notes + weekly summary) SES (time-off notes + email fallback) AWS Budgets + Secrets Manager (fixed) Everything else (Lambda, DDB, S3, Scheduler, CloudWatch) The weekly draft and publish are the dominant cost — and even those are fractions of a cent per person.
Fig 6. Monthly cost at three team sizes. Bedrock and SES are small slivers because they only fire on the time-off note lane and the weekly summary. The dominant cost is the everything-else bucket: the weekly draft and the per-person publish.

Where the dollars actually go

Lambda runtime (the bulk). The drafter runs once a week. Each run reads the roster CSV from S3, sorts the shifts, and matches people into them. At 15 staff and 80 shifts, that’s a few hundred milliseconds. At 60 staff it’s a couple of seconds. Either way it’s pennies a month. Add the publish Lambda firing per person each week, the Function URL Lambda for approvals and swaps, the calendar invites, the time-off parser, and the drive-sync Lambda every fifteen minutes — the Lambda total still lands around a dollar at all three sizes.

DynamoDB on-demand. Three small tables: ss-shifts, ss-hours, ss-audit. Writes happen on each draft, publish, and swap. Reads dominate during the weekly run. Pennies a month at any of these sizes.

S3 + Storage. The mirrored roster CSV plus the archived MIME from any forwarded time-off notes. A few hundred KB total at small-team volume. Effectively free.

EventBridge Scheduler. The weekly draft rule, the drive-sync and template-sync rules, plus deferred publish rules from the quiet-hours gate. A handful of invocations a week. Pennies.

SES. Inbound for the time-off note lane: $0.10 per thousand received messages (so a couple of cents a year for a small team). Outbound for email-fallback schedules: $0.10 per thousand sent. Both are negligible at this scale.

Bedrock (only when something fires it). The weekly draft uses no Bedrock. The time-off note lane fires Haiku 4.5 once per note: a few hundred input tokens (the note text) and a few dozen output tokens (the date range JSON), so a fraction of a cent per note. At a few notes a week, Bedrock costs cents. The weekly fairness summary is one slightly larger call: write a short paragraph on each person’s hours against target; a fraction of a cent.

SES inbound parsing. The time-off notes are plain text, so there’s no Textract or document parsing here — just the small SES receive charge and the Bedrock read. That keeps this lane cheaper than the document-heavy lanes in some of the other systems in this series.

What doesn’t cost money

  • API Gateway. Replaced by Lambda Function URLs for the approve and swap endpoints.
  • NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
  • Always-on compute. No EC2, no Fargate. The drafter wakes once a week and sleeps the rest.
  • A Knowledge Base. The roster is structured rows, not free text — rule-based matching beats vector search here. No embeddings, no Knowledge Base, no S3 Vectors needed.
  • Models on the draft. The weekly placement is plain Python. Bedrock fires only on time-off notes and the weekly summary.

How the cost scales

Lambda runtime grows roughly linearly with team size, because the draft matches every shift and the publish sends to every person. DynamoDB grows linearly too. Bedrock and SES are uncorrelated with team size — they only fire when somebody sends a time-off note or it’s the weekly summary. So the bill at 120 staff is around $18; at 250 it’s around $38. Past those sizes a single weekly draft probably stops being the right shape (you’d split the roster by location or department and draft each separately), but those are scaling choices for a much bigger operation — not redesigns.

Set an AWS Budgets alarm at $15/month so anything unusual pages you before the bill matters. The small-team bill stays well under that ceiling.

Last post in the series: the engineering reference. Same system, drawn for engineers — service names, Lambda inventory, IAM scopes, DynamoDB schemas, SES rule set, and EventBridge Scheduler config.

All posts