Skip to main content
INS // Insights

EventBridge Cost Optimization at Scale

Updated September 2026 · 8 min read
EventBridge Cost Optimization at Scale

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
  • PutEvents volume 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

  1. Inventory buses, rules, Pipes, archives.
  2. Collapse duplicate publishers of the same fact.
  3. Move filters to rules/Pipes.
  4. Shorten archive retention to a documented number.
  5. 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.