Part 6 of 7 · Form intake router series ~3 min read

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

Monthly cost at three submission volumes, broken out by component A stacked-bar chart showing monthly cost in US dollars at three submission volumes. The leftmost bar represents 500 submissions a month and shows a total around $2, dominated by the everything-else slice (Lambda, DynamoDB, S3, SQS, CloudWatch) with a small slice for SES email and tiny slivers for Bedrock and the fixed costs. The middle bar represents 2,000 submissions and shows a total around $5, with the same shape — the everything-else slice grows roughly linearly because every submission runs the hot path, and SES grows because every submission sends a couple of emails. The rightmost bar represents 5,000 submissions and shows a total around $9, with everything-else still dominant; Bedrock stays small in absolute terms because it only fires on category guesses and borderline-spam checks, a minority of submissions. Below the chart is a legend explaining the four sections of each bar: Bedrock (category guess and spam second-opinion only), SES (team emails and customer replies), AWS Budgets and Secrets Manager (small fixed amounts), and an everything-else bucket for Lambda runtime, DynamoDB on-demand, S3, SQS, and CloudWatch. A note at the bottom: the hot path is the dominant cost, and even that is a fraction of a cent per submission. $0 $5 $10 $15 $20 500/mo ~$2 2,000/mo ~$5 5,000/mo ~$9 Bedrock (category guess + spam second-opinion) SES (team emails + customer replies) AWS Budgets + Secrets Manager (fixed) Everything else (Lambda, DDB, S3, SQS, CloudWatch) The hot path is the dominant cost — and even that is a fraction of a cent per submission.
Fig 6. Monthly cost at three submission volumes. Bedrock stays a small sliver because it only fires on category guesses and borderline-spam checks. The dominant cost is the everything-else bucket: the hot path running on every submission.

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