EventBridge cost optimization at scale is a fan-out problem. The default bus looks free until every microservice puts a rule on detail-type and each match is a custom-event charge, plus target invocation, plus a Pipe you stood up because the SaaS webhook could not speak EventBridge natively. CFOs feel this after a product launch: event count climbs linearly with features, and nobody can name which rule is the tax.
AWS prices EventBridge on custom events published, events ingested from partners/SaaS, EventBridge Pipes, archive replay, and API destinations (EventBridge pricing, EventBridge User Guide). The default AWS-service bus for CloudTrail or EC2 state changes is a different (usually cheaper) shape than your application events on a custom bus. Mixing those stories is how teams "optimize the default bus" and miss the bill.
Rutagon runs a two-week cost diagnostic that starts with Cost Explorer usage types and a rule inventory, not a rewrite of the product into queues. We have paid this tax on a production SaaS platform with many Lambda consumers. The patterns repeat.
The Per-Event Tax Nobody Budgeted
A custom event published to a custom bus is billed. Each rule that matches can invoke a target. If five services each subscribe to OrderPlaced with their own rule, you still published once — good — but you now have five invocations and five chances to retry. That is correct architecture and still a cost shape. The expensive anti-pattern is five publishers each emitting a near-copy of the same fact so every team "owns" an event name. You pay five publishes plus the fan-out.
Pipes are the other surprise. A Pipe from SQS or a DynamoDB stream into a bus (or into a Lambda) is billed per event processed. Pipes are the right glue when you need filtering and enrichment without a Lambda. They are the wrong glue when you chained three Pipes to avoid writing a 40-line function and now pay enrichment on every row.
Archives and replay are insurance. They cost storage and replay invocations. A 90-day archive on a high-volume debug bus is how a compliance-minded team accidentally buys a second event bill. Keep archives on the buses that have a restore story. Do not archive the clickstream "just in case" without a retention number.
EventBridge Cost Optimization at Scale We Measure First
We pull:
- Cost Explorer:
EventBridge-Event, Pipes, API destinations, replay PutEventsvolume by bus (custom vs default vs partner)- Rule count and target types per bus
- Failed invocations and retries (retries are work you pay twice)
- Archive size and replay jobs in the last month
The first report names buses, not "EventBridge" as one line. A partner-integration bus (Stripe, Auth0, a CRM) has different pricing than your app bus. Treating them as one number hides the lever.
resource "aws_cloudwatch_event_bus" "app" {
name = "app"
}
resource "aws_cloudwatch_event_archive" "app" {
name = "app-14d"
event_source_arn = aws_cloudwatch_event_bus.app.arn
retention_days = 14 # not 90 unless you have a restore test
}
resource "aws_pipes_pipe" "webhook_to_bus" {
name = "saas-webhook"
role_arn = aws_iam_role.pipe.arn
source = aws_sqs_queue.webhooks.arn
target = aws_cloudwatch_event_bus.app.arn
# filter here — do not put the whole webhook payload on the bus
}
Filtering at the Pipe or the rule is the cheapest code you will write. A rule that matches source = app and then Lambda-filters 90 percent of events in code still incurred the match and the invoke. Put the filter on the rule content path AWS already evaluates.
Related: custom EventBridge Lambda automation, event-driven architecture on AWS, Lambda cost optimization strategies. Capability: AWS cloud infrastructure.
Custom Buses vs the Default Bus
The default bus is for AWS service events. Application facts belong on a named custom bus with a schema you version. Cost-wise, dumping product events onto the default bus mixes CloudTrail noise with OrderPlaced and makes Cost Explorer useless. Compliance-wise, it also makes "who can PutEvents" a wider IAM problem. Separate buses, separate IAM, separate archives.
Cross-account event forwarding is another multiplier. A hub-and-spoke org that reprints every event into three accounts triples publish charges. Forward only what the spoke must see. Schema-registry enthusiasm is not a reason to flood a sandbox account with production volume.
Pipes, API Destinations, and the Hidden Lambda
API destinations charge per invocation to an HTTPS endpoint. If you are posting every event to a third-party "integration platform," you are paying EventBridge and that vendor. Sometimes that is the buy. Measure it. A Lambda that batches and posts once a minute is often cheaper than a destination per event — and easier to evidence for retries.
We do not "optimize" by deleting dead-letter queues. Failed events that vanish are an availability and a CC7-shaped monitoring miss. Keep DLQs. Pay for the successful path by filtering, not by dropping failures on the floor.
What We Change in Two Weeks
- Inventory buses, rules, Pipes, archives.
- Collapse duplicate publishers of the same fact.
- Move filters to rules/Pipes.
- Shorten archive retention to a documented number.
- Kill unused rules whose targets 404.
We do not rewrite the product as SNS-only in a week. We do not claim a generic percentage. On one production SaaS estate, unused rules and a 90-day debug archive were a larger line than the business events. Your mix will differ. The diagnostic is how we prove it.
Schema versioning is a cost control in disguise. If v1 and v2 of OrderPlaced both fly forever, every consumer keeps a rule on both. We deprecate with a date, then delete the old rule. Orphan rules that match nothing still get evaluated and still confuse the next engineer who copies them.
Talk through a two-week AWS cost diagnostic →
907-841-8407 · contact@rutagon.com
Frequently Asked Questions
Is the default event bus cheaper than a custom bus?
AWS-service events on the default bus are priced differently from custom application events. Do not move product events to the default bus to "save money" — you lose isolation and you still pay for custom publishes if they are custom events. Name the bus for the workload.
When do EventBridge Pipes cost more than a Lambda poller?
When enrichment runs on every message and a Lambda could batch. When volume is tiny, Pipes often win on operations. We model both from a week of counts.
Should we archive every bus for SOC 2?
Archive the buses you would replay after a bad deploy or that hold in-scope business events. A clickstream archive is a product choice. Rutagon does not hold a SOC 2 report; we keep retention honest so the bill matches the narrative.
Does Schema Registry add a meaningful line item?
Usually small next to publish volume. The cost mistake is reprinting events to feed the registry, not the registry itself.
Can we cap costs with a quota?
Account-level quotas prevent runaway PutEvents from a bug. They also page you when a launch is real. We set them with an owner, not as a silent ceiling that drops orders.