Set Participant Data action overwriting custom variables in IVR flow

Trying to push custom metadata from a Genesys Cloud IVR into a downstream Data Action. The goal is to capture user_id and session_token early in the flow so they persist for the outbound API call.

Added a Set Participant Data action right after the initial Greeting. Configured it to set user_id to {{fn:getValue(inboundData, "userId")}} and session_token to a generated UUID.

The issue is that when the flow hits the subsequent Data Action (POST to internal endpoint), the user_id field is null. Checked the raw JSON payload in the Data Action response logs. The custom attributes object is empty {}.

Here is the JSON structure I’m expecting the Data Action to send:

{
 "externalId": "12345",
 "customAttributes": {
 "user_id": "abc-123",
 "session_token": "def-456"
 }
}

But the actual payload looks like this:

{
 "externalId": "12345",
 "customAttributes": {}
}

I’ve verified the inboundData source contains the correct userId. The Set Participant Data action shows “Success” in the flow execution log. Is there a specific scope issue with Set Participant Data in IVR flows? Or does the Data Action require a different syntax to read these participant-level attributes?

Also tried mapping the variable directly in the Data Action field configuration using {{participant.customAttributes.userId}} but that just passes the literal string instead of the value.