What the cart recovery costs
This is one of the cheapest systems in the whole series. Each wake-up reads one cart row, does a little time arithmetic, writes a couple of rows to DynamoDB, and sometimes sends one email. It calls no model to decide. Bedrock fires only to polish one line of a reminder and once a month for the recovery summary. At typical SMB volume, the bill is a couple of dollars a month, fixed cost essentially zero.
Key takeaways
- Around $2.20/month at typical SMB volume (around 300 abandoned carts a month).
- Fixed AWS cost is essentially zero. No always-on compute, no NAT Gateway, no API Gateway.
- The per-cart wake-up costs fractions of a cent — no model calls.
- Bedrock fires only to polish one reminder line and on the monthly summary.
- At 1,000 carts the bill is around $6. At 3,000 carts it’s around $14.
Cost at three volumes
Where the dollars actually go
Lambda runtime (the bulk). The webhook Lambda fires on every cart event (an active shopper can produce a dozen), and the waiter wakes once or twice per abandoned cart. Each invocation is a few hundred milliseconds of date arithmetic and a couple of DynamoDB calls. Add the nightly export Lambda and the unsubscribe handler, and the Lambda total still lands well under a dollar at all three volumes. Most cart events come from active shoppers and never lead to a reminder at all, so the work is cheap.
DynamoDB on-demand. Three small tables: cr-state, cr-sends, cr-audit. Writes happen on each cart event and each send; reads happen on each wake-up. Pennies a month at any of these volumes.
S3 + Storage. The nightly export and a little config. A few hundred KB total at SMB volume. Effectively free.
EventBridge Scheduler. One wake-up per abandoned cart, plus the occasional quiet-hours defer. A few hundred to a few thousand invocations a month. Pennies.
SES. One email per reminder actually sent. At 300 abandoned carts a month, only a fraction get a reminder (most come back on their own), so a few hundred emails at $0.10 per thousand — a few cents. Even at 3,000 carts it’s well under a dollar.
Bedrock (only when a reminder sends). The timing decision uses no Bedrock. Each sent reminder fires one Haiku 4.5 call to polish a single line: a couple of hundred input tokens and a few dozen output, so a tiny fraction of a cent per reminder. The monthly summary is one larger call — write a paragraph on carts seen, recovered, and dollars won back — a couple of cents. With the deterministic fallback, even a Bedrock outage costs nothing extra; the reminder just ships with the plain line.
SQS. A small queue with a dead-letter queue sits between the webhook and the intake so a burst of cart events never drops anything. Requests are pennies at this volume; the DLQ is there for safety, not cost.
What doesn’t cost money
- API Gateway. Replaced by Lambda Function URLs for the webhook and the unsubscribe link.
- NAT Gateway. Nothing is in a VPC. No NAT, no $32/month minimum.
- Always-on compute. No EC2, no Fargate. The system only runs when a cart event or a wake-up arrives.
- A Knowledge Base. Carts are structured rows, not free text — deterministic lookup beats vector search here. No embeddings, no Knowledge Base, no S3 Vectors needed.
- Models on the decision. The timing decision is plain Python. Bedrock fires only to polish one line and on the monthly summary.
How the cost scales
Lambda runtime grows roughly linearly with cart events, because every event is handled and every abandoned cart gets a wake-up or two. DynamoDB grows linearly too. Bedrock and SES grow only with reminders actually sent, which is a fraction of carts. So the bill at 5,000 abandoned carts is around $22; at 10,000 it’s around $40. Past those volumes you’d batch the wake-ups (group carts due in the same window into one Lambda run) to shave the per-cart overhead, but that’s an optimization for a busy store — not a redesign.
Set an AWS Budgets alarm at $15/month so anything unusual pages you before the bill matters. The system’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, the SQS and DLQ wiring, and EventBridge Scheduler config.
All posts