What the return and RMA handler costs
A returns desk that costs more to run than the returns it processes is a bad trade. This post is the cost breakdown: every AWS service this system touches, what each adds up to at around 120 returns a month, why the total lands near $2.90, and which two lines — Step Functions transitions and the external label API — are the only ones that move when volume does.
Key takeaways
- About $2.90/month at roughly 120 returns, and the fixed cost is essentially zero — nothing runs between returns.
- Only two lines move with volume: Step Functions state transitions, and the carrier label API — and the label API isn’t an AWS cost at all.
- The one real AWS fixed line is Secrets Manager, at $0.40 per secret per month for the label and webhook keys.
- Bedrock is optional. Turn the wording off and the bill drops by about $0.75 with no loss of function.
- At ten times the volume the bill lands near $9 — it scales gently because the fixed lines don’t move.
Where the money goes
The handler is serverless end to end, and a return spends most of its life as a paused state machine that costs nothing while it waits. There’s no instance ticking over, no queue being polled, no idle bill. You pay for a return only when one is actually moving through a stage. At a typical small-shop volume — call it 120 returns a month — here’s the whole bill, line by line.
| AWS service | What it does here | Monthly |
|---|---|---|
| Secrets Manager | Two secrets — carrier/label API key, webhook signing key ($0.40 each) | $0.80 |
| Bedrock (Claude Haiku 4.5) | Optional wording for the RMA and outcome emails (~240 calls) | $0.75 |
| S3 | Label PDFs, inspection photos, and the Drive mirror | $0.35 |
| DynamoDB (on-demand) | Returns table, orders mirror, audit — small reads and writes | $0.25 |
| CloudWatch Logs | Function logs, 7-day retention | $0.20 |
| EventBridge (bus + Scheduler) | Carrier tracking events, the daily sweep, the Drive sync | $0.17 |
| SES (inbound + outbound) | Return requests in; RMA, approval, and outcome emails out | $0.15 |
| Lambda (Python 3.14, arm64) | Intake, eligibility, label, track, inspect, decide, approve, sweep, sync | $0.15 |
| Step Functions (Standard) | ~1,400 state transitions across ~120 executions | $0.05 |
| SQS + DLQ | Buffering between the edges and the workers | $0.03 |
| AWS Budgets | Cost alarm (first two budgets are free) | $0.00 |
| Total | ~120 returns/month | $2.90 |
The shape of that bill is the surprise. The two services people assume will dominate — Step Functions, which orchestrates the whole thing, and Lambda, which does the actual work — are among the cheapest lines on the list, because Step Functions Standard bills per state transition (a fraction of a cent each) and the Lambdas run for milliseconds. The biggest line is Secrets Manager, which charges a flat $0.40 per secret whether you process one return or a thousand. The second is Bedrock, and that’s optional. Everything that does the genuine logistics — the orchestration, the matching, the decision — rounds to almost nothing.
The two things that scale
Only two costs in this system actually move when you do more returns. The first is Step Functions: every return is one execution of around a dozen state transitions, and Standard workflows bill $0.025 per 1,000 transitions, so 120 returns is a few cents and 1,200 is a few more. It scales perfectly linearly and stays tiny — the long waits in the middle, which could last weeks, cost nothing, because a paused execution isn’t transitioning. The second is the carrier’s label API, and that one is genuinely per-return — but it’s a postage cost on your courier contract, not an AWS line, so it doesn’t appear on the table at all. Whatever a return label costs you today, the handler just asks for one per cleared return; it doesn’t add a markup.
The fixed cost, and the optional one
Secrets Manager is the only thing here that bills while the system sleeps: two secrets at $0.40 each is $0.80 a month no matter what, more than a quarter of the total at this volume. Use a single combined key and you’d shave $0.40 off. Bedrock is the other notable line, and it’s entirely optional: it only phrases the customer emails, so turning it off drops the bill by about $0.75 and replaces the wording with templates that read perfectly well. Everything else — S3, DynamoDB, logs, EventBridge, SES, Lambda, SQS — is usage-priced and rounds toward zero at this scale.
Push this to a busy shop — 1,200 returns a month, ten times the volume — and the bill lands near $9, not $29. It’s strongly sub-linear because the fixed lines don’t move: Secrets Manager stays at $0.80, the schedules stay at a cent, Budgets stays free. What grows is the genuinely usage-priced work — more Bedrock calls, more S3 for photos, a bit more DynamoDB and logs, and Step Functions creeping from a few cents to a few more. The honest read: the AWS bill is rounding error against the cost of running a returns desk by hand, where the real money is the refund issued in error and the parcel that quietly went missing — both of which this system is built to stop.
Design rules that shaped the cost
- Pay per return, not per hour. No always-on compute, and a paused execution costs nothing while a parcel travels.
- Orchestration is cheap. Step Functions bills transitions, not waiting; the whole flow is a few cents a month.
- Know your one fixed cost. Secrets Manager is the only line that bills while nothing is happening.
- AI is optional. Bedrock only writes words; switch it off and the system still runs end to end.
- The label fee lives with the carrier. The biggest per-return cost is postage on your courier contract, not AWS.