ZenDesk
Setting up a collector as a Zendesk extension
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":
Click "add target":
Choose "HTTP target" from the list of target types to add:
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.
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":
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.
Setting up body for ticket event
In the "Actions" section, click on Add action button and select "Notify target" and "Snowplow Collector - Iglu POST" (the extension you set up in Setting up a collector as a Zendesk extension section above).
In the JSON body box, paste the following:
{
"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}}
}
}
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:
{
"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:
{
"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:
{
"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:
{
"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: