Ticket forms
This guide covers how to create, edit, and manage Zendesk ticket forms at GitLab. Administrators should review the Administrator tasks section.
Technical Details
- Deployment type:
Standard - Sync repos
Warning
- This is very closely tied with Ticket fields, especially as they run in the same sync repo
- This is very closely tied to Dynamic content in Zendesk Global
Understanding ticket forms
What are ticket forms
Ticket forms are the forms utilized by the user to create tickets (when using the web UI). These then translate the responses on the form into ticket metadata.
These fall into one of two types:
- Public - meaning both agents and end-users can see these
- Internal - meaning only agents can see these
How we manage ticket forms
While Zendesk offers a full way to manage ticket forms via the UI, we turn to a more version controlled methodology. This allows for a set review process, the ability to perform rollbacks as needed, etc.
That being the case, we utilize sync repos.
How the sync repo works
The sync repo workflow follows this process:
graph TD; A-->C; B-->C; C-->D; A(Scheduled time for pipeline to run) B(Scheduled pipeline triggered manually) C(bin/sync runs) D(Changes synced to Zendesk)
Ticket forms use condition logic
Ticket forms can use conditions to show/hide fields dynamically:
end_user_conditions: Controls what fields end-users see based on their selectionsagent_conditions: Controls what fields agents see and when they’re required
When a parent field has a specific value, child fields are shown (and optionally made required). Example: “If Product Category is ‘GitLab.com’, show the ‘GitLab.com User ID’ field”
A ticket form does not have to use conditions. Without any conditions, all fields detailed in the form data will show.
This is also how conditional requirements can be set on a ticket form.
In the UI, the format of an end-user condition is:
If the value of TICKET_FIELD is VALUE, then show LIST_OF_TICKET_FIELDS
With each item in LIST_OF_TICKET_FIELDS having the option to require the ticket field item in some way.
The backend for the two types are similar with key differences in the requirement definition.
End-user conditions
The format of the backend value for an end-user condition is:
- parent_field_id: 'Field title'
value: 'tag_or_value_used_by_field'
child_fields:
- id: 'Field title 2'
is_required: true
Breaking this down:
parent_field_idis thefieldwe are checking the value ofvalueis the value of thefieldwe are checkingchild_fieldsis a list of fields to show, with each item having:idis the field to showis_requiredis detailing if the newly shown field is required for submission
Agent conditions
The format of the backend value for an agent condition is one of two formats:
- parent_field_id: 'Field title'
value: 'tag_or_value_used_by_field'
child_fields:
- id: 'Field title 2'
is_required: true
required_on_statuses:
type: 'ALL_STATUSES'
- parent_field_id: 'Field title'
value: 'tag_or_value_used_by_field'
child_fields:
- id: 'Field title 2'
is_required: true
required_on_statuses:
type: 'SOME_STATUSES'
statuses:
- 'pending'
- 'hold'
- 'solved'
Breaking this down:
parent_field_idis thefieldwe are checking the value ofvalueis the value of thefieldwe are checkingchild_fieldsis a list of fields to show, with each item having:idis the field to showis_requiredis detailing if the newly shown field is required in some way
What determines the difference is if the new field is required and in what way it is required:
-
If requiring it on all statuses:
- id: 'Field title 2' is_required: true required_on_statuses: type: 'ALL_STATUSES' -
If requiring it on no statuses (i.e. not requiring it):
- id: 'Field title 2' is_required: true required_on_statuses: type: 'NO_STATUSES' -
If requiring it only for specific statuses:
- id: 'Field title 2' is_required: true required_on_statuses: type: 'SOME_STATUSES' statuses: - 'list' - 'of' - 'statuses'
Creating a ticket form as a non-admin
For the creation of a ticket form, please create a Feature Request issue (as it will require manual intervention by the Customer Support Operations team).
Editing a ticket form as a non-admin
For the modification of a ticket form, please create a Feature Request issue (as it will require manual intervention by the Customer Support Operations team).
Deactivating a ticket form as a non-admin
To request the deactivation of a ticket form, please create a Feature Request issue (as it will require manual intervention by the Customer Support Operations team).
Human readable replacements
Note
- Only applies to
administratorscreating/editing ticket forms via YAML files
Currently, the sync repo can perform replacements for ticket fields and brand from a human readable format (i.e. the title attribute of the ticket field).
So in cases where it sees the value Preferred Region for Support, it knows to locate the ticket field with that title and convert it into the needed text for the ticket form attribute it was within. The same is true for brands (except they use the name attribute).
Current forms
Zendesk Global current forms
| Internal name | Public name | Visibility | Entitlement required? | Direct Link |
|---|---|---|---|---|
| SaaS | Support for GitLab.com | Public | Y | Link |
| 2FA Removal | 2FA Reset | Public | Y | Link |
| SaaS Account | GitLab.com user accounts and login issues | Public | N | Link |
| Self-Managed | Support for a self-managed GitLab instance | Public | Y | Link |
| GitLab Dedicated | Support for GitLab Dedicated instances | Public | Y | Link |
| L&R | Subscription, License or Customers Portal Problems | Public | N | Link |
| Billing | Billing inquiries/refunds | Public | N | Link |
| Alliance Partners | Support for alliance partners | Public | Y | Link |
| Support Ops | Support portal related matters | Public | N | Link |
| Emergencies | File an emergency request | Public | N | Link |
| Support Internal Request | Internal | N | ||
| GitLab Incidents | Internal | N | ||
| Customer Support Internal Requests | Customer Support Internal Requests | Internal | N | Link |
| L&R Support Internal Requests | L&R Support Internal Requests | Internal | N | Link |
| CustSuppOps Support Internal Requests | CustSuppOps Support Internal Requests | Internal | N | Link |
Zendesk US Government current forms
| Internal name | Public name | Visibility | Entitlement required? | Direct Link |
|---|---|---|---|---|
| Support | Technical Support Requests | Public | Y | Link |
| GitLab Dedicated | GitLab Dedicated Technical Support Requests | Public | Y | Link |
| Upgrade Assistance | Upgrade Planning Assistance Request | Public | Y | Link |
| Support Ops | Support portal related matters | Public | Y | Link |
| L&R | License, Subscription, and Renewals Request | Public | Y | Link |
| Emergency | Emergency Support Request | Public | Y | Link |
| License Issue | Internal | N | ||
| L&R Support Internal Requests | L&R Support Internal Requests | Internal | N | Link |
| CustSuppOps Support Internal Requests | CustSuppOps Support Internal Requests | Internal | N | Link |
Administrator tasks
Note
- All sections in this section require
Administratorlevel access to Zendesk.
Viewing ticket forms
To view ticket forms on Zendesk:
- Navigate to the admin panel for the Zendesk instance
- Go to
Objects and rules > Tickets > forms
Note: You might need to change the active filter by clicking the Filter button if wanting to view non-active ticket forms
Creating a ticket form
Warning
- This should only be done if there is a corresponding request issue (Feature Request, Administrative, Bug, etc.). If one does not exist, you should first create one (and let it go through the standard process before working it).
For the creation of a ticket form, you will need to create a MR in the sync repo. The exact changes being made will depend on the request itself. A starting template you can use would be:
---
name: 'Your form name here'
previous_name: 'Your form name here'
display_name: 'Customer visible name'
raw_display_name: 'Customer visible name' # Dynamic content placeholder can be used here
active: true
position: 1 # Integer representing ticket form position
ticket_field_ids:
- 'Field title'
- 'Field title 2'
- 'Field title 3'
- 'Field title 4'
default: false # Is the form the default form for this account
in_all_brands: false # Is the form available for use in all brands on this account (should always be false)
restricted_brand_ids:
- 'Brand name'
end_user_conditions:
- parent_field_id: 'Field title'
value: 'tag_or_value_used_by_field'
child_fields:
- id: 'Field title 2'
is_required: true
- id: 'Field title 3'
is_required: false
agent_conditions:
- parent_field_id: 'Field title'
value: 'tag_or_value_used_by_field'
child_fields:
- id: 'Field title 2'
is_required: true
required_on_statuses:
type: 'ALL_STATUSES'
- id: 'Field title 3'
is_required: true
required_on_statuses:
type: 'NO_STATUSES'
- id: 'Field title 4'
is_required: true
required_on_statuses:
type: 'SOME_STATUSES'
statuses:
- 'pending'
- 'hold'
- 'solved'
Ticket forms can be very complex to create from scratch, so when in doubt use an existing one from the sync repo as a viable example.
After a peer reviews and approves your MR, you can merge the MR. When the next deployment occurs, it will be synced to Zendesk.
Editing a ticket form
Warning
- This should only be done if there is a corresponding request issue (Feature Request, Administrative, Bug, etc.). If one does not exist, you should first create one (and let it go through the standard process before working it).
To edit a ticket form, you will need to create a MR in the sync repo. The exact changes being made will depend on the request itself.
After a peer reviews and approves your MR, you can merge the MR. When the next deployment occurs, it will be synced to Zendesk.
Changing the name of a ticket form
If you need to change the title of a ticket form, copy the current value into the previous_name attribute and then change the name attribute. This allows the sync to still locate the ticket form in question to update.
Deactivating a ticket form
Warning
- This should only be done if there is a corresponding request issue (Feature Request, Administrative, Bug, etc.). If one does not exist, you should first create one (and let it go through the standard process before working it).
To deactivate a ticket form, you will need to create a MR in the sync repo. In this MR, you should do the following to the corresponding ticket form’s YAML file:
-
Move the file from the
activetoinactivepath -
Modify the value of the
activeattribute tofalse -
Change the value of
ticket_field_idsto the following:- 'Status' - 'Group' - 'Assignee' - 'Ticket status' - 'Subject' - 'Description' -
Change the value of
end_user_conditionsbe an empty array (i.e.[]) -
Change the value of
agent_conditionsbe an empty array (i.e.[])
After a peer reviews and approves your MR, you can merge the MR. When the next deployment occurs, it will be synced to Zendesk.
Deleting a ticket form
Warning
- You can only delete a ticket form if it is deactivated.
- This should only be done if there is a corresponding request issue (Feature Request, Administrative, Bug, etc.). If one does not exist, you should first create one (and let it go through the standard process before working it).
As the sync repos do not perform deletions, you will need to do this via Zendesk itself.
To delete a ticket form:
- Navigate to the admin panel for the Zendesk instance
- Go to
Objects and rules > Tickets > forms - Change the filter to
Inactive - Locate the ticket form you wish to delete and click its name
- Click the three vertical dots (top-right of the ticket form data)
- Click
Delete - Click
Deleteto submit the changes
Performing an exception deployment
Warning
- This applies for both ticket forms and ticket fields
To perform an exception deployment for ticket forms, navigate to the ticket forms sync project in question, go to the scheduled pipelines page, and click the play button for the sync item. This will trigger a sync job for the ticket forms.
Common issues and troubleshooting
Not seeing ticket form changes after a merge
As ticket forms follow the Standard deployment type, they would only be deployed during a normal deployment cycle (or when an exception deployment has been done)
f895738e)
