403 Forbidden: Target invocation failed. EventBridge logs show Rule ‘conv-end-rule’ matched 0 events. Target invocation count: 0. The console preview is notoriously forgiving. Genesys Cloud doesn’t send detail-type as Conversation Event. It hardcodes it to Genesys Cloud Event for every outbound stream, regardless of the actual interaction type. You’re filtering on a string that never arrives.
Pull a raw event straight from the GC side first. Hit the interactions endpoint with a service account token to see exactly what the payload shape looks like before it ships to AWS. You’ll need the analytics:events:read scope on that token.
curl -X GET "https://api.mypurecloud.com/api/v2/interaction/events" \
-H "Authorization: Bearer YOUR_OAUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type": "conversation.end", "interval": "2023-10-01T00:00:00Z/2023-10-01T01:00:00Z"}'
The response body will show you the exact keys. When that payload crosses into EventBridge, it gets wrapped like this:
{
"source": ["genesys.cloud"],
"detail-type": ["Genesys Cloud Event"],
"detail": {
"type": ["conversation.end"],
"id": ["*"],
"timestamp": ["*"]
}
}
Swap Conversation Event for Genesys Cloud Event in your rule pattern. EventBridge requires exact string matches for detail-type. If you leave it wrong, the rule quietly drops every message.
Also check the IAM role attached to the Lambda. EventBridge needs explicit lambda:InvokeFunction on that ARN. The console sometimes auto-creates a role with restricted permissions when you use the visual builder. Run this to verify the trust policy:
aws lambda get-policy --function-name your-lambda-name
If the policy is missing the EventBridge principal (events.amazonaws.com), the invocation will fail silently on the target side. I’ve seen this exact setup trip up Kafka Connect bridges too. The GC EventBridge integration just pipes the JSON blob without schema validation. You’ll want to add a detail.type wildcard or exact match, but keep the top-level keys tight.
The dashboard showing events flowing just means the HTTP POST to the EventBridge API succeeded. It doesn’t mean your rule evaluated to true. Fix the detail-type string and you’ll see the Lambda wake up. Usually takes about 15 seconds to clear the buffer.
Watch out for duplicate event routing if you also have a webhook pointing at the same endpoint. Genesys Cloud doesn’t deduplicate outbound streams across different transport types. You’ll end up processing the same conversation.end twice. Set up a dedup key in your Lambda handler or route one stream to S3 for archival and keep EventBridge for real-time.
The schema registry usually complains about missing routingData fields when you first pipe this into Kafka. Just map the detail object to a flat struct and you’re good. platformClient analytics endpoints will show the drop-off if you query GET /api/v2/analytics/events/summary with type=conversation.end. It’s a straight plumbing fix. No SDK changes needed on the GC side. Just update the rule JSON and redeploy. The lambda logs will start populating. You’ll probably need to restart the consumer group anyway.