You may be familiar with Liquid markup from our email notifications instructions . This templating language allows us to populate placeholders with the appropriate ticket information. Placeholders such as {{ticket.requester.first_name}} are converted into the appropriate text (for example, "Bob") when the email notification is sent to the user.
But, what if the text generated from a placeholder doesn't look the way you want it to? Well, you can change the format of the output created from placeholders using Liquid markup! With a few simple tricks, you can truly customize your email notifications to fit your regional formatting and workflow needs.
Today we'll focus on output markup and using filters to modify placeholder output. Output markup (such as our placeholders) is surrounded by matched pairs of braces, {{ticket.ticket_id}} for example. A filter is a simple method that acts on the output markup. The filters modify the output and the result is displayed as a string. The output and the markup are separated by a vertical bar, or "pipe" (|), and the overall format is {{ output | filter: }}.
You can see all of the standard filters on the Liquid for Designers page. To illustrate the concept, let's look at two real-world examples that use filters to modify a placeholder output.
Example 1: Showing only the last element in nested custom ticket fields
When building custom drop-down fields, you can nest the structure using double colons - "::". For example, if you make a drop-down with options of "Support::Password", "Support::Performance", "Billing::Invoice", and "Billing::Refund", the end user will first select either "Support" or "Billing" and then choose the options within these categories. You can output custom ticket fields like this in a placeholder, following the format {{ticket.ticket_field_ <field ID number> }}.
However, this default placeholder format does not take nesting into account. The output for the above example would be "Billing::Invoice", which shows the double colons. To show the last element only, "Invoice", we will use two filters in combination. The first filter, called "split", splits the string up on a matching pattern ("::"). The second filter, "last", gets the last element of the passed-in array. Because we want to split on "::" that is what will go after the split filter:
{{ticket.ticket_field_<field ID number> | split:"::" | last }}
Tip: The same principle applies if you want to return only the first element of a nested field. Simply use the "first" filter instead of "last."
Example 2: Changing the default date formatting
Some ticket placeholders, such as {{ticket.created_at}}, return a date. These dates are by default in the dd/mm/yyyy format, which may not be appropriate for your region or users. This date format can be modified by using the "date" filter.
In this example, I will demonstrate changing dates to the mm/dd/yyyy format. To do this, we add the date filter to our placeholder and type out the date format we want.
{{ticket.created_at | date: "%d/%m/%Y"}}
This will show the day of the month, month of the year, and year with century in that order. You can control how you would like dates to display using the full date filter syntax .
Now you can modify your placeholder output to fit your needs. Use Liquid markup filters to bring Zendesk Support's customization options to the next level! Full documentation for Liquid is available at Liquid for Designers .
20 Comments
Hello! How would I capitalize each word in a string with a liquid filter in zendesk?
Example: bob jones --> Bob Jones
Example: martha's flower shop --> Martha's Flower Shop
Thanks!
Hi Crawford - you would use the same capitalize filter that we mentioned earlier in the comments:
https://github.com/shopify/liquid/wiki/liquid-for-designers#standard-filters
Hi Bob, thanks but this isn't working for me.
I have a custom field, so I'm formatting my placeholder in a macro like this:
{{ticket.ticket_field_<field ID> | capitalize}}
This custom field is a Text field, and what this filter does is capitalize only the first word in the text string. If the text in that field is all caps, it will lower-case the string, and capitalize the first word only. Help!
Ah I guess you're right! Looks like that documentation is inaccurate. This resource says it only capitalizes the first word: https://help.shopify.com/themes/liquid/filters/string-filters#capitalize
This is a bit more complicated, but you can do something using a for loop. There is a post on this page that describes it and you don't need a plugin:
http://stackoverflow.com/questions/21315732/capitalize-first-letter-of-each-word-with-liquid-syntax
I was able to get this to work on my account, but you'll want to play around with it a bit to make sure the formatting is how you want.
I'd like to control the output text when using a URL placeholder.
I know that you can control normal link content by formatting it like this:
[Text you see](URL link)
This doesn't work with the placeholder. Is there a way to accomplish this?
Hi Sarah! That's a good question and to properly answer this, I'll need to see the payload that you're using in the placeholder. I'm going to open up a ticket for you and you'll get a notification of that in a bit. We can work through this from there!
I would like to use {{ticket.requester.last_name}} in the salutation of an Macro. For example:
Dear Sir / Madam {{ticket.requester.last_name}},
But if someone sends us a e-mail, and they have not setup their first and last name, then this tag places everything before the @ symbol of the e-mailadres. For example:
What I would want to do:
This wil result in :
or
How can this be done?
Hey Thijm,
Unfortunately we don't have anything that can work like that. For us in Support, sometimes the Macro really doesn't line up with the information we have, so we'll need to change it manually. I've send your feedback on to Product though so they're aware of this need.
Thanks!
It looks like many sites that use Liquid will implement a json filter, to convert an element into JSON. As Liquid is available in trigger payloads, this would be really helpful. Any idea if something like this exists, or is planned?
I am using a placeholder to capture an email address but need to remove the hyperlink when its sent to the external email target. I have tried using strip_html but this doesn't work, do you have any suggestions?
Hi Ed!
I see that Daniel pulling you into a ticket for this. He'll get you taken care of!
Hello Charles,
Liquid is a custom tool that administrators can use to adjust the communications that Zendesk sends to end-users. From the research that I have done on other sites, this filter was a custom install on their end to have this behavior exhibited.
From what I found, this is not a feature that we will be adding to our system in the near future. However, I would definitely suggest posting this in our product feedback forum. Our Dev team regularly goes through looking for new posts for feature requests to see what we can accomodate and add to the system.
Sincerely,
Patrick | Tier 1 Customer Advocate
I'm trying to build a macro that says if our custom dropdown field "Town/Release Required" is "Little Elm" or "Denton County", place the corresponding dynamic content into the macro.
For instance, if the Town/Release Required field is selected to "Little Elm", I would like our dynamic content named {{dc.little_elm}} to present when I apply the macro to the reply. However, if the Town/Release Required field is selected to "Denton County" I would like our dynamic content named {{dc.denton_county}} to present in the macro.
Hey Brianna,
Thanks for reaching out to us! You should be able to use liquid markup in your macro to determine which dynamic content element is added on your ticket. This article should help you understand the logic and syntax behind how that'd work: Using Liquid markup to support multiple languages in automations, macros, and triggers
I see you already have a ticket open with us on this topic so if you need any additional help setting that up for your individual use case please let us know there :)
Hi, Stephen! I've tried the link & I really truly have tried my best to figure it out on my own, but I would LOVE help on my individual case. How do I go about doing/getting that?
Thanks!
Brianna
Hi Brianna!
Since you already have a ticket open, our support team will be able to help with your individual situation there. :)
Hello!
I am trying to modify a notification trigger. I want the requester to receive an email when a new public comment is added. The format should be:
Most recent comment formatted using rich text object
followed by
All public comments as formatted objects EXCLUDING the most recent comment.
This is what I use now, but it displays the most recent comment twice. Once in rich text and once as formatted object. Is there something I can do to the formatted object to exclude the most recent comment?
{% for comment in ticket.comments limit:1 offset:0 %}
{{comment.value_rich}}
{% for attachment in comment.attachments %}
Attachments:
{{attachment.filename}}
{{attachment.url}}
{% endfor %}
{% endfor %}
-----------------------------------------------------------------------------------------
{{ticket.public_comments_formatted}}
Thanks!
Hi Thijm,
Not sure if you managed to come right in the end with your greeting message for your ticket requester but we use a string that I created which does something very similar to what you want and I've adapted it to what you're looking for.
-------------
Dear Sir/Madam {% if ticket.requester.last_name }} {{ticket.requester.last_name|capitalize}} {% else %} {% endif%},
-------------
This can either be used in a trigger when sending a welcome/update email and you can use it in the first line of your macro. It's entirely up to you
I hope I've understood your request correctly and that this actually accomplishes what you wanted, albeit a year on.
Give it a go and let us know how it went
Thanks for sharing your solution, Hamilton!
Let us see if it works first 😉
Please sign in to leave a comment.