QVCCS innovation · How-to guides
Integrating Genesys Cloud CX and Zendesk with data actions
The customer's account and every ticket they have raised live in Zendesk. The conversation lives in Genesys Cloud CX. We joined the two with Zendesk data actions, so the IVR can read back a caller's open tickets, let them raise a new one, and hand the agent that brand-new ticket in the screen pop a moment later.
Did you know Zendesk documents that it can take up to a few minutes for new tickets, users and other resources to be indexed for search, so a ticket created moments ago may not yet appear in Search API results?
Did you know that when you add and activate the Zendesk data actions integration, Genesys Cloud automatically creates static actions such as Get User By Phone Number and Get Most Recent Ticket By User Id, which you can copy as templates for custom actions?
Did you know a data action in an Architect call flow times out after 60 seconds by default, which administrators can now set anywhere from 1 to 60 seconds, while data actions run from Scripter or the Public API time out after 20 seconds?
Did you know the output contract of a Genesys Cloud custom action does not support nested arrays, and a resolved response that does not conform to the action's success schema causes an error?
01
08:55: the caller's ticket is already in Zendesk
Picture a service desk at 08:55. A customer rings about a fault they reported yesterday. Everything about them is in Zendesk: their user record, their organisation, the open ticket and the comments added overnight. The agents who answer the phone, however, work in the Genesys Cloud CX agent workspace, and the IVR that greets the caller is an Architect flow. Without an integration, the caller repeats who they are, the agent searches by hand, and the first minute of the call is spent finding a ticket that already exists.
The question our client asked was precise: how do we make Zendesk information available to callers and agents inside Genesys Cloud, quickly and reliably enough to drive the IVR itself? Our answer treats Zendesk as the system of record and Genesys Cloud as the system of engagement, joined by data actions. A caller can hear the status of their open tickets, raise a new ticket without waiting for an agent and, if they still need help, reach an agent whose screen already shows the caller and the ticket they have just created. Getting that last step right turned out to depend on one choice of API, which we explain below.
02
Shaping Zendesk first: custom user fields
Good integrations start in the data model, not in the flow. Zendesk's user record already holds the name, phone number and email address, but not everything the contact centre needs to steer a call. We added custom user fields for the account number, the current balance, the date of last contact, the preferred language (so the IVR speaks in the right language and persona), the customer's lifetime value to the business and the customer segment, such as Gold, Silver or Bronze. Each field gets the narrowest sensible type: Zendesk offers types including text, date, decimal, integer and drop-down, and a drop-down is the right choice wherever the flow will branch on the value.
Each custom field has a key, made only of letters, numbers and underscores, and the API returns the values under user_fields on the user, keyed by that field key. Data action request templates and translation maps must use the key, never the display name, so we record each field's display name, key, type and the flow decision that depends on it in the interface contract. A later rename in Zendesk is then caught as a breaking change in review rather than discovered as a silent lookup failure in production. Just as important is what we leave out: no verification secret is held in a Zendesk field that the IVR or an agent can read.
Read this diagram as text
A table of custom Zendesk user fields on the left, with an arrow to the Zendesk user object returned by the API on the right, which in turn feeds Genesys Cloud data actions.
- The left panel, "Zendesk · Custom user fields – Custom fields on the user", is a table with the columns Display name, Field key, Type and Used for.
- "Account number": account_number, Text, used to Identify. "Current balance": current_balance, Decimal, used for Self-service.
- "Date of last contact": last_contact, Date, used for Context. "Preferred language": language_custom, Drop-down, used for IVR language.
- "Lifetime value": lifetime_value, Decimal, used for Priority.
- "Customer segment": segment, Drop-down, with values such as "Gold · Silver …". Notes below the table say "Field keys illustrative · definitions only, no values" and "No verification secrets in readable fields".
- An arrow leads to the right panel, "Zendesk user · API – Read by data actions", where the "User object" shows "id · name · phone · email" and a user_fields block listing account_number, current_balance, last_contact, language_custom, lifetime_value and segment.
- An arrow leads down from the user object to "Genesys Cloud data actions – Read into the IVR flow and agent script".
- A strip at the bottom reads: "Custom fields carry what the IVR and agents need that the default schema does not."
03
One integration, many precise questions
In Genesys Cloud, the Zendesk data actions integration holds the connection. Its credentials are the email address of a verified Zendesk user, an API token generated in Zendesk, and the base service URL of the Zendesk account, in the form https://{subdomain}.zendesk.com. Because the credentials live on the integration, no individual action carries a secret, and rotating a token is a change in one place. When the integration is activated, Genesys Cloud creates static actions automatically: get a user by phone number, email address, user ID or user name; get an organisation by ID or name; get a ticket by ticket ID; and get the most recent ticket by user ID or email address.
Static actions are useful on their own, and they make good templates, but a real journey needs more. We copied and extended them, and wrote new custom actions: get the open tickets for a user, read a ticket's comments, create a ticket from the IVR and add a comment to an existing one. Genesys describes custom actions as able to retrieve, update or create any data through Zendesk's REST API. Every custom action goes through the same four steps: define the input and output contracts, configure the request and the response, test it against real data, and publish it so that Architect flows and scripts can use it.
Read this diagram as text
Three panels from left to right: the Zendesk data actions integration, a list of custom actions in its category, and the four steps every custom action goes through.
- The left panel, "Data actions integration – Zendesk", shows "Configuration: Your Zendesk instance. Credentials stored here, not in each action".
- An arrow leads down from the configuration to an "Add action" button, with "Import an action" as an alternative below it, and the note "Static actions created with the integration make useful templates".
- An arrow leads from "Add action" to the middle panel, "Actions · Zendesk category – Custom actions".
- Published actions: "Create a ticket", "Get user by phone number" and "Get most recent ticket by user ID", which is highlighted.
- Draft actions: "Get ticket comments", "Update a ticket comment" and "Add a call log". A note says the action names are illustrative.
- An arrow leads from the highlighted "Get most recent ticket by user ID" action to the right panel, "Every custom action – Four steps".
- The four steps run top to bottom, joined by arrows: "1 · Contracts – Input and output schema", "2 · Configuration – Request URL template · response map", "3 · Test – Run it with sample input", and "4 · Publish – Available to flows and scripts".
- A strip at the bottom reads: "One integration holds the connection; each custom action asks Zendesk one precise question."
04
Contracts first: what goes in and what comes back
A data action's contracts are its promise to the flow. The input contract for our get-most-recent-ticket action has one required property: the Zendesk user ID, supplied by the earlier lookup. Genesys limits input contract properties to simple types, string, integer, number, Boolean and null, with no nested objects. The output contract describes what comes back: a count of tickets and a tickets array whose items carry the ticket ID, subject, status, created and updated dates, assignee and group, and the other fields the flow or the script will use. We return only what the journey needs; a smaller contract is easier to test and harder to break.
A correctly shaped response schema is what keeps the action from failing at runtime, and arrays deserve particular care. Genesys notes that the output contract does not support nested arrays, and that a resolved response must conform to the action's success schema or the action errors. Before we write a contract, we call the Zendesk endpoint from an API client such as Postman and read a real response, including the awkward cases: a user with no tickets, a ticket with an empty field, and a user with more tickets than one page returns.
Read this diagram as text
Two panels: the input contract of a data action on the left and its output contract, drawn as a typed tree, on the right.
- The left panel, "Input contract – What the flow sends", has one input, "ID", of type String: "Zendesk user ID · required".
- A note below says the ID is "Typically from an earlier get user by phone number action".
- A caution box, "Get the shape right", reads: "A schema that does not match the response causes errors – arrays in particular need the right item type. Check a real response in an API client such as Postman first."
- The right panel, "Output contract – What the action returns", starts with "response" (Object), which contains "count" (Integer) and "tickets" (Array).
- Inside tickets is "ticket (array item)" (Object), which holds id (Integer), subject (String), status (String), created_at and updated_at (String), assignee_id and group_id (Integer), and has_incidents (Boolean).
- A note reads "Field selection illustrative · return only what the flow uses".
- A strip at the bottom reads: "The contracts are the agreement: the flow knows exactly what goes in and what comes back."
05
Search API or Users API: the request behind the screen pop
Every contract needs a request URL template that asks Zendesk the right question. There are two natural ways to ask for a caller's recent tickets. The Search API template queries for tickets of type ticket, with a status below solved and the requester set to the input ID, sorted by last update. The Users API template asks only for the tickets requested by one user, with the user ID in the path, sorted by creation date with the newest first. Both return the same ticket objects. We URL-encode every input with esc.url(), as Genesys requires for path and query parameters, even when the input is a numeric ID.
The difference that matters is freshness. The Search API looks across every ticket in the account through a search index, and Zendesk documents that new tickets can take up to a few minutes to be indexed. In our testing, a newly created ticket could take two minutes or more to appear in search results, while the user-scoped request returned it straight away. If a caller raises a ticket in a bot flow and is then routed to an agent who must see that ticket in the screen pop, a lag of minutes breaks the journey. That use case needs the Users API route.
Zendesk's own documentation adds a refinement we now build in. For the requested-tickets endpoint, it notes that requests which include both active and archived tickets can see a short delay before new tickets appear, with most available within 30 seconds and the vast majority within 90. The endpoint accepts an exclude_archived parameter, and because the IVR only ever needs live tickets, our template sets it to true. The endpoint also has its own rate limit, separate from the account-wide limit, so we size it against expected call volumes during design and prove it in performance testing.
Read this diagram as text
Two request URL templates compared side by side: the Zendesk Search API on the left and the Users API on the right, each followed by its strengths and a verdict.
- The left panel, "Request URL template · Search API – Search every ticket", shows GET /api/v2/search.json?query=${esc.url("type:ticket status<solved requester:${input.ID}")}&sort_by=updated_at&sort_order=desc.
- Its notes read "Looks across all tickets in the account" and "Flexible filters: status, type, requester and more".
- Its verdict, marked with a cross: "Relies on the search index – A brand-new ticket can take minutes to appear". A footnote says "input.ID comes from the input contract".
- The right panel, "Request URL template · Users API – Ask about one user", shows GET /api/v2/users/${esc.url($input.ID)}/tickets/requested?exclude_archived=true&sort_by=created_at&sort_order=desc.
- Its notes read "Only the tickets this user has requested" and "Same ticket data back, a much smaller search".
- Its verdict, marked with a tick: "Fast and current – A new ticket was there straight away in our tests". A footnote says "Most recent first".
- A strip at the bottom reads: "Creating a ticket in the call and popping it to the agent straight away? Use the user-scoped request."
06
Translation maps: a large payload, exactly the right variables
Zendesk returns more than the flow needs: the tickets, a count, and paging properties such as next_page and previous_page. The data action's response configuration turns that raw response into a resolved response the flow can use. A translation map uses JSONPath to pick values out of the payload, here $.count and $.tickets. Translation map defaults supply a fallback when a JSONPath expression fails to resolve a value, though Genesys notes that null values do not fall back to defaults. Finally, a success template written in Velocity Template Language builds the output.
Our success template branches on the count. When the caller has no open tickets, it returns the count alone, and the flow offers to raise a new ticket. When tickets exist, it returns the count and the tickets, which the flow reads back to the caller or passes to the agent script. Genesys also provides Velocity macros for common shaping jobs, such as successTemplateUtils.firstFromArray to take the first item of an array, which suits a most-recent-ticket lookup. The results are written to participant data, so they travel with the conversation from the IVR to the queue and on to the agent's script.
Read this diagram as text
Three panels from left to right show a raw Zendesk response, the response configuration that reshapes it, and what the flow receives.
- The left panel, "Zendesk response – Everything it sends", shows JSON with "count": 2 and a "tickets" array of two items with id and status in bold, and "next_page" and "previous_page" faded.
- A key explains "Bold: what the flow needs" and "Faded: left behind", and a note says the values are illustrative. An arrow leads to the middle panel.
- The middle panel, "Response configuration – Pick, default, shape", step 1, "Translation map · JSONPath": count ← $.count and tickets ← $.tickets. An arrow leads to step 2.
- Step 2, "Translation map defaults": "Fallback values if a path is missing (none here)". An arrow leads to step 3.
- Step 3, "Success template · Velocity": #if($count == 0) returns {"count": $count}, #else returns {"count": $count, "tickets": $tickets} #end. An arrow leads to the right panel.
- The right panel, "Output contract – What the flow gets", shows two cases: "No tickets – count = 0 – Flow offers to create one", and "Tickets found – count = 2, tickets = [ … ] – Read back or screen-popped".
- A note under the cases reads "Must match the output contract's schema exactly".
- A strip at the bottom reads: "The translation map turns a large API payload into exactly the variables the flow expects."
07
Verification, resilience and the agent's view
Identification and verification is where integrations most often move data they never needed. Our rule is that the secret is checked, never stored where it can be read. The caller is identified by their number, through the static phone number lookup, or by their account number held in a custom field. Verification then uses a factor that does not sit in a readable Zendesk field: for example a one-time passcode sent to the customer's registered mobile number or email address, or knowledge answers checked by a dedicated verification service that returns only pass or fail. Anything the caller keys in is collected in an Architect secure flow, which Genesys designs for sensitive PCI and PII data.
Only the outcome reaches participant data, as a verified flag and the method used, so the agent sees a clear verified status and never the answer itself. Resilience gets the same attention. Every data action in a flow has success and failure paths, and we design both: a timeout or a Zendesk error routes the caller to an agent with a flag that the lookup did not complete, never into silence. Genesys now lets administrators set each action's execution timeout from 1 to 60 seconds, and recommends setting it one second longer than the flow's own timeout, which keeps IVR data dips responsive.
When the caller reaches an agent, the Genesys Cloud script is built from participant data the flow has already set, so there is no extra lookup while the call is ringing. The agent sees who is calling and their segment, the verified status, the IVR exit point, and the ticket the caller has just raised or the most recent open one, with a button that opens it in Zendesk. Credentials and traffic stay protected throughout: the integration authenticates with an API token, every request travels over HTTPS, and the Data Actions Performance views let us watch performance and failure rates once the integration is live.
08
Embedded client or data actions, and how we deliver
Genesys also offers Genesys Cloud for Zendesk, an embedded client that places Genesys Cloud contact centre services inside Zendesk, with screen pop, scripts and interaction logs, and support for calls, callbacks, outbound dialling, email, messages and ACD voicemail. Genesys lists Zendesk licences including Zendesk Talk Partner Edition among its prerequisites. It is the natural choice when agents should live in Zendesk. Our pattern suits agents who work in the Genesys Cloud workspace and consult Zendesk as the system of record; the data actions integration that powers it does not depend on Zendesk Talk Partner Edition, and the same actions can serve an embedded deployment later.
On every integration of this kind, our Senior Business Consultant captures the journeys and the Zendesk fields they depend on, the Solution Architect records the design choices, including the Users API decision, in a design decision log and the Interface Control Document, Senior Developers build the actions to the Senior Platform Practice Lead's engineering standards with four-eyes peer review, and our Systems Integration Tester proves the failure paths: no match, two matches, no tickets, a timeout, an expired API token and a ticket created seconds earlier. We design, build and test integrations like this one for clients and systems integrators, and document them so that their own teams can support them.
How it compares
Genesys Cloud CX and Zendesk: native options and the QVCCS pattern
Native facts are as documented in the Genesys Cloud Resource Center and the Zendesk developer documentation, checked in October 2026.
| Aspect | Native Genesys Cloud CX options | QVCCS data-action-led integration |
|---|---|---|
| Where agents work | Genesys Cloud for Zendesk embeds Genesys Cloud contact centre services inside Zendesk. | In the Genesys Cloud agent workspace, with the matched Zendesk ticket one click away. |
| Zendesk prerequisites | The embedded client lists Zendesk licences including Zendesk Talk Partner Edition. The data actions integration needs a verified Zendesk user and an API token. | Built on the data actions integration alone, with no dependency on Zendesk Talk Partner Edition. |
| Caller lookup | Static actions such as Get User By Phone Number and Get User By Email Address, created when the integration is activated. | Static phone lookup plus custom actions by account number, shaped to each flow decision. |
| Recent tickets | Static actions return the most recent ticket by user ID or email address; custom actions can query any Zendesk REST endpoint. | A user-scoped request for live tickets, chosen and tested so a ticket created seconds earlier is returned. |
| Self-service | Custom actions can create, retrieve or update Zendesk data from Architect flows and scripts. | Callers hear their open tickets and raise a new one in a bot flow before reaching an agent. |
| Screen pop | The embedded client provides screen pop, scripts and interaction attributes inside Zendesk. | A Genesys Cloud script built from participant data, showing the caller's newest ticket and verified status. |
| Verification | Architect secure flows are available to any design for sensitive PCI and PII data. | No verification secret in readable Zendesk fields; only a verified flag and method reach the agent. |
| Timeouts and monitoring | Execution timeout configurable from 1 to 60 seconds; Data Actions Performance views show performance and failure rates. | Timeouts set per action, failure paths designed and tested, performance reviewed after go-live. |
The approaches combine: the same data actions and participant data design can serve an embedded Genesys Cloud for Zendesk deployment.
The takeaways
- Callers are recognised from their number or account number before an agent is involved.
- Custom Zendesk user fields drive the IVR in real time, down to its language and persona.
- A user-scoped Zendesk request lets a ticket raised in the IVR appear in the agent's screen pop straight away.
- Translation maps hand the flow exactly the variables it needs, and failure paths keep callers moving.
- No verification secret is stored in Zendesk fields; agents see only a verified status.
Designed, built and supported by the same certified team that delivers Genesys Cloud CX solutions for enterprises and integrators.
Sources
- About the Zendesk data actions integrationhelp.genesys.cloud
- How the data actions integration workshelp.genesys.cloud
- Add a data actions integrationhelp.genesys.cloud
- Add contracts to custom actions for integrationshelp.genesys.cloud
- Request configuration for data actionshelp.genesys.cloud
- Response configuration for data actionshelp.genesys.cloud
- How many seconds before a data action times out?help.genesys.cloud
- Administrator requirements for the Genesys Cloud embedded clientshelp.genesys.cloud
- Zendesk Search API referencedeveloper.zendesk.com
- Zendesk Tickets API reference (List User Requested Tickets)developer.zendesk.com