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
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