Part 6 of 7 · Deadline reminder series ~3 min read

What the deadline reminder costs

The deadline reminder is one of the cheapest systems in this whole series. The daily check reads a CSV from S3, does some date arithmetic, writes a few rows to DynamoDB, and posts a handful of messages to Slack. It calls no models on the check. Bedrock fires only when somebody forwards a notice and once a month for the owner summary. At typical SMB volume, the bill is a couple of dollars a month, fixed cost essentially zero.

Key takeaways

  • Around $1.60/month at typical SMB volume (around 100 recurring deadlines).
  • Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
  • The daily check costs pennies — no model calls.
  • Bedrock fires only on inbox notice parsing (a few times a month) and the monthly summary.
  • At 500 tracked deadlines the bill is around $4. At 2,000 it’s around $12.

Cost at three volumes

Monthly cost at three tracked-deadline volumes, broken out by component A vertical stacked-bar chart showing monthly cost in US dollars at three tracked-deadline volumes. The leftmost bar represents 100 tracked deadlines and shows a total around $1.60, dominated by the everything-else slice (Lambda, DynamoDB, S3, EventBridge Scheduler, CloudWatch) with a tiny sliver for Bedrock and a tiny sliver for Textract. The middle bar represents 500 tracked deadlines and shows a total around $4, with the same shape — the everything-else slice grows roughly linearly with deadline count because the daily check still reads every deadline. The rightmost bar represents 2,000 tracked deadlines and shows a total around $12, with everything-else still dominant; Bedrock and Textract stay small in absolute terms because they only fire on the inbox parsing lane (a handful of forwarded notices per month) and the monthly summary. Below the chart is a legend explaining the four sections of each bar: Bedrock (only on inbox parsing and monthly summary), Textract (only on PDFs forwarded to the inbox), AWS Budgets and Secrets Manager (small fixed amounts), and an everything-else bucket for Lambda runtime, DynamoDB on-demand, S3, EventBridge Scheduler, SES (inbound and outbound), and CloudWatch. A note at the bottom: the daily check is the dominant cost, and even that is fractions of a cent per deadline per day. $0 $5 $10 $15 $20 100 deadlines ~$1.60 500 deadlines ~$4 2,000 deadlines ~$12 Bedrock (inbox parsing + monthly summary) Textract (forwarded notices only) AWS Budgets + Secrets Manager (fixed) Everything else (Lambda, DDB, S3, Scheduler, SES, CloudWatch) The daily check is the dominant cost — and even that is fractions of a cent per deadline per day.
Fig 6. Monthly cost at three tracked-deadline volumes. Bedrock and Textract are small slivers because they only fire on the inbox parsing lane and the monthly summary. The dominant cost is the everything-else bucket: the daily check reading every deadline.

Where the dollars actually go

Lambda runtime (the bulk). The checker runs once a day. Each check reads the calendar CSV from S3, iterates the rows, computes days_to_due for each, and decides on a move. At 100 deadlines, that’s a few hundred milliseconds. At 2,000 it’s a couple of seconds. Either way it’s pennies a month. Add the dispatch Lambda firing for each reminder (around five to fifteen reminders a month at 100 deadlines, thirty to sixty at 2,000), the Function URL Lambda for done/snooze/ack-only, the calendar-sync Lambda running hourly, and the drive-sync Lambda every fifteen minutes — the Lambda total still lands under a dollar at all three volumes.

DynamoDB on-demand. Three small tables: dr-reminders, dr-done, dr-audit. Reads are dominant during the daily check (one read per deadline per check, plus chain history). Writes are dispatch events and audit rows. Pennies a month at any of these volumes.

S3 + Storage. The mirrored calendar CSV plus the archived MIME from any forwarded notices. A few hundred KB total at SMB volume. Effectively free.

EventBridge Scheduler. The daily check rule plus deferred dispatch rules from the quiet-hours and holiday gates. A few invocations a day. Pennies.

SES. Inbound for the forwarding lane: $0.10 per thousand received messages (so a couple of cents a year for an SMB). Outbound for email-fallback reminders: $0.10 per thousand sent. Both are negligible at this scale.

Bedrock (only when something fires it). The daily check uses no Bedrock. The inbox parsing lane fires Haiku 4.5 once per forwarded notice: a few thousand input tokens (the Textract output) and a few hundred output tokens (the proposed row JSON), so a fraction of a cent per parse. At a few forwarded notices a month, Bedrock costs cents. The monthly summary is one larger call: write a paragraph that summarizes the month’s reminders, completions, and misses; a couple of cents.

Textract (only on forwarded notices). Per-page pricing; a typical notice is one to four pages. A few cents per parse. At a few notices a month, Textract is a few cents. At 2,000 tracked deadlines with twenty notices forwarded per month, it lands around a dollar.

What doesn’t cost money

  • API Gateway. Replaced by Lambda Function URLs for the done/snooze/ack-only endpoints.
  • NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
  • Always-on compute. No EC2, no Fargate. The checker sleeps 23.99 hours a day.
  • A Knowledge Base. The calendar is structured rows, not free text — deterministic lookup beats vector search here. No embeddings, no Knowledge Base, no S3 Vectors needed.
  • Models on the check. The daily decision is plain Python. Bedrock fires only on the inbox parsing lane and the monthly summary.

How the cost scales

Lambda runtime grows roughly linearly with deadline count, because every deadline is evaluated on every check. DynamoDB grows linearly too. Bedrock and Textract are uncorrelated with deadline count — they only fire when somebody forwards a notice or it’s the first of the month. So the bill at 5,000 tracked deadlines is around $30; at 10,000 it’s around $60. Past those volumes the daily-check model probably stops being right (you’d switch to a partial-check that only evaluates deadlines inside the union of all type lead-time windows), but those are optimizations for very large calendars — not redesigns.

Set an AWS Budgets alarm at $15/month so anything unusual pages you before the bill matters. The system’s normal-volume 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