Skip to main content
The Zendesk connector ships two plugins that surface Zendesk operations as actions on any host collection of your back-end, typically a collection that already carries the Zendesk requester’s identity (an email column) or the Zendesk ticket id (a column like last_zendesk_ticket_id).
Both plugins need a way to reach the Zendesk API. They accept the same ZendeskClientProvider contract as the datasource factory: pass either an already-built client, or raw credentials (subdomain, email, apiToken) and the plugin builds one for you on the fly. Sharing the same client across the Zendesk datasource and the plugins is recommended (single auth setup, single logger), but not required.

Usage

Nothing is registered automatically. Opt each plugin in per collection:
If you’d rather not build a client up-front (for example when you install a single plugin on a project that does not register the Zendesk datasource), pass the credentials straight to the plugin instead:
You can attach the same plugin to multiple collections (e.g. customers and orders) with different option sets. Each plugin throws explicitly if installed at the datasource level — they only work on a collection.

Create a ticket with notification

A Single-scope action that opens a Zendesk ticket from the selected host record. The host record does not need to be related to Zendesk — the requester is identified by an email entered (or pre-filled) in the form, and Zendesk creates the user record on the fly if it does not already exist (the action derives the user’s name from the email’s local-part, e.g. john.doe@acme.com → john.doe, to satisfy Zendesk’s non-empty-name validation).
The form exposes the following fields by default:The default form always creates a public comment, which triggers Zendesk’s default notification email to the requester. When senderEmail is set, that address is used as the support recipient (the From address of the outbound email).

Email-templates wizard

When the email_templates / emailTemplates option is set, the form becomes a two-page wizard:
  1. Page 1 — Template. A Template field lists each template’s title plus a sentinel "No template" entry. Selecting an entry drives the Message default on page 2.
  2. Page 2 — Body. The same fields as above, with the Message field recomputed from the page 1 selection.
  • A real template selected → interpolate(template.content, record).
  • "No template" selected → defaultMessage is honored (if set), otherwise the field is empty.
Token interpolation supports {{ record.<path> }} with dotted paths (e.g. {{ record.org.name }}). Tokens that resolve to null/undefined become an empty string. Token values are not HTML-escaped — the form is RichText/HTML, so do not interpolate untrusted data into the message body.
This is an intentional cross-runtime difference: the Ruby plugin escapes token values, and its wizard ignores default_message in template mode, whereas the Node.js plugin honors defaultMessage when “No template” is selected.

Close a ticket

Registers actions that transition a Zendesk ticket to solved or closed. The plugin reads the ticket id from a configurable column on the host record(s) — so you can close a Zendesk ticket directly from a host row that stores last_zendesk_ticket_id, without having to navigate to the ticket collection.
statuses and scopes are orthogonal — the plugin registers one action per (status, scope) pair, so the full default registers four actions on the host collection:Pick subsets to register fewer variants, e.g. { statuses: ['closed'], scopes: ['Bulk'] } registers a single bulk-close action. You can also point the plugin directly at zendesk_ticket with ticketIdField: 'id' to get a native “close from the ticket detail” action.

Status semantics

  • solved is the standard “resolved” workflow; the requester can still reopen the ticket during Zendesk’s reopen window.
  • closed is terminal. Zendesk rejects further updates to a closed ticket and sometimes rejects the direct open → closed transition.
The plugin recognises Zendesk’s “closed prevents ticket update” error (HTTP 422 with a matching detail message) and translates it to a clean outcome:
  • Targeting closed on an already-closed ticket → success (counted as “was already closed”).
  • Targeting solved on an already-closed ticket → failure (Zendesk does not allow editing a closed ticket).

Bulk behaviour

Each id is processed independently — a single rejected transition does not abort the rest of the run. The success message reports succeeded, already-closed and failed ids so partial successes are visible. If every id fails the action surfaces as an error rather than a partial success.
If no usable id can be read from the selected record(s) (e.g. ticketIdField is empty), the action returns an error with No ticket id available on the selected record(s). rather than calling Zendesk.