How much does it cost to run a webhook processing service?
A service receiving 30 million webhooks a month, processing them with retries, and archiving payloads costs about 506 dollars on AWS. Here is the breakdown, including the 150 dollar mistake almost everyone makes.
Quick answer
A webhook processing service receiving 30 million inbound webhooks a month (about 1 million a day at 4 KB each), processing them with a 6 percent retry rate, and keeping 30 days of replayable payloads costs roughly 506 dollars a month on AWS, or 0.0169 dollars per thousand webhooks. The largest lines are the dashboard API at 118 dollars, processor compute at 86 dollars, logs at 80 dollars, and the idempotency store at 63 dollars. The common 150 dollar mistake is writing each payload to object storage individually: 30 million PUT requests cost 150 dollars while batching the same bytes through a delivery stream costs 3.48.
Webhook ingestion is the archetypal serverless workload: bursty, stateless, small payloads, and a strict requirement to accept the request quickly or the sender retries. It is also a workload where the per-request charges of every service in the path compound, so the architecture you pick shows up directly on the bill.
The workload we are pricing
Assume a service in us-east-1 receiving 30 million webhooks a month from partner systems, roughly 1 million a day with a 5x burst during business hours. Payloads average 4 KB. The receiver must respond within 2 seconds or senders retry. Processing is asynchronous, with a 6 percent retry rate from downstream failures, so about 32 million processing attempts. Every payload is archived for 30 days so customers can replay failed deliveries, and a dashboard lets them inspect delivery status.
The monthly breakdown
| Component | Specification | Monthly cost |
|---|---|---|
| Dashboard API | 2 Fargate tasks plus ALB and LCU | $117.71 |
| Processor functions | 32M invocations, 512 MB, 300 ms | $86.40 |
| Logs and metrics | 150 GB ingest plus retention | $80.00 |
| Outbound delivery | 2 NAT gateways plus 128 GB processed | $71.46 |
| Idempotency and status store | DynamoDB, 32M writes, 32M reads, 60 GB | $63.00 |
| Queues | SQS, about 95M requests at 0.40 per million | $38.00 |
| Ingress API | HTTP API, 30M requests at 1.00 per million | $30.00 |
| Receiver functions | 30M invocations, 128 MB, 40 ms | $8.50 |
| Payload archive | Batched delivery of 120 GB plus storage | $6.24 |
| Dead letter handling | DLQ plus alarms | $5.00 |
| Total | $506.31 |
The 150 dollar archive mistake
The obvious way to archive payloads is to write each one to object storage as it arrives. Thirty million PUT requests at 0.005 per thousand is 150 dollars a month, against 2.76 dollars for the 120 GB of storage those requests create. You would be paying 54 times more for the act of writing than for keeping the data.
| Archive approach | Requests | Monthly cost |
|---|---|---|
| One PUT per webhook | 30,000,000 | $152.76 |
| Batched via delivery stream | about 43,000 | $6.24 |
| Application-side batching, 1,000 per object | 30,000 | $2.91 |
Batching 1,000 payloads into a single object before writing collapses the line to under 3 dollars and makes replay slightly more work, since you read a batch file and filter. Given the 150 dollar difference on a 506 dollar bill, that engineering is worth doing. This is the same pattern asS3 request fees explained: at high request counts the fee for touching an object dwarfs the cost of storing it.
Queue request charges compound
Thirty-eight dollars of queue charges comes from 95 million requests: sends, receives, and deletes for 32 million messages. Each message touches the queue roughly three times. Long polling already reduces empty receives; the further lever is batching receives ten at a time, which cuts receive and delete requests by 90 percent and takes the line to about 17 dollars. Since SQS bills per API call and batches of ten count as one call, batching is nearly free to implement and halves the line.
Where the retries go
A 6 percent retry rate adds 2 million processing attempts, which costs about 5.40 dollars of Lambda and 2.40 dollars of queue and table charges. Retries are cheap when the failure is fast. They become expensive when the failure is a timeout: a function that waits 30 seconds for an unresponsive downstream before failing costs 100 times more per attempt than one that fails in 300 milliseconds.
| Failure mode | Duration per attempt | Cost of 2M retries |
|---|---|---|
| Fast failure, 300 ms | 300 ms at 512 MB | $5.40 |
| Slow downstream, 5s timeout | 5s at 512 MB | $83.73 |
| Default 30s timeout | 30s at 512 MB | $500.40 |
Setting aggressive client timeouts and circuit breaking is therefore a cost control as well as a reliability practice. A downstream outage that lasts a day, with 30-second timeouts and no circuit breaker, can add several hundred dollars to a 500 dollar bill in a single incident.
The NAT gateway for outbound calls
If processing involves calling back out to customer endpoints, those calls leave through NAT gateways at 32.85 dollars each plus 0.045 per gigabyte. Two gateways for availability is 65.70 dollars of fixed cost for 128 GB of actual traffic costing 5.76 dollars. For a service whose outbound traffic is this small, running the outbound workers in public subnets with security-group egress rules, or using a single gateway, removes most of that. It is the same fixed-cost problem described inNAT gateway versus NAT instance.
Unit economics
At 506 dollars for 30 million webhooks, the service costs 0.0169 dollars per thousand, or 0.0000169 dollars each. With batched archiving, batched queue receives, and a single NAT gateway, it runs near 440 dollars. The important property is that the bill scales almost perfectly linearly with volume: at 300 million webhooks a month it is roughly 4,200 dollars, because every line except the dashboard and logs is per-request. Price the path from Terraform against theresource catalog so the per-request services are all visible together.
FAQ
How much does it cost to run a webhook processing service?
About 506 dollars a month on AWS for 30 million inbound webhooks (1 million a day at 4 KB each) with a 6 percent retry rate, 30 days of replayable payload archive, and a customer-facing status dashboard. That is 0.0169 dollars per thousand webhooks. The bill scales almost linearly, so 300 million a month would be roughly 4,200 dollars.
Why is archiving webhook payloads expensive?
Because object storage charges per request, and one PUT per webhook means 30 million requests at 0.005 per thousand, or 150 dollars a month, against 2.76 dollars for the 120 GB those requests store. You pay 54 times more for writing than for keeping. Batching payloads through a delivery stream cuts it to 6.24 dollars, and application-side batching of 1,000 payloads per object to 2.91.
How do I reduce SQS costs in a webhook pipeline?
Batch receives. Thirty-eight dollars of queue charges here comes from 95 million API calls covering sends, receives, and deletes for 32 million messages. Receiving ten messages per call instead of one cuts receive and delete requests by 90 percent and takes the line to about 17 dollars. Since a batch of ten counts as one billable call, the change is nearly free to implement.
How much do webhook retries cost?
Almost nothing if failures are fast, and a lot if they are slow. Two million retries failing in 300 milliseconds cost 5.40 dollars of compute. The same retries hitting a 5-second timeout cost 83.73 dollars, and at a default 30-second timeout, 500.40 dollars, which would double the entire bill. Aggressive client timeouts and circuit breaking are cost controls as much as reliability practices.
Should webhook processors run in private subnets?
Only if you need the isolation, because outbound calls then pay NAT gateway charges. Two gateways for availability cost 65.70 dollars of fixed charges to carry 128 GB of actual traffic worth 5.76 dollars. For a service whose outbound volume is small, a single gateway, or workers in public subnets with tight security-group egress rules, removes most of that 71 dollar line.
How does C3X help price an event-driven architecture?
C3X reads your Terraform and prices the API gateway, functions, queues, tables, delivery streams, and NAT gateways against a live catalog, so the per-request services that compound across a pipeline are visible together rather than discovered one by one on the invoice. For a workload where cost is almost entirely per-request, seeing that stack costed at design time is what prevents the 150 dollar archive mistake.
What to do next
See every per-request charge in one place. C3X reads your Terraform and prices your resources against a live catalog. Start with the quickstart.
Share this post
Try C3X on your own Terraform
Free and open source. No API key required. One command to install, one command to estimate.