Skip to main content

Zendesk webhook

You can configure Zendesk to automatically send POST requests to a (Clojure or Scala) collector. The first step is to set up a Zendesk "extension" pointing at the collector.

Log in to Zendesk. Click the cogwheel-shaped "Admin" icon located at the bottom-left corner of the Dashboard page to take you to the Admin page.

In the "SETTINGS" menu, click on "Extensions":

Zendesk Admin settings sidebar with Extensions highlighted under the SETTINGS menu, alongside options like Account, Subscription, Security, Tickets, and Agents.

Click "add target":

Zendesk Extensions page showing the Targets tab with 13 active targets listed and a blue arrow pointing to the add target button in the top right corner.

Choose "HTTP target" from the list of target types to add:

Zendesk Select target to add page showing six options: Campfire target, Twitter target, Clickatell target, URL target, HTTP target (highlighted with a blue border), and JIRA target.

Name the new extension something like "Snowplow Collector - Iglu POST". The "Iglu POST" here represents the fact we will be sending Zendesk events and contexts to Iglu webhook adapter via POST request.

In the URL field, enter https://{{collector_domain}}/com.snowplowanalytics.iglu/v1?aid=zendesk, replacing {{collector_domain}} with your collector domain.

You can optionally have ?aid={{my_zendesk_namespace}} added to this URL, where {{my_zendesk_namespace}} is a label for the application (here: "zendesk"). This label will be attached to all events fired by the extension, so you can later check where a given event came from (useful if you have more than one Zendesk account).

Set the Method field to "POST" and the Content type to "JSON" from the drop-down lists.

Select "Create Target" and click the Submit button.

Zendesk HTTP target form with Title set to "Snowplow Collector - Iglu POST", URL ending in /com.snowplowanalytics.iglu/v1?aid=zendesk, Method set to POST, Content type set to JSON, and a Submit button.

We have set up our collector as a Zendesk extension. We can now add a trigger which sends POST requests to the collector whenever certain events occur.

2. Setting up a trigger for Zendesk event

Setting up trigger conditions

From the Admin page, select "Triggers" from the "BUSINESS RULES" menu and click "add trigger":

Zendesk Triggers page with a numbered blue arrow pointing to Triggers in the Business Rules sidebar (step 1) and another pointing to the Add trigger button in the top right (step 2).

Name the trigger something like "Ticket created or updated" to reflect Zendesk data will be send on ticket creation and update events.

Under "Meet ANY of the following conditions" header click Add condition button to add 2 "Ticket: Is..." conditions and set them to "Created" and "Updated" respectively.

Zendesk trigger creation form with trigger name "Ticket created or updated" and two conditions under Meet ANY of the following conditions: Ticket Is Created and Ticket Is Updated.

Setting up body for ticket event

In the "Actions" section, click on Add action button and select "Notify target" and "Snowplow Collector - Iglu POST".

In the JSON body box, paste the following:

json
{
"schema": "iglu:com.zendesk.snowplow/ticket_updated/jsonschema/1-0-0",
"data": {
"via": "{{ticket.via}}",
"ticketType": {% if ticket.ticket_type.size > 0 %}"{{ticket.ticket_type}}"{% else %}null{% endif %},
"updatedAt": "{{ticket.updated_at_with_timestamp}}",
"ticketId": {{ticket.id}},
"ticketTitle": "{{ticket.title}}",
"priority": {% if ticket.priority.size > 0 %}"{{ticket.priority}}"{% else %}null{% endif %},
"inBusinessHours": {{ticket.in_business_hours}},
"createdAt": "{{ticket.created_at_with_timestamp}}",
"account": "{{ticket.account}}",
"brand": "{{ticket.brand.name}}",
"url": "{{ticket.link}}",
"externalId": {% if ticket.external_id.size > 0 %}"{{ticket.external_id}}"{% else %}null{% endif %},
"organizationName": "{{ticket.organization.name}}",
"organizationId": {% if ticket.requester.organization.id %}{{ticket.requester.organization.id}}{% else %}null{% endif %},
"status": "{{ticket.status}}",
"dueDate": {% if ticket.due_date_with_timestamp.size > 0 %}"{{ticket.due_date_with_timestamp}}"{% else %}null{% endif %},
"tags": {% if ticket.tags.size > 0 %}"{{ticket.tags}}"{% else %}null{% endif %},
"ccNames": "{{ticket.cc_names}}",
"groupAssigned": "{{ticket.group.name}}",
"latestCommentAuthorName": "{{ticket.latest_comment.author.name}}",
"latestComment": "{{ticket.latest_comment.value}}",
"latestCommentIsPublic": {{ticket.latest_comment.is_public}}
}
}

Zendesk trigger Actions section with Notify target set to Snowplow Collector - Iglu POST and a JSON body editor showing the ticket_updated schema payload using Liquid markup template variables, with a validation warning on line 5.

NOTE: Ignore the warning on the left-hand side of the JSON body textbox. It is due to usage of Liquid markup in JSON.

Setting up user contexts

Setting up body for ticket requester

