EventBridge rule not firing for Conversation events - debugging pattern matching

I’m trying to set up an EventBridge rule to catch specific conversation events in NICE CXone. The goal is to trigger a lambda when a voice conversation enters the wrapup state.

I’ve created the rule in the AWS console with the following event pattern:

{
 "source": [
 "nice.cxone.events"
 ],
 "detail-type": [
 "Conversation Event"
 ],
 "detail": {
 "event_type": [
 "conversation.updated"
 ],
 "data": {
 "state": [
 "wrapup"
 ]
 }
 }
}

The problem is the rule never fires. I’ve verified that the EventBridge bus is connected and receiving events from CXone. I can see other events hitting the bus, like queue.member.updated, but nothing for conversations.

I tried broadening the pattern to just match source: ["nice.cxone.events"] and detail-type: ["Conversation Event"]. That also resulted in zero matches.

I checked the raw event structure by putting a test rule that matches everything and sending a sample event. The structure looks like this:

{
 "id": "abc-123",
 "source": "nice.cxone.events",
 "account": "my-account-id",
 "time": "2023-10-27T15:00:00Z",
 "region": "us-east-1",
 "detail-type": "Conversation Event",
 "resources": [],
 "detail": {
 "event_id": "evt-456",
 "event_type": "conversation.updated",
 "data": {
 "conversation_id": "conv-789",
 "media_type": "voice",
 "state": "wrapup",
 "direction": "inbound"
 }
 }
}

The JSON structure matches my pattern exactly. I’ve double-checked the spelling of wrapup and conversation.updated.

Is there something specific about how CXone pushes these events to EventBridge that requires a different pattern structure? I’ve looked at the docs but they don’t mention any quirks with nested data objects.

Any ideas on how to debug this? I’m out of options.