What the weekly report builder costs
The builder is one of the cheapest systems in this whole series. The weekly run reads a few CSVs from S3, does some arithmetic, writes a handful of rows to DynamoDB, makes one Bedrock call, and sends one email. Almost everything is plain Python and costs pennies. The one model call a week is the biggest single line on the bill, and even that is a fraction of a dollar. At typical SMB volume, the total is a couple of dollars a month, fixed cost essentially zero.
Key takeaways
- Around $2.40/month at typical SMB volume (a handful of sources, a few thousand rows a week).
- Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
- The one Bedrock call a week is the biggest single line — and it’s still under a dollar a month.
- Gathering, comparing, and the checks are all plain Python — pennies.
- At a mid setup the bill is around $5. At ten sources and heavy volume it’s around $9.
Cost at three volumes
Where the dollars actually go
Bedrock (the biggest single line). The builder makes exactly one model call a week: hand Claude Haiku 4.5 the computed facts list, get back a short paragraph. That’s a few thousand input tokens and a few hundred output tokens, so a fraction of a cent per run — but because almost nothing else costs anything, it’s still the largest slice of the bill. Four or five calls a month, well under a dollar. The call is the same size whether you gathered 200 rows or 20,000, because the model only ever sees the small facts list, never the raw data.
Lambda runtime. The weekly run reads the source CSVs from S3, computes the figures and comparisons, runs the checks, and sends the email. At a few sources that’s a second or two of compute, once a week. Add the source-sync Lambda mirroring each source on its schedule and the Function URL Lambda for the occasional full-table lookup — the Lambda total still lands in pennies at all three sizes.
DynamoDB on-demand. Two small tables: wr-runs (one row per weekly send) and wr-flags (one row per flagged figure). A handful of writes a week, a handful of reads. Pennies a month at any size.
S3 + storage. The mirrored source CSVs plus the archived report HTML for each week. A few hundred KB to a few MB total at SMB volume. Effectively free.
EventBridge Scheduler. The weekly run rule plus any one-off retry rules from the completeness gate, plus the source-sync schedules. A few invocations a week. Pennies.
SES. Outbound for the report email: $0.10 per thousand sent. One email a week to a handful of readers is a couple of cents a year. Negligible.
What doesn’t cost money
- API Gateway. Replaced by a Lambda Function URL for the full-table lookup link.
- NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
- Always-on compute. No EC2, no Fargate. The builder runs once a week and sleeps the rest.
- A Knowledge Base. The numbers are structured rows, not free text — plain arithmetic beats vector search here. No embeddings, no Knowledge Base, no S3 Vectors needed.
- Models on the hot path. Gathering, comparing, and the checks are plain Python. Bedrock fires once, at the end, to write the paragraph — never to source a number.
How the cost scales
Lambda runtime and DynamoDB grow slowly with the number of sources and the weekly row count, because more data means a slightly longer run. But Bedrock — the biggest line — is flat: one call a week regardless of volume, because the model only ever sees the small facts list. So the bill barely moves as you add sources. A business with twenty sources and very heavy weekly volume lands around $14; past that you’d split the gather step to read sources in parallel, but that’s a tuning detail, not a redesign.
Set an AWS Budgets alarm at $15/month so anything unusual pages you before the bill matters. The builder’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, and EventBridge Scheduler config.
All posts