IVR Data Action screen pop failing with CTI_ADAPTER_TIMEOUT on hybrid route

The click-to-dial buttons in Salesforce desktop are working perfectly, but any call routed through our main Architect IVR flow completely drops the screen pop event. We’re running the Genesys Cloud for Salesforce managed package version 24.3 alongside CTI adapter v3.8.1. The flow itself is straightforward. Collects an extension, passes it to a FindContactByExt data action, and then drops into a hybrid queue. The data action calls a simple Apex method that queries the Contact object and returns the record ID. Query finishes in under 200ms according to the debug logs.

It’s just that the CTI adapter never receives the screen pop payload. Console network tab shows a CTI_ADAPTER_SCREENPOP_TIMEOUT error right after the IVR transfers to the agent. You’ll see the data action node throwing a DataActionResponseTimeout after exactly 45 seconds in the Architect logs. Bumped up the timeout threshold in the flow settings to 60 seconds, but it still fails. Remember that thread from last month about Data Actions dropping payloads when the CTI session token expires mid-flow? Tried rotating the OAuth tokens in the integration settings just in case. Didn’t help. Console is doing jack all when the transfer happens.

Apex side looks clean. The method is synchronous now, using the standard GenesysCloudSalesforce.DataActionHandler interface. Return payload matches the schema exactly. Can’t see any validation errors in the debug logs. Even added a simple System.debug to verify the JSON structure before it leaves the org. Structure is valid. Click-to-dial from the Salesforce layout still works because it bypasses the IVR entirely and uses the direct CTI adapter connection. That path won’t trigger the hybrid routing timeout.

Environment is Tokyo region. Managed package is on the latest release track. Hybrid routing is enabled with WebRTC fallback disabled for this specific queue. The IVR flow uses a custom Find Customer node that maps to the data action. When the agent finally picks up, the call connects fine, but the record window stays blank. Have to manually search for the contact every single time. Real headache for the tier-1 team. Mic stays hot but the screen pop never fires.

Wondering if the data action callback URL is getting blocked by the Salesforce firewall rules when it originates from the IVR media server. IP ranges for the Architect execution environment are whitelisted, but maybe the outbound call to the CTI adapter endpoint is hitting a rate limit. Saw a similar issue mentioned in the community forums where the genesys.cloud.salesforce package drops the screen pop if the IVR flow takes longer than the CTI session TTL. Not sure how to extend that TTL without breaking the click-to-dial functionality.

Here is the exact payload the data action is trying to push back:
{
“recordId”: “0035g00000KxR9tAAF”,
“recordType”: “Contact”,
“screenPopType”: “newTab”,
“callbackUrl”: “https://na54.salesforce.com/services/data/v58.0/genesys/screenpop
}
Flow logs show the data action completes successfully, but the CTI adapter never logs a screenPopReceived event. Network trace shows the request to the callback URL returns a 502 from the Salesforce load balancer. Might be worth checking if the hybrid routing component is stripping the custom headers before passing them to the data action node

The timeout usually stems from a mismatch between data action output and adapter expectations. Hybrid routes strip custom attributes when payload structure isn’t flattened. Try adjusting flow configuration:

  • Set the data action response timeout to 3000ms instead of the default 1000ms. Apex queries lag slightly when the hybrid queue is active.
  • Flatten the returned JSON before passing it to the Set Attributes block. The adapter drops nested objects and it’s a known quirk.
{
 "contactId": "{{findContactResult.contactId}}",
 "screenPopUrl": "https://na99.salesforce.com/{{findContactResult.contactId}}"
}
  • Add a Data Table lookup to cache the URL structure. Architect flows sometimes retry the data action on hybrid transfer, causing duplicate CTI calls. See the attribute mapping guide here: https://help.genesys.cloud/architect/flows/data-actions
    Watch the flow execution logs for the cti_adapter_timeout marker. The hybrid queue transfer step often resets the session timer if the attribute isn’t marked persistent.
const screenPopPayload = { screenPopData: { contactId: req.body.contactId, url: `https://${instance}.salesforce.com/${req.body.contactId}` } };

It’s timing out because the adapter expects a flat screenPopData key, not a nested JSON object. Flatten the response directly in your Set Attributes block and skip the Apex middleman. Check the CTI logs to see if the parse error clears up.

2 Likes

PureCloudPlatformClientV2 actually handles the payload flattening better when you push the flow through the CX-as-Code provider. Our deployment logs confirm this resolved the timeout. First, the error clears once you set dataActionTimeout to 3000 in the module. Then, you’ll map the attributes directly in the JSON payload. Make sure you don’t override the default CTI adapter scope during deployment.

{ "attributes": { "screenPopData": { "contactId": "{{contact.id}}" } } }

The state backup syncs automatically.