Part 6 of 7 · Testimonial collector series ~3 min read

What the testimonial collector costs

The collector is one of the cheapest systems in this whole series. The daily tick reads a CSV from S3, does a little date arithmetic, writes a few rows to DynamoDB, and sends a handful of emails. It calls no models on the tick. Bedrock fires only when a customer replies (to clean up their words) and once a month for a short summary. At typical SMB volume, the bill is a couple of dollars a month, fixed cost essentially zero.

Key takeaways

  • Around $2/month at typical SMB volume (around 200 happy moments a month).
  • Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
  • The daily tick costs pennies — no model calls.
  • Bedrock fires only on a customer reply (a clean-up call) and the monthly summary.
  • At 800 moments a month the bill is around $5. At 2,000 it’s around $13.

Cost at three volumes

Monthly cost at three happy-moment volumes, broken out by component A horizontal stacked-bar chart showing monthly cost in US dollars at three happy-moment volumes. The leftmost bar represents 200 moments a month and shows a total around $2, dominated by the everything-else slice (Lambda, DynamoDB, S3, EventBridge Scheduler, CloudWatch) with a small slice for Bedrock and a thin slice for SES email. The middle bar represents 800 moments a month and shows a total around $5, with the same shape — Bedrock grows with the number of replies because each reply fires one clean-up call. The rightmost bar represents 2,000 moments a month and shows a total around $13, with everything-else still dominant; Bedrock stays modest in absolute terms because it only fires on replies (a fraction of moments) and the monthly summary. Below the chart is a legend explaining the four sections of each bar: Bedrock (only on replies and the monthly summary), SES (inbound forwarding plus outbound asks), 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 daily tick is cheap, and each reply costs a fraction of a cent to clean up. $0 $5 $10 $15 $20 200/mo ~$2 800/mo ~$5 2,000/mo ~$13 Bedrock (replies + monthly summary) SES (inbound forwarding + outbound asks) AWS Budgets + Secrets Manager (fixed) Everything else (Lambda, DDB, S3, Scheduler, CloudWatch) The daily tick is cheap — and each reply costs a fraction of a cent to clean up.
Fig 6. Monthly cost at three happy-moment volumes. Bedrock and SES are small slivers because Bedrock only fires on replies and the monthly summary, and SES email is fractions of a cent each. The dominant cost is the everything-else bucket: the daily tick and the dispatch of asks.

Where the dollars actually go

Lambda runtime (the bulk). The collector runs once a day. Each tick reads the candidate CSV from S3, iterates the rows, computes days_since_moment for each, and decides on a move. At 200 candidates that’s a few hundred milliseconds. At a few thousand it’s a couple of seconds. Either way it’s pennies a month. Add the dispatch Lambda firing for each ask (a few hundred a month at 200 moments), the Function URL Lambdas for the reply form and the review buttons, and the drive-sync Lambda every fifteen minutes — the Lambda total still lands under a couple of dollars at all three volumes.

DynamoDB on-demand. Three small tables: tc-asks, tc-state, tc-audit. Reads are dominant during the daily tick (one read per candidate per tick). Writes are ask events, replies, and audit rows. Pennies a month at any of these volumes.

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

EventBridge Scheduler. The daily tick rule plus deferred dispatch rules from the quiet-hours gate. 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 the asks and reminders: $0.10 per thousand sent. At a few hundred asks a month, both are negligible.

Bedrock (only when something fires it). The daily tick uses no Bedrock. Each reply fires Haiku 4.5 twice — once to clean up the words and once for the faithfulness check — both small calls: a few hundred input tokens and a few hundred output tokens, so a fraction of a cent per reply. Only a fraction of asks turn into replies, so at 200 moments a month this is cents. The monthly summary is one larger call: write a paragraph that summarizes the month’s asks, replies, and approvals; a couple of cents.

Forwarded praise. The inbox lane fires one Haiku call per forwarded email to propose a row. A few forwards a month at most, so cents. There’s no document parsing here — praise arrives as plain email text, so no Textract and no per-page charges.

What doesn’t cost money

  • API Gateway. Replaced by Lambda Function URLs for the reply form, the ratings webhook, and the review buttons.
  • NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
  • Always-on compute. No EC2, no Fargate. The collector sleeps 23.99 hours a day.
  • A Knowledge Base. The list is structured rows and each reply is cleaned on its own — there’s nothing to search across. No embeddings, no Knowledge Base, no S3 Vectors needed.
  • Models on the tick. The daily decision is plain Python. Bedrock fires only on replies, forwarded praise, and the monthly summary.

How the cost scales

Lambda runtime grows roughly linearly with the number of candidates, because every candidate is evaluated on every tick. DynamoDB grows linearly too. Bedrock grows with the number of replies, not moments — and only a fraction of asks get a reply — so it stays modest. SES grows with the number of asks. So the bill at 5,000 moments a month is around $30; at 10,000 it’s around $60. Past those volumes the daily-tick model probably stops being right (you’d switch to a partial-tick that only evaluates candidates inside an active ask window), but those are optimizations for very large lists — not redesigns.

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