What the form intake router costs
The router is one of the cheapest systems in this whole series. Each submission saves a small file, writes a couple of DynamoDB rows, drops a few jobs on a queue, and sends a couple of emails. The hot path calls no model. Bedrock fires only on the few submissions that need a category guess or a borderline-spam second-opinion. 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 500 submissions a month).
- Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
- The hot path costs pennies — no model calls on a normal submission.
- Bedrock fires only on category guesses and borderline-spam second-opinions — a minority of submissions.
- At 2,000 submissions the bill is around $5. At 5,000 it’s around $9.
Cost at three volumes
Where the dollars actually go
Lambda runtime (the bulk). Every submission runs the intake door, the checker, and a handful of small delivery workers. Each is a few hundred milliseconds of arm64 Lambda time. At 500 submissions a month that’s pennies; at 5,000 it’s still well under a couple of dollars. Add the sheet-sync Lambda mirroring the routing sheet every fifteen minutes — a tiny fixed amount — and the Lambda total lands under a few dollars at all three volumes.
SES. The most visible variable cost, because every submission sends two emails: the team notification and the customer reply. SES outbound is $0.10 per thousand sent, so 500 submissions (about 1,000 emails) is around a dime a month; 5,000 submissions is around a dollar. Inbound for the email-fallback lane is the same $0.10 per thousand received and negligible at this scale.
DynamoDB on-demand. Four small tables: submissions, deliveries, audit, and a tiny rate-limit table. A few reads and writes per submission. Pennies a month at any of these volumes.
SQS. A few delivery jobs per submission plus the occasional retry. The first million requests a month are free; an SMB never leaves the free tier. Effectively zero.
S3 + storage. The raw payload per submission plus the mirrored routing sheet. A few hundred KB to a few MB total at SMB volume. Effectively free.
Bedrock (only when something fires it). The hot path uses no Bedrock. The category guess fires only on generic contact-form submissions whose category isn’t fixed by the form; the spam second-opinion fires only on borderline submissions. Each is a Haiku 4.5 call with a few hundred input tokens and a tiny output, a fraction of a cent. Even if a third of your submissions trigger one, it’s a small sliver of the bill at 5,000 a month.
What doesn’t cost money
- API Gateway. Replaced by a Lambda Function URL for the intake door.
- NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
- Always-on compute. No EC2, no Fargate. Nothing runs between submissions.
- A managed form service. No per-submission SaaS fee, and your leads stay in your own AWS account.
- Models on the hot path. Required fields, spam rules, and routing are plain Python. Bedrock fires only on the two exceptions.
How the cost scales
Lambda runtime, DynamoDB, and SES all grow roughly linearly with submission count, because every submission runs the hot path and sends its emails. Bedrock grows with the minority of submissions that need a guess or a second-opinion, so it stays a small fraction even as volume climbs. The bill at 10,000 submissions a month is around $16; at 25,000 it’s around $35. Past those volumes you’d look at batching the audit writes and trimming the emails (a daily digest instead of one-per-lead for low-priority forms), but those are tuning steps, not redesigns.
Set an AWS Budgets alarm at $15/month so anything unusual pages you before the bill matters. The router’s normal-volume bill stays comfortably under that ceiling.
Last post in the series: the engineering reference. Same system, drawn for engineers — service names, Lambda inventory, IAM scopes, DynamoDB schemas, the SQS and DLQ config, and the Function URL setup.
All posts