Overview
Use this guide to connect Contentsquare Conversation Intelligence to your Zendesk account through OAuth 2.0.
After the connection is complete, Conversation Intelligence reads selected Zendesk data to ingest and analyze supported conversations. This includes:
- Support tickets: Conversations created through email, web forms, APIs, and Agent Workspace native messaging.
- User data: Agent and administrator information associated with each conversation, retrieved from the Zendesk Users resource.
Conversation Intelligence requests read-only access for core analytics. It doesn't create, edit, or delete data in your Zendesk account.
This guide is part of Step 4 in the Conversation Intelligence Getting Started guide.
Zendesk Chat and Zopim live chat aren't supported. Conversation Intelligence supports ticket-based channels, including Zendesk Messaging, but doesn't ingest legacy Zendesk Chat transcripts.
Permissions
The credential used by Conversation Intelligence must be able to read the conversations you want analyzed for every agent whose work you want scored. In Zendesk, the credential must belong to, or be approved by, a staff user with the required role.
Email and ticket channels
The integration user must be an Agent or Administrator. End users can't call these APIs. The user's role must grant the following access:
- Read access to all relevant tickets. The user must be able to access all relevant tickets across the account, not only tickets assigned to that user. A standard Administrator or a custom agent role with Access: All tickets satisfies this requirement. A role limited to tickets in the user's groups can exclude conversations from other groups.
- Read access to users. Conversation Intelligence uses the agent and administrator roster to attribute messages to agents and resolve names and email addresses. Without this access, agent-email-based ingestion filtering doesn't work.
- Read access to ticket audits and history. This is a separate permission layer. Messaging transcripts, status changes, and side conversations are rebuilt from
/tickets/{id}/audits. A credential that can read tickets but not audits fails during ingestion.
These are separate permission layers in Zendesk. A valid token, confirmed by a successful GET /users/me request, doesn't guarantee access to users, tickets, or audits. Conversation Intelligence validates each layer independently during onboarding.
Set up the connection
Step 1: Locate your Zendesk base URL
Your Zendesk base URL follows this format: https://<your-subdomain>.zendesk.com.
- Sign in to your Zendesk account.
- Look at the URL in your browser's address bar.
- Copy your base URL. For example:
https://acme-corp.zendesk.com.
Step 2: Create an OAuth client in Zendesk
- Sign in to Zendesk as an Administrator.
- Go to Admin Center, or Settings, then select Apps and integrations and OAuth clients. Depending on your Zendesk version, this may appear under Zendesk API and OAuth Clients.
- Click Add OAuth client.
- Complete the form:
- Name: Enter a clear name, such as
CSQ CI Integration. - Description: Enter an optional description.
- Company: Enter your company name.
- Identifier: Enter a unique value, such as
csq_ci_integration. Save this value as your Client Identifier. - Client kind: Select Confidential.
- Redirect URL: Add
https://live.loris.ai/zendesk/callback.
- Name: Enter a clear name, such as
- Click Save.
- Copy the secret immediately. Zendesk displays the secret after you save the client and only displays it once. Store it securely as your Client Secret.
Step 3: Connect Zendesk in the Conversation Intelligence onboarding wizard
Add the csq_eligible tag to every conversation you want to analyze. Without this tag, no data comes through, even if the connection succeeds. See the CSQ eligible tag guide for detailed instructions.
- Open the Conversation Intelligence onboarding wizard.
- Select Zendesk from the list of integration providers.
- Enter the values requested by the wizard, including your Zendesk base URL, Client Secret, and API key or Client Identifier.
- After tagging the conversations you want to ingest, select I've added the Contentsquare tag and I'm ready to connect.
- Click Connect platform and sign in to Zendesk to complete the OAuth 2.0 flow.
After authentication is complete, Conversation Intelligence can securely access the approved Zendesk data required for ingestion and analysis.
Supported channels
Zendesk Messaging and Zendesk Chat are different Zendesk products. Confirm which product and channel your organization uses before selecting channels in the onboarding wizard.
Ticket-based channels
Conversation Intelligence ingests the following channels through Zendesk's Support Tickets API. Each conversation is represented as a Zendesk ticket.
Zendesk via.channel value | Conversation Intelligence channel |
|---|---|
email, any_channel, side_conversation | |
web | Web form |
api, system, rule | API, including tickets created by triggers, automations, or SLA policies |
native_messaging, sunshine_conversations_api | Messaging, including native and enhanced Zendesk Messaging |
sms | SMS |
mobile_sdk | Mobile SDK |
facebook, sunshine_conversations_facebook_messenger | |
twitter, sunshine_conversations_twitter_dm | Twitter or X |
instagram_dm | |
voice | Voice through Zendesk Talk |
chat | The related ticket for a legacy Zendesk Chat conversation. The legacy Chat transcript itself isn't supported. |
Ingestion scope and eligibility
Conversation Intelligence applies the following rules to ticket-based channels.
Terminal-state filter
Conversation Intelligence ingests only conversations in the Solved or Closed state. Tickets in new, open, pending, or hold aren't ingested.
CSQ eligible filter
When eligibility filtering is enabled, Conversation Intelligence adds the csq_eligible tag to the Zendesk search export query. Only tickets with this tag are eligible for ingestion.
Exclusions
- Answer Bot tickets: Tickets with
via.channel == 'answer_bot_for_web_widget'are skipped. - Unsupported channels: Tickets with a
via.channelvalue that isn't in the supported channel mapping are skipped. For example,chat_transcriptfrom another source isn't supported. - Zendesk Messaging without a customer reply: Single-message Messaging tickets where the only message isn't from the end user are skipped.
- Voice without a recording: Tickets without a
VoiceCommentare skipped. Voicemails and calls without a recording URL may be partially skipped.
API access
API requests
Conversation Intelligence uses GET requests to read data for ingestion. It doesn't use write requests.
The following endpoints are used for email and ticket channels: https://<subdomain>.zendesk.com/api/v2/...
| Purpose | Endpoint or data source |
|---|---|
| Credential and authentication health check | GET /users/me |
| Agent and administrator roster | GET /users?role[]=agent&role[]=adminGET /users/search.json?query=email:<email> |
| Discover tickets updated during a time window | Search Export API using search_export and a query such as type:ticket updated_at_between ... |
| Ticket messages | GET /tickets/{id}/comments |
| Ticket history, including messaging transcripts and status changes | GET /tickets/{id}/audits |
| Side conversations | GET /tickets/{id}/side_conversations/{thread_id}/events |
| Account metadata for enrichment | Groups, ticket fields, ticket forms, brands, and macros |
| Voice, when enabled | voice_comments embedded in ticket JSON, the ticket's recording_url, and GET /channels/voice/stats/incremental/calls.json?start_time=<epoch_seconds> |
Fields Conversation Intelligence reads
Conversation Intelligence reads the fields listed below. If an optional field isn't available in your Zendesk account, it is ignored. Ingestion is read-only.
Ticket
id, the ticket IDvia.channel, the origin channel, such as email, web, API, native messaging, voice, or chatvia.source.fromandvia.source.to, customer name when PII storage is enabledstatus, the ticket statuscreated_at, the creation timeupdated_at, the last update time used for incremental discoverytags, the ticket tags, includingcsq_eligiblewhen eligibility filtering is enabled
Ticket comment
idauthor_idcreated_atorcreatedplain_body,body, orhtml_bodypublictype, such asVoiceCommentattachmentsvia.channelandvia.source
Ticket audit
created_atauthor_idevents[], includingtype,field_name,value,previous_value,macro_id, andthread_idvalue.history[]for messaging, includingactor_id,actor_type,actor_name,message,timestamp,message_id, andtype
Ticket metrics
reply_time_in_seconds.calendar, first reply timefirst_resolution_time_in_minutes.calendar, handle time
Side conversation events
idcreated_atmessage.subjectmessage.html_bodymessage.fromandmessage.toside_conversation_id
Enrichment metadata
- Group:
id,name - Ticket field:
id,title,active,custom_field_options[] - Ticket form:
id,name - Brand:
id,name - Macro:
id,actions[]
Voice, when enabled
call_idrecording_urlrecording_type, excludingvoicemailstarted_atcall_durationanswered_by_idandanswered_by_namevia.source
Legacy Chat data
Legacy Zendesk Chat isn't supported. The following fields may appear on a related ticket or in source data but aren't used to ingest a standalone Chat transcript:
idzendesk_ticket_idhistory[], includingtype,timestamp,index,msg,sender_type,agent_id, andnamerating,response_time,duration,tags,visitor.name, and hashedvisitor.id
User
idnameemailrole, where only agents and administrators are treated as agents- Optional
user_fields.cs_agent_level
Need help?
If you have questions about the required Zendesk permissions, OAuth setup, or supported channels, contact your Contentsquare Customer Success Manager.