Part 6 of 7 · Weekly report builder series ~3 min read

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

Monthly cost at three setup sizes, broken out by component A vertical stacked-bar chart showing monthly cost in US dollars at three setup sizes. The leftmost bar represents a small setup (a few sources) and shows a total around $2.40, where the largest slice is Bedrock — the one weekly summary call — sitting above a smaller everything-else slice (Lambda, DynamoDB, S3, EventBridge Scheduler, SES, CloudWatch) and a tiny sliver each for SES-and-storage and fixed services. The middle bar represents a mid setup (more sources, more weekly rows) and shows a total around $5, with the same shape — Bedrock still the dominant slice because each weekly run is one model call regardless of how many rows were gathered, and the everything-else slice growing slowly with data volume. The rightmost bar represents a large setup (about ten sources, heavy weekly volume) and shows a total around $9, with Bedrock still the largest single slice and everything-else grown but still under it. Below the chart is a legend explaining the four sections of each bar: Bedrock (the one weekly summary call), an everything-else bucket for Lambda runtime, DynamoDB on-demand, S3, EventBridge Scheduler, and CloudWatch, SES plus storage (small), and AWS Budgets plus Secrets Manager (small fixed amounts). A note at the bottom: one model call a week is the biggest line — and even that is a fraction of a dollar. $0 $5 $10 $15 $20 small ~$2.40 mid ~$5 large ~$9 Bedrock (the one weekly summary call) Everything else (Lambda, DDB, S3, Scheduler, CloudWatch) SES + storage (small) AWS Budgets + Secrets Manager (fixed) One model call a week is the biggest line — and even that is a fraction of a dollar.
Fig 6. Monthly cost at three setup sizes. Bedrock — the one weekly summary call — is the largest single slice, because each run is one model call no matter how many rows were gathered. Everything else grows slowly with data volume but stays under it.

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