What the contract summarizer costs
The summarizer only spends money when a contract arrives. There’s no daily tick, no always-on anything — the system sleeps until a file lands, reads it, and goes back to sleep. The cost per contract is the read step (Textract on the pages) plus two short model calls (Haiku to pull the terms, Sonnet to read the few risky clauses). At typical SMB volume that’s a few dollars a month, fixed cost essentially zero.
Key takeaways
- Around $3/month at typical SMB volume (around 40 contracts read a month).
- Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
- The cost is per contract — nothing runs when no contracts arrive.
- Each contract: Textract on the pages, one Haiku call, one Sonnet call on a few clauses.
- At 120 contracts a month the bill is around $7. At 200 it’s around $13.
Cost at three volumes
Where the dollars actually go
Bedrock (the bulk as volume grows). Two calls per contract. The Haiku 4.5 term pull reads the clauses and fills the six fields: a few thousand input tokens, a few hundred output, a fraction of a cent. The Sonnet 4.6 risk read sees only the few clauses that matched the flag search — not the whole contract — so even the stronger model handles a small slice of text per contract, a couple of cents. Together, a few cents per contract. That’s the whole reason the system searches first and reads the strong model second: you pay the bigger model only for the paragraphs that earn it.
Textract. Per-page pricing; a typical contract is two to twenty pages. A few cents per contract to turn the pages into text. This grows linearly with how many contracts arrive, which is why the read slice tracks contract count on the chart.
Lambda runtime. The intake, the reader, the summary writer, and the approve/Function URL handlers each run for a second or two per contract. Pennies a month at all three volumes — nothing runs except when a contract is being processed.
DynamoDB on-demand. Two small tables: cs-jobs (one row per contract read) and cs-audit (one row per approve, send-to-human, or hold). A handful of reads and writes per contract. Pennies.
S3 + S3 Vectors. The raw contracts, the cleaned text, and the summaries, all versioned; plus the clause embeddings in the S3 Vectors index used by the flag search. A few MB per contract at most. Effectively free at SMB volume.
SES. Inbound for the forwarding lane and outbound for delivered summaries: $0.10 per thousand messages each way. A couple of cents a year at this scale.
What doesn’t cost money
- API Gateway. Replaced by Lambda Function URLs for the e-sign webhook and the approve button.
- NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
- Always-on compute. No EC2, no Fargate. The system runs only when a contract arrives.
- A daily tick. Unlike a watcher, there’s nothing to poll. Cost is purely per contract.
- The strong model on everything. Sonnet reads only the few flagged clauses, never the whole contract. The cheap Haiku model does the plain term pull.
How the cost scales
The bill tracks one number: how many contracts you read. Bedrock and Textract are per-contract, so they grow roughly linearly. The everything-else bucket grows slowly because the work per contract is small and the storage is cheap. So 400 contracts a month lands around $25, and 800 around $48. Longer contracts cost a little more (more pages to read, more clauses to search), but the strong-model cost stays bounded because it only ever sees the flagged clauses, not the full document.
Set an AWS Budgets alarm at $15/month so anything unusual — a stuck retry loop, an accidental batch of a thousand files — pages you before the bill matters. The summarizer’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, the S3 Vectors index, Bedrock model IDs, and the DynamoDB schemas.
All posts