Part 6 of 7 · Shipping notifier series ~3 min read

What the shipping notifier costs

The notifier is one of the cheapest systems in this whole series. The scheduled check reads a CSV from S3, does some simple comparisons, writes a few rows to DynamoDB, and sends a handful of emails. It calls no models on the check. Bedrock fires only when somebody forwards a carrier email and once a month for the summary. At typical SMB volume, the bill is a couple of dollars a month, fixed cost essentially zero.

Key takeaways

  • Around $2.40/month at typical SMB volume (around 300 orders a month).
  • Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
  • The scheduled check costs pennies — no model calls.
  • Bedrock fires only on forwarded carrier emails (a few a month) and the monthly summary.
  • At 1,500 orders the bill is around $7. At 3,000 orders it’s around $14.

Cost at three volumes

Monthly cost at three order volumes, broken out by component A vertical stacked-bar chart showing monthly cost in US dollars at three order volumes. The leftmost bar represents 300 orders a month and shows a total around $2.40, dominated by the everything-else slice (Lambda, DynamoDB, S3, EventBridge Scheduler, CloudWatch) with a small slice for SES email and tiny slivers for Bedrock and fixed costs. The middle bar represents 1,500 orders and shows a total around $7, with the same shape — the everything-else slice and the SES email slice both grow roughly with order count because more orders mean more checks and more update emails. The rightmost bar represents 3,000 orders and shows a total around $14, with everything-else still dominant and SES email the next biggest slice; Bedrock stays small in absolute terms because it only fires on forwarded carrier emails (a handful per month) and the monthly summary. Below the chart is a legend explaining the four sections of each bar: Bedrock (only on forwarded emails and monthly summary), SES email (every update sent), 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 scheduled check and the update emails are the dominant cost, and even those are fractions of a cent per order. $0 $5 $10 $15 $20 300 orders ~$2.40 1,500 orders ~$7 3,000 orders ~$14 Bedrock (forwarded emails + monthly summary) SES email (every update sent) AWS Budgets + Secrets Manager (fixed) Everything else (Lambda, DDB, S3, Scheduler, CloudWatch) The check and the update emails are the dominant cost — and even those are fractions of a cent per order.
Fig 6. Monthly cost at three order volumes. Bedrock is a small sliver because it only fires on forwarded carrier emails and the monthly summary. The dominant cost is the everything-else bucket (the scheduled check) plus the SES email for every update sent.

Where the dollars actually go

Lambda runtime (the bulk). The notifier runs every 30 minutes during the day. Each check reads the order list CSV from S3, iterates the rows, compares each order’s status to what was last sent, and decides on a move. At 300 orders, that’s a few hundred milliseconds per check. At 3,000 orders it’s a couple of seconds. Add the sender Lambda firing for each update, the webhook Lambda handling carrier posts, the Function URL Lambda for unsubscribes, and the drive-sync Lambda every few minutes — the Lambda total still lands under a couple of dollars at all three volumes.

SES (every update sent). Outbound email is $0.10 per thousand sent. A typical order gets three to four updates over its life (shipped, out for delivery, delivered, and occasionally delayed). At 300 orders that’s around a thousand emails a month — about ten cents. At 3,000 orders it’s ten thousand emails, around a dollar. Inbound for the forwarding lane is the same $0.10 per thousand, and far fewer messages. Email is the second-biggest slice but still small.

DynamoDB on-demand. Three small tables: sn-sends, sn-prefs, sn-audit. Reads are dominant during each check (one read per order per check). Writes are sends, preference changes, and audit rows. Pennies a month at any of these volumes.

S3 + Storage. The mirrored order CSV plus the archived emails from any forwarded carrier messages. A few hundred KB total at SMB volume. Effectively free.

EventBridge Scheduler. The recurring check rule plus deferred-send rules from the quiet-hours gate. A few dozen invocations a day. Pennies.

Bedrock (only when something fires it). The scheduled check uses no Bedrock. The inbox forwarding lane fires Haiku 4.5 once per forwarded email: a few hundred input tokens (the email body) and a few output tokens (the status JSON), so a tiny fraction of a cent per read. At a few forwarded emails a month, Bedrock costs cents. The monthly summary is one larger call: write a paragraph that summarizes the month’s shipments, deliveries, and delays; a couple of cents.

What doesn’t cost money

  • API Gateway. Replaced by Lambda Function URLs for the carrier webhook and the unsubscribe link.
  • NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
  • Always-on compute. No EC2, no Fargate. The notifier wakes up, runs for a second or two, and sleeps.
  • A Knowledge Base. The order list 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 scheduled decision is plain Python. Bedrock fires only on forwarded emails and the monthly summary.

How the cost scales

Lambda runtime grows roughly with order count, because every order is evaluated on every check. SES grows with order count too, since more orders mean more update emails. DynamoDB grows linearly. Bedrock is uncorrelated with order count — it only fires when somebody forwards an email or it’s the first of the month. So the bill at 6,000 orders is around $28; at 12,000 it’s around $55. Past those volumes you’d probably move the check to only re-evaluate orders that aren’t yet delivered, which trims the dominant cost — but that’s an optimization for high-volume shops, not a redesign.

Set an AWS Budgets alarm at $20/month so anything unusual pages you before the bill matters. The notifier’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, the carrier webhook flow, and EventBridge Scheduler config.

All posts