Part 6 of 7 · Inventory reorder bot series ~3 min read

What the inventory reorder bot costs

The bot is one of the cheapest systems in this whole series. The daily check reads a CSV from S3, does some arithmetic on each item, writes a few rows to DynamoDB, and posts a handful of drafts to Slack. It calls no models on the check. Bedrock fires only when somebody forwards a stock-count sheet and once a month for the board summary. At typical SMB volume, the bill is a couple of dollars a month, fixed cost essentially zero.

Key takeaways

  • Around $2.40/month at typical SMB volume (around 200 tracked items).
  • Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
  • The daily check costs pennies — no model calls.
  • Bedrock fires only on inbound stock-sheet parsing (a few times a month) and the monthly summary.
  • At 600 tracked items the bill is around $5. At 2,000 items it’s around $13.

Cost at three volumes

Monthly cost at three tracked-item volumes, broken out by component A vertical stacked-bar chart showing monthly cost in US dollars at three tracked-item volumes. The leftmost bar represents 200 tracked items and shows a total around $2.40, dominated by the everything-else slice (Lambda, DynamoDB, S3, EventBridge Scheduler, CloudWatch) with a tiny sliver for Bedrock and a tiny sliver for Textract. The middle bar represents 600 tracked items and shows a total around $5, with the same shape — the everything-else slice grows roughly linearly with item count because the daily check still reads every item plus the POS lane handles more sale events. The rightmost bar represents 2,000 tracked items and shows a total around $13, with everything-else still dominant; Bedrock and Textract stay small in absolute terms because they only fire on the inbound parsing lane (a handful of forwarded sheets per month) and the monthly summary. Below the chart is a legend explaining the four sections of each bar: Bedrock (only on inbound parsing and monthly summary), Textract (only on forwarded stock sheets), AWS Budgets and Secrets Manager (small fixed amounts), and an everything-else bucket for Lambda runtime, DynamoDB on-demand, S3, EventBridge Scheduler, SES (inbound and outbound), and CloudWatch. A note at the bottom: the daily check is the dominant cost, and even that is fractions of a cent per item per day. $0 $5 $10 $15 $20 200 items ~$2.40 600 items ~$5 2,000 items ~$13 Bedrock (inbound parsing + monthly summary) Textract (forwarded stock sheets only) AWS Budgets + Secrets Manager (fixed) Everything else (Lambda, DDB, S3, Scheduler, SES, CloudWatch) The daily check is the dominant cost — and even that is fractions of a cent per item per day.
Fig 6. Monthly cost at three tracked-item volumes. Bedrock and Textract are small slivers because they only fire on the inbound parsing lane and the monthly summary. The dominant cost is the everything-else bucket: the daily check reading every item and the POS lane handling sale events.

Where the dollars actually go

Lambda runtime (the bulk). The checker runs once a day. Each check reads the stock CSV from S3, iterates the rows, computes the reorder point for each, and decides on a move. At 200 items, that’s a few hundred milliseconds. At 2,000 items it’s a couple of seconds. Either way it’s pennies a month. Add the draft-PO Lambda firing for each reorder (a handful to a few dozen a month), the Function URL Lambda for approvals, the pos-handler firing on each sale, the calendar-free drive-sync Lambda every fifteen minutes — the Lambda total still lands under a couple of dollars at all three volumes. The POS lane is the one piece that scales with sales rather than item count, so a busy shop sees a touch more here.

DynamoDB on-demand. Three small tables: ir-orders, ir-state, ir-audit. Reads are dominant during the daily check (one read per item per check). Writes are draft events, approvals, and audit rows. Pennies a month at any of these volumes.

S3 + Storage. The mirrored stock CSV plus the archived MIME from any forwarded sheets. A few hundred KB total at SMB volume. Effectively free.

EventBridge Scheduler. The daily check rule plus deferred draft rules from the quiet-hours gate. A few invocations a day. Pennies.

SES. Inbound for the forwarding lane: $0.10 per thousand received messages (so a couple of cents a year for an SMB). Outbound for the PO emails and email-fallback drafts: $0.10 per thousand sent. Both are negligible at this scale.

Bedrock (only when something fires it). The daily check uses no Bedrock. The inbound parsing lane fires Haiku 4.5 once per forwarded sheet: a few thousand input tokens (the Textract output) and a few hundred output tokens (the proposed rows), so a fraction of a cent per parse. At a few forwarded sheets a month, Bedrock costs cents. The monthly summary is one larger call: write a paragraph that summarizes the month’s orders, spend, and stockouts avoided; a couple of cents.

Textract (only on forwarded sheets). Per-page pricing; a typical count sheet or price list is one to a few pages. A few cents per parse. At a few sheets a month, Textract is a few cents to a dollar. At 2,000 tracked items with twenty sheets forwarded per month, it lands around a couple of dollars.

What doesn’t cost money

  • API Gateway. Replaced by Lambda Function URLs for the approve endpoint and the POS webhook.
  • NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
  • Always-on compute. No EC2, no Fargate. The checker sleeps 23.99 hours a day.
  • A Knowledge Base. The stock list is structured rows, not free text — deterministic lookup beats vector search here. No embeddings, no Knowledge Base, no S3 Vectors needed.
  • Models on the check. The daily decision is plain Python. Bedrock fires only on the inbound parsing lane and the monthly summary.

How the cost scales

Lambda runtime grows roughly linearly with item count, because every item is evaluated on every check. DynamoDB grows linearly too. The POS lane grows with sales volume rather than item count. Bedrock and Textract are uncorrelated with item count — they only fire when somebody forwards a sheet or it’s the first of the month. So the bill at 5,000 tracked items is around $32; at 10,000 it’s around $62. Past those volumes the daily-check model probably stops being right (you’d switch to a partial-check that only evaluates items near their reorder point, or react to POS dips instead of polling), but those are optimizations for very large catalogs — not redesigns.

Set an AWS Budgets alarm at $15/month so anything unusual pages you before the bill matters. The bot’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 EventBridge Scheduler config.

All posts