> For the complete documentation index, see [llms.txt](https://docs.whalesync.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.whalesync.com/connectors/zendesk.md).

# Zendesk

Two-way sync Zendesk tickets, users, organizations, and custom objects with Airtable, Notion, Google Sheets, and more. Covers connecting and which fields sync.

## Zendesk Connector Guide

This guide covers how to connect Whalesync to [Zendesk](https://www.zendesk.com), how your tickets, users, and organizations appear in Whalesync, and which fields sync.

In Whalesync terms, a Zendesk **account** is the base, and **Tickets**, **Users**, **Organizations**, and each **custom object** are tables. Three more tables, **Agents**, **Groups**, and **Brands**, list what fields such as a ticket's assignee and group point at; they are read only.

### Connecting to Zendesk

Whalesync connects by signing in to your Zendesk account. See [Authorize Zendesk](https://docs.whalesync.com/connectors/zendesk/authorize-zendesk.md).

1. In Whalesync, choose Zendesk and enter your account's subdomain: for `acme.zendesk.com`, enter `acme`.
2. Sign in to Zendesk and allow Whalesync access.
3. Pick the tables to sync.

### Syncing Data

* **Tickets** holds tickets, one record each.
* **Users** holds users of every role: end users, agents, and admins.
* **Organizations** holds organizations.
* **Each custom object** is a table named after it, holding its records, when the account's plan includes custom objects.
* **Agents** holds the account's agents and admins, so a ticket's assignee and followers can link to them without syncing every end user.
* **Groups** and **Brands** hold the account's groups and brands.

Each table's columns are Zendesk's standard fields plus the account's active custom fields for tickets, users, organizations, or that custom object. Inactive custom fields are left out.

## Supported Fields

### Tickets

<table><thead><tr><th>Zendesk field</th><th>Status</th><th>Notes</th></tr></thead><tbody>
<tr><td>Subject</td><td>✅ Supported</td><td>Zendesk keeps the first 255 characters.</td></tr>
<tr><td>Description</td><td>✅ Supported</td><td>The ticket's first comment, as plain text. It's set when Whalesync creates the ticket, using the subject when the record has no description. Later changes to it aren't written to Zendesk.</td></tr>
<tr><td>Status</td><td>✅ Supported</td><td>One of <code>new</code>, <code>open</code>, <code>pending</code>, <code>hold</code>, <code>solved</code>, or <code>closed</code>, in lowercase. Any other value, such as <code>Open</code>, is reported as a sync issue for that ticket. An empty status leaves the ticket's status as it is.</td></tr>
<tr><td>Priority</td><td>✅ Supported</td><td>One of <code>urgent</code>, <code>high</code>, <code>normal</code>, or <code>low</code>.</td></tr>
<tr><td>Type</td><td>✅ Supported</td><td>One of <code>problem</code>, <code>incident</code>, <code>question</code>, or <code>task</code>.</td></tr>
<tr><td>Custom status</td><td>✅ Supported</td><td>Synced by the status's agent label.</td></tr>
<tr><td>Ticket form</td><td>✅ Supported</td><td>Synced by the form's name.</td></tr>
<tr><td>Requester, CCs</td><td>✅ Supported</td><td>Links to the Users table.</td></tr>
<tr><td>Assignee, Followers</td><td>✅ Supported</td><td>Links to the Agents table.</td></tr>
<tr><td>Group</td><td>✅ Supported</td><td>A link to the Groups table.</td></tr>
<tr><td>Organization</td><td>✅ Supported</td><td>A link to the Organizations table. Zendesk ignores it unless the requester belongs to that organization.</td></tr>
<tr><td>Brand</td><td>✅ Supported</td><td>A link to the Brands table.</td></tr>
<tr><td>Problem ticket</td><td>✅ Supported</td><td>A link to another ticket: the problem an incident belongs to. Zendesk refuses a link to a ticket whose Type isn't <code>problem</code>.</td></tr>
<tr><td>Tags</td><td>✅ Supported</td><td>The ticket's tags, apart from the ones its fields add. See <a href="#tags">Tags</a>.</td></tr>
<tr><td>Due date</td><td>✅ Supported</td><td>A date and time. Zendesk keeps it only when the ticket's Type is <code>task</code>.</td></tr>
<tr><td>External ID</td><td>✅ Supported</td><td></td></tr>
<tr><td>Submitter</td><td>➡️ Supported (1-Way)</td><td>Read only. A link to the Users table.</td></tr>
<tr><td>Recipient, Channel, Satisfaction, Public, Has incidents</td><td>➡️ Supported (1-Way)</td><td>Read only.</td></tr>
<tr><td>Link, Created at, Updated at</td><td>➡️ Supported (1-Way)</td><td>Read only. Link opens the ticket in Zendesk.</td></tr>
<tr><td>Comments, Attachments</td><td>✖️ Not supported</td><td>No column. The first comment is the Description.</td></tr>
</tbody></table>

### Users

<table><thead><tr><th>Zendesk field</th><th>Status</th><th>Notes</th></tr></thead><tbody>
<tr><td>Name</td><td>✅ Supported</td><td>Required when creating a user from another app.</td></tr>
<tr><td>Email, Phone</td><td>✅ Supported</td><td>The user's primary email and phone. Changing one makes the new one primary and keeps the old one on the user as a secondary, so mail or calls from it still reach them. Clearing one leaves it as it is. Zendesk stores phone numbers in international format, such as <code>+14155550100</code>.</td></tr>
<tr><td>Role</td><td>✅ Supported</td><td>One of <code>end-user</code>, <code>agent</code>, or <code>admin</code>.</td></tr>
<tr><td>Organization</td><td>✅ Supported</td><td>A link to the Organizations table.</td></tr>
<tr><td>Tags</td><td>✅ Supported</td><td>See <a href="#tags">Tags</a>.</td></tr>
<tr><td>Time zone</td><td>✅ Supported</td><td>Zendesk reads time zones back by its own names, so <code>America/Los_Angeles</code> comes back as <code>Pacific Time (US &amp; Canada)</code>.</td></tr>
<tr><td>Ticket access</td><td>✅ Supported</td><td>One of <code>organization</code>, <code>groups</code>, <code>assigned</code>, or <code>requested</code>.</td></tr>
<tr><td>External ID, Alias, Details, Notes</td><td>✅ Supported</td><td></td></tr>
<tr><td>Verified, Suspended</td><td>✅ Supported</td><td>Checkboxes.</td></tr>
<tr><td>Default group</td><td>➡️ Supported (1-Way)</td><td>Read only. A link to the Groups table.</td></tr>
<tr><td>Language, Signature, Private comments only, Shared agent, Last sign-in</td><td>➡️ Supported (1-Way)</td><td>Read only.</td></tr>
<tr><td>Link, Created at, Updated at</td><td>➡️ Supported (1-Way)</td><td>Read only.</td></tr>
</tbody></table>

### Organizations

<table><thead><tr><th>Zendesk field</th><th>Status</th><th>Notes</th></tr></thead><tbody>
<tr><td>Name</td><td>✅ Supported</td><td>Required when creating an organization from another app.</td></tr>
<tr><td>Domains</td><td>✅ Supported</td><td>A list of domains.</td></tr>
<tr><td>Group</td><td>✅ Supported</td><td>A link to the Groups table.</td></tr>
<tr><td>Shared tickets, Shared comments</td><td>✅ Supported</td><td>Checkboxes. Zendesk ignores Shared comments unless Shared tickets is on.</td></tr>
<tr><td>Details, Notes, External ID</td><td>✅ Supported</td><td></td></tr>
<tr><td>Tags</td><td>✅ Supported</td><td>See <a href="#tags">Tags</a>.</td></tr>
<tr><td>Link, Created at, Updated at</td><td>➡️ Supported (1-Way)</td><td>Read only.</td></tr>
</tbody></table>

### Custom objects

<table><thead><tr><th>Zendesk field</th><th>Status</th><th>Notes</th></tr></thead><tbody>
<tr><td>Name</td><td>✅ Supported</td><td>Required when creating a record from another app.</td></tr>
<tr><td>External ID</td><td>✅ Supported</td><td></td></tr>
<tr><td>Created by, Updated by</td><td>➡️ Supported (1-Way)</td><td>Read only. Links to the Users table.</td></tr>
<tr><td>Created at, Updated at</td><td>➡️ Supported (1-Way)</td><td>Read only.</td></tr>
</tbody></table>

### Custom fields

Each active custom field is a column of its table: ticket fields on Tickets, user fields on Users, organization fields on Organizations, and a custom object's fields on its table.

<table><thead><tr><th>Custom field type</th><th>Status</th><th>Notes</th></tr></thead><tbody>
<tr><td>Text, Multi-line, Regex</td><td>✅ Supported</td><td>Zendesk refuses a value that doesn't match a regex field's pattern, and Whalesync reports it as a sync issue for that record.</td></tr>
<tr><td>Checkbox</td><td>✅ Supported</td><td></td></tr>
<tr><td>Number, Decimal</td><td>✅ Supported</td><td></td></tr>
<tr><td>Currency</td><td>✅ Supported</td><td>Custom objects only. A number.</td></tr>
<tr><td>Date</td><td>✅ Supported</td><td>A date, with no time.</td></tr>
<tr><td>Drop-down</td><td>✅ Supported</td><td>Synced by option name. The option has to exist in Zendesk. When two options share a name, the option's ID follows its name, so each one writes back as itself.</td></tr>
<tr><td>Multi-select</td><td>✅ Supported</td><td>Synced by option names. Each option has to exist in Zendesk.</td></tr>
<tr><td>Lookup relationship</td><td>✅ Supported</td><td>A link to the Users, Organizations, or Tickets table, or to a custom object's table.</td></tr>
<tr><td>Credit card</td><td>➡️ Supported (1-Way)</td><td>Read only. Zendesk keeps only the last four digits.</td></tr>
<tr><td>Ticket fields agents can't edit</td><td>➡️ Supported (1-Way)</td><td>Read only. Zendesk's own features fill these in, and Zendesk ignores other changes to them.</td></tr>
<tr><td>Other types</td><td>➡️ Supported (1-Way)</td><td>Read only, as text.</td></tr>
</tbody></table>

## Tags

Zendesk tags a ticket, user, or organization with the value of each drop-down, multi-select, and checkbox field it has. Those tags belong to the fields, so the Tags column leaves them out and holds only the other tags. When Tags changes in another app, Whalesync keeps the fields' tags on the record, so a tag edit never clears a field.

A ticket whose requester changes also takes on the requester's user tags, which then show in its Tags column.

## Real-time updates

Whalesync registers one webhook on your Zendesk account, so most changes to tickets, users, and organizations reach your other apps within seconds.

Zendesk sends no webhook for custom object records, Groups, or Brands, or for an organization's details, notes, domains, group, or sharing settings. Those changes are found by a scan of the account that runs once a day while webhooks are on. A sync that maps none of Tickets, Users, Agents, or Organizations has no webhook, and scans for changes on its [sync frequency](https://docs.whalesync.com/features/additional-features/sync-frequency.md) instead.

## Deleting records

Deleting a record in another app deletes it in Zendesk. A deleted ticket goes to Zendesk's deleted tickets, where it can be restored for 30 days. **Deleting a Zendesk user or organization is permanent.**

[Delete Protection](https://docs.whalesync.com/features/additional-features/delete-protection.md) is off until you turn it on for a table. We recommend turning it on for the Users and Organizations tables, so a record deleted in another app never deletes a user or organization in Zendesk.

## Things to Keep in Mind

* **Synced changes run your Zendesk triggers.** Zendesk treats a change Whalesync makes like an agent's edit, so your account's triggers run on it, and a new or updated ticket can email its requester.
* **Closed tickets can't be edited.** Zendesk refuses changes to a closed ticket, and Whalesync reports *This Zendesk ticket is closed, and Zendesk does not allow changes to closed tickets. Edit a follow-up ticket instead.* as a sync issue for it.
* **Comments and attachments are not synced.** A ticket's first comment is its Description.
* **Whalesync doesn't create fields, drop-down options, custom statuses, or ticket forms.** A value that doesn't match one in Zendesk is reported as a sync issue for that record.
* **Whalesync makes at most 2 requests a second to Zendesk**, which leaves room for your account's other apps under Zendesk's per-minute limit. Writing a record takes at least two requests, so a large first sync into Zendesk takes a while.