In the "Actions" section, select the 2nd "Notify target" and "Snowplow Collector - Iglu POST" extension.

In the JSON body box, paste the following:

json
{
"schema": "iglu:com.zendesk.snowplow/user/jsonschema/1-0-0",
"data": {
"ticketId": {{ticket.id}},
"updatedAt": "{{ticket.updated_at_with_timestamp}}",
"type": "requester",
"firstName": {% if ticket.requester.first_name.size > 0 %}"{{ticket.requester.first_name}}"{% else %}null{% endif %},
"lastName": {% if ticket.requester.last_name.size > 0 %}"{{ticket.requester.last_name}}"{% else %}null{% endif %},
"language": {% if ticket.requester.language.size > 0 %}"{{ticket.requester.language}}"{% else %}null{% endif %},
"tags": {% if ticket.requester.tags.size > 0 %}"{{ticket.requester.tags}}"{% else %}null{% endif %},
"locale": {% if ticket.requester.locale.size > 0 %}"{{ticket.requester.locale}}"{% else %}null{% endif %},
"notes": {% if ticket.requester.notes.size > 0 %}"{{ticket.requester.notes}}"{% else %}null{% endif %},
"timeZone": {% if ticket.requester.time_zone.size > 0 %}"{{ticket.requester.time_zone}}"{% else %}null{% endif %},
"userId": {% if ticket.requester.id %}{{ticket.requester.id}}{% else %}null{% endif %},
"phone": {% if ticket.requester.phone.size > 0 %}"{{ticket.requester.phone}}"{% else %}null{% endif %},
"extendedRole": {% if ticket.requester.extended_role.size > 0 %}"{{ticket.requester.extended_role}}"{% else %}null{% endif %},
"role": {% if ticket.requester.role.size > 0 %}"{{ticket.requester.role}}"{% else %}null{% endif %},
"details": {% if ticket.requester.details.size > 0 %}"{{ticket.requester.details}}"{% else %}null{% endif %},
"signature": {% if ticket.requester.signature.size > 0 %}"{{ticket.requester.signature}}"{% else %}null{% endif %},
"organization": {% if ticket.requester.organization.size > 0 %}"{{ticket.requester.organization}}"{% else %}null{% endif %},
"externalId": {% if ticket.requester.external_id.size > 0 %}"{{ticket.requester.external_id}}"{% else %}null{% endif %},
"email": {% if ticket.requester.email.size > 0 %}"{{ticket.requester.email}}"{% else %}null{% endif %}
}
}

Setting up body for ticket assignee

In the "Actions" section, select the 3nd "Notify target" and "Snowplow Collector - Iglu POST" extension.

In the JSON body box, paste the following:

json
{
"schema": "iglu:com.zendesk.snowplow/user/jsonschema/1-0-0",
"data": {
"ticketId": {{ticket.id}},
"updatedAt": "{{ticket.updated_at_with_timestamp}}",
"type": "assignee",
"firstName": {% if ticket.assignee.first_name.size > 0 %}"{{ticket.assignee.first_name}}"{% else %}null{% endif %},
"lastName": {% if ticket.assignee.last_name.size > 0 %}"{{ticket.assignee.last_name}}"{% else %}null{% endif %},
"language": {% if ticket.assignee.language.size > 0 %}"{{ticket.assignee.language}}"{% else %}null{% endif %},
"tags": {% if ticket.assignee.tags.size > 0 %}"{{ticket.assignee.tags}}"{% else %}null{% endif %},
"locale": {% if ticket.assignee.locale.size > 0 %}"{{ticket.assignee.locale}}"{% else %}null{% endif %},
"notes": {% if ticket.assignee.notes.size > 0 %}"{{ticket.assignee.notes}}"{% else %}null{% endif %},
"timeZone": {% if ticket.assignee.time_zone.size > 0 %}"{{ticket.assignee.time_zone}}"{% else %}null{% endif %},
"userId": {% if ticket.assignee.id %}{{ticket.assignee.id}}{% else %}null{% endif %},
"phone": {% if ticket.assignee.phone.size > 0 %}"{{ticket.assignee.phone}}"{% else %}null{% endif %},
"extendedRole": {% if ticket.assignee.extended_role.size > 0 %}"{{ticket.assignee.extended_role}}"{% else %}null{% endif %},
"role": {% if ticket.assignee.role.size > 0 %}"{{ticket.assignee.role}}"{% else %}null{% endif %},
"details": {% if ticket.assignee.details.size > 0 %}"{{ticket.assignee.details}}"{% else %}null{% endif %},
"signature": {% if ticket.assignee.signature.size > 0 %}"{{ticket.assignee.signature}}"{% else %}null{% endif %},
"organization": {% if ticket.assignee.organization.size > 0 %}"{{ticket.assignee.organization}}"{% else %}null{% endif %},
"externalId": {% if ticket.assignee.external_id.size > 0 %}"{{ticket.assignee.external_id}}"{% else %}null{% endif %},
"email": {% if ticket.assignee.email.size > 0 %}"{{ticket.assignee.email}}"{% else %}null{% endif %}
}
}

Setting up body for ticket submitter

