Zoom EventBridge Webhook - Duplicate Events after Retry

Hi all,

We’ve got a weird one happening with EventBridge and Zoom Contact Center webhooks. The setup is pretty standard-a Zoom call status change event triggers an EventBridge rule that fans out to a Step Functions state machine, which then fires a Lambda function. The Lambda does some light processing then posts to an internal API-nothing too hairy. It’s all CDK-defined, obviously.

The problem isn’t the Lambda itself-it’s the duplication of events. We’re seeing the same Zoom event get delivered twice to EventBridge. The Step Functions execution history confirms this-two executions for a single Zoom call status update. This isn’t intermittent either, it’s happening consistently for every event. It’s really throwing off the downstream processing.

Now, normally, EventBridge handles retries automatically if a target fails. That’s good. But it appears it’s not checking for idempotency. It’s just blindly retrying and firing off a second event. The documentation is…sparse on this point. It’s just assumed you’ll handle idempotency in the target. But is this a config issue on our end? Are we missing some setting?

We’re using the Zoom.ContactCenter.Call event type, and the target is configured as an EventBridge rule with a single target-the Step Functions state machine. The Lambda’s configured with a 128MB memory allocation and a 30-second timeout. The Step Function timeout is set to 60 seconds.

Here’s the relevant bit from the EventBridge rule definition in the CDK:

const rule = new events.Rule(this, 'CallStatusRule', {
 eventPattern: {
 source: ['aws.events'],
 detailType: ['Zoom.ContactCenter.Call'],
 },
 targets: [
 new events_targets.StepFunctionsStateMachine(this.stepFunction, {
 input: events.EventPattern.toRulePayload(rule)
 })
 ]
})

The Lambda’s logging shows it’s receiving the same payload twice, with only a few milliseconds difference between the invocations. The Zoom event payload itself doesn’t seem to have a unique identifier we can reliably use for deduplication.

We’ve tried adding a simple sequence number in the Lambda function to track executions, but the duplication happens before it even hits the Lambda. So the issue is upstream-inside EventBridge or Zoom’s webhook delivery.

Here’s a sample event payload we’re getting duplicated:

{
 "version": "1.0",
 "detail-type": "Zoom Contact Center Call",
 "detail": {
 "event": "call.ended",
 "accountId": "xxxxxxxxxxxxxxxxx",
 "callId": "yyyyyyyyyyyyyyyyy",
 "callStatus": "completed",
 "callDuration": 123,
 "agentId": "zzzzzzzzzzzzzzzzz"
 },
 "source": "zoom.contactcenter"
}

It’s really strange. It feels like EventBridge is receiving the acknowledgement from Zoom, but also retrying the delivery just in case. I’m thinking there’s something weird with the Zoom webhook delivery confirmation mechanism. Maybe it’s not being handled correctly by EventBridge. It’s frustrating!!

Any thoughts? Is anyone else seeing this behavior? We’re on API version v2.0.

1 Like