What the menu sync costs
The sync is one of the cheaper systems in this whole series. It only does work when the menu changes — it reads the new menu from S3, compares it against the channel state, and makes a handful of calls to push the differences. It calls no models in the planner. Bedrock fires only when somebody forwards a supplier price list and once a month for the owner’s summary. At single-restaurant volume, the bill is a few dollars a month, fixed cost essentially zero.
Key takeaways
- Around $3/month at single-restaurant volume (around 120 menu items across the usual channels).
- Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
- The planner costs pennies — no model calls, and it only runs on a change.
- Bedrock fires only on supplier-price parsing (a few times a month) and the monthly summary.
- At 500 items across a few locations the bill is around $7. At 2,000 items it’s around $15.
Cost at three volumes
Where the dollars actually go
Lambda runtime (the bulk). The planner runs only when the menu changes — a sold-out toggle, a price tweak, a new dish. Each run reads the menu JSON from S3, compares it against the channel state, and emits an event per channel that needs a push. That’s milliseconds. The publisher then fires once per channel per change to apply it. A normal restaurant makes a few dozen changes a day at most across all channels; the Lambda total still lands well under a couple of dollars at single-restaurant volume. Add the quick-edit Function URL, the menu-sync mirror, and the supplier parser, and Lambda is still the cheap part.
DynamoDB on-demand. Two small tables: ms-state (the last accepted value per item per channel) and ms-audit (every action). Reads happen on each planner run; writes are one per push and one per fix. Pennies a month at any of these volumes.
S3 + Storage. The mirrored menu JSON, the generated PDFs, and the archived MIME from any forwarded price lists. A few MB total at SMB volume. Effectively free.
EventBridge. The change events from the planner to the publisher, plus the scheduled digest and summary rules. A few hundred events a day. Pennies.
SES. Inbound for the supplier-price lane: $0.10 per thousand received messages (so a couple of cents a year for one restaurant). Outbound for the weekly digest and monthly summary emails: $0.10 per thousand sent. Both are negligible at this scale.
Bedrock (only when something fires it). The planner uses no Bedrock. The supplier-price lane fires Haiku 4.5 once per forwarded list: a few thousand input tokens (the Textract output) and a few hundred output tokens (the matched-price JSON), so a fraction of a cent per parse. At a few price lists a month, Bedrock costs cents. The monthly summary is one larger call: write a paragraph that summarizes the month’s changes, auto-syncs, and rejections; a couple of cents.
Textract (only on forwarded price lists). Per-page pricing; a typical supplier list is one to five pages. A few cents per parse. At a few lists a month, Textract is a few cents to a dollar. At chain volume with twenty lists forwarded per month, it lands around a dollar or two.
What doesn’t cost money
- API Gateway. Replaced by Lambda Function URLs for the quick-edit page and the Slack fix buttons.
- NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
- Always-on compute. No EC2, no Fargate. The system does nothing between changes.
- A Knowledge Base. The menu is structured rows, not free text — deterministic comparison beats vector search here. No embeddings, no Knowledge Base, no S3 Vectors needed.
- Models in the planner. The decision is plain comparison. Bedrock fires only on the supplier-price lane and the monthly summary.
How the cost scales
Lambda runtime grows with the number of pushes, not the number of items sitting still — an item nobody changes costs nothing to keep in sync. So the bill tracks how often the menu changes and how many channels each change touches. DynamoDB grows the same way. Bedrock and Textract are uncorrelated with item count — they only fire when somebody forwards a price list or it’s the first of the month. So a busy chain with 2,000 items and many channels lands around $15; a quiet single restaurant lands around $3. Past chain volume you’d batch pushes per channel to cut the per-call overhead, but that’s an optimization for very large groups — not a redesign.
Set an AWS Budgets alarm at $25/month so anything unusual pages you before the bill matters. The sync’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, SES rule set, and the channel-adapter contract.
All posts