In the "Actions" section, select the 4th "Notify target" and "Snowplow Collector - Iglu POST" extension.

In the JSON body box, paste the following:

json
{
"schema": "iglu:com.zendesk.snowplow/user/jsonschema/1-0-0",
"data": {
"ticketId": {{ticket.id}},
"updatedAt": "{{ticket.updated_at_with_timestamp}}",
"type": "submitter",
"firstName": {% if ticket.submitter.first_name.size > 0 %}"{{ticket.submitter.first_name}}"{% else %}null{% endif %},
"lastName": {% if ticket.submitter.last_name.size > 0 %}"{{ticket.submitter.last_name}}"{% else %}null{% endif %},
"language": {% if ticket.submitter.language.size > 0 %}"{{ticket.submitter.language}}"{% else %}null{% endif %},
"tags": {% if ticket.submitter.tags.size > 0 %}"{{ticket.submitter.tags}}"{% else %}null{% endif %},
"locale": {% if ticket.submitter.locale.size > 0 %}"{{ticket.submitter.locale}}"{% else %}null{% endif %},
"notes": {% if ticket.submitter.notes.size > 0 %}"{{ticket.submitter.notes}}"{% else %}null{% endif %},
"timeZone": {% if ticket.submitter.time_zone.size > 0 %}"{{ticket.submitter.time_zone}}"{% else %}null{% endif %},
"userId": {% if ticket.submitter.id %}{{ticket.submitter.id}}{% else %}null{% endif %},
"phone": {% if ticket.submitter.phone.size > 0 %}"{{ticket.submitter.phone}}"{% else %}null{% endif %},
"extendedRole": {% if ticket.submitter.extended_role.size > 0 %}"{{ticket.submitter.extended_role}}"{% else %}null{% endif %},
"role": {% if ticket.submitter.role.size > 0 %}"{{ticket.submitter.role}}"{% else %}null{% endif %},
"details": {% if ticket.submitter.details.size > 0 %}"{{ticket.submitter.details}}"{% else %}null{% endif %},
"signature": {% if ticket.submitter.signature.size > 0 %}"{{ticket.submitter.signature}}"{% else %}null{% endif %},
"organization": {% if ticket.submitter.organization.size > 0 %}"{{ticket.submitter.organization}}"{% else %}null{% endif %},
"externalId": {% if ticket.submitter.external_id.size > 0 %}"{{ticket.submitter.external_id}}"{% else %}null{% endif %},
"email": {% if ticket.submitter.email.size > 0 %}"{{ticket.submitter.email}}"{% else %}null{% endif %}
}
}

Setting up body for current user

In the "Actions" section, select the 5th (final) "Notify target" and "Snowplow Collector - Iglu POST" extention.

In the JSON body box, paste the following:

json
{
"schema": "iglu:com.zendesk.snowplow/user/jsonschema/1-0-0",
"data": {
"ticketId": {{ticket.id}},
"updatedAt": "{{ticket.updated_at_with_timestamp}}",
"type": "current_user",
"firstName": {% if current_user.first_name.size > 0 %}"{{current_user.first_name}}"{% else %}null{% endif %},
"lastName": {% if current_user.last_name.size > 0 %}"{{current_user.last_name}}"{% else %}null{% endif %},
"language": {% if current_user.language.size > 0 %}"{{current_user.language}}"{% else %}null{% endif %},
"tags": {% if current_user.tags.size > 0 %}"{{current_user.tags}}"{% else %}null{% endif %},
"locale": {% if current_user.locale.size > 0 %}"{{current_user.locale}}"{% else %}null{% endif %},
"notes": {% if current_user.notes.size > 0 %}"{{current_user.notes}}"{% else %}null{% endif %},
"timeZone": {% if current_user.time_zone.size > 0 %}"{{current_user.time_zone}}"{% else %}null{% endif %},
"userId": {% if current_user.id %}{{current_user.id}}{% else %}null{% endif %},
"phone": {% if current_user.phone.size > 0 %}"{{current_user.phone}}"{% else %}null{% endif %},
"extendedRole": {% if current_user.extended_role.size > 0 %}"{{current_user.extended_role}}"{% else %}null{% endif %},
"role": {% if current_user.role.size > 0 %}"{{current_user.role}}"{% else %}null{% endif %},
"details": {% if current_user.details.size > 0 %}"{{current_user.details}}"{% else %}null{% endif %},
"signature": {% if current_user.signature.size > 0 %}"{{current_user.signature}}"{% else %}null{% endif %},
"organization": {% if current_user.organization.size > 0 %}"{{current_user.organization}}"{% else %}null{% endif %},
"externalId": {% if current_user.external_id.size > 0 %}"{{current_user.external_id}}"{% else %}null{% endif %},
"email": {% if current_user.email.size > 0 %}"{{current_user.email}}"{% else %}null{% endif %}
}
}

Submit the new trigger by clicking Create button. It should look something like this:

Zendesk trigger Actions section showing the final Notify target action set to Snowplow Collector - Iglu POST with submitter user JSON body, and a blue arrow pointing to the Create button in the bottom right.