Set Participant Data action losing custom attributes on IVR transfer

We’re hitting a wall with the Set Participant Data action in Architect. The goal is to pass a few custom attributes from an IVR flow into the conversation context so our custom agent desktop (built with the Client App SDK) can pick them up for screen pops.

Here is the flow setup:

  1. Collect input via Gatherv2.
  2. Use Set Participant Data to map the gathered input to a custom attribute key ivr_origin.
  3. Transfer to a queue.

In the Architect canvas, the action looks correct. I’m mapping the output of the Gatherv2 block directly to the attribute value. However, when the agent accepts the call, the conversation.participants[0].attributes object is empty of these custom keys. The standard attributes like media_type are there, but nothing I set.

I’ve verified this by logging the payload we receive via the WebSocket event conversation:updated. The JSON payload looks like this:

{
 "id": "12345-abc",
 "participants": [
 {
 "id": "67890-xyz",
 "attributes": {
 "media_type": "voice"
 }
 }
 ]
}

I tried adding a delay after the Set Participant Data action just to see if it was a race condition, but that didn’t change anything. I also confirmed that the attribute key ivr_origin doesn’t exist in the global attribute schema, so it should be allowed as a participant-level custom attribute.

Is there a specific configuration required on the Set Participant Data action to persist these through a transfer? Or am I missing something obvious about how participant data merges during a queue transfer?

Checked the docs on /api/v2/conversations/calls/{id} and it mentions participant attributes, but nothing about flow-side injection failing. We’ve been using this pattern for months in older flows, so I’m confused why it’s breaking now.

Any ideas?

Set Participant Data only touches the current leg. You’ll lose those attributes on transfer unless you use the Transfer action’s data field or push them via the API. In .NET, I usually hit PUT /api/v2/conversations/{id}/participants/{id} to persist custom data before the handoff. Architect actions are too limited for this.