HubL filter list and examples for HubSpot CMS developers.
Last modified: August 22, 2025
Filters affect the ultimate output of your HubL. They can be applied to various HubL statements and expressions to alter the template markup outputted by the server.The basic syntax of a filter is |filtername. The filter is added directly following the statement or the expression, within its delimiters. Some filters have additional parameters that can be added in parentheses. The basic syntax of a filter with a string, a number, and a boolean parameters is: |filtername("stringParameter", 10, true). Notice that string parameters should be written in quotes. Also note that HubL filters have an alias that can be used to serve the same purpose as the primary filter.The following article contains all of the supported HubL filters.
Please note:You can apply HubL filters to personalization tokens, such as contact and company tokens, on HubSpot CMS and blog pages, but not in emails.
Adds a numeric value to another numeric value. This filter functions the same as the + operator. The parameter in parentheses is the addend that you are combining with your initial numeric value.
Renders the attribute of a dictionary. This filter is the equivalent of printing a variable that exists within a dictionary, such as content.absolute_url.
Groups items within a sequence.In the example below, there is a variable containing a sequence of types of fruits. The batch filter is applied to a loop that iterates through the sequence. The nested loop runs three times to print 3 types of fruit per row, before the outer loop runs again. Notice in the final output that since there are only 5 types of fruit, the final item is replaced by a (the second parameter).
Report incorrect code
Copy
Ask AI
{% set rows = ["apples", "oranges", "pears", "grapes", "blueberries"] %}<table>{% for row in rows|batch(3, " ") %}<tr>{% for column in row %}<td>{{ column }}</td>{% endfor %}</tr>{% endfor %}</table>
Parameter
Type
Description
linecount
Number
The number of items to include in the batch.
fill_with
String
Specifies what to include in order to fill up any missing items.
Calculates the time between two datetime objects in a specified time unit.
Please note:You should use this filter only with variables that return a date. Starting September 30, 2024, this filter will no longer return the current date when a null value is passed. After that date, a null value in the filter will return September 30, 2024.
Report incorrect code
Copy
Ask AI
{% set begin = "2018-07-14T14:31:30+0530"|strtotime("yyyy-MM-dd'T'HH:mm:ssZ") %}{% set end = "2018-07-20T14:31:30+0530"|strtotime("yyyy-MM-dd'T'HH:mm:ssZ") %}{{ begin|between_times(end, "days") }}
Parameter
Type
Description
end
datetime object
The ending datetime object.
timeunit
String
Valid time units are nanos , micros , millis , seconds , minutes , hours , half_days , days , weeks , months , years , decades , centuries , millennia , and eras .
Capitalizes the first letter of a variable value. The first character will be uppercase, all others letters will be lowercased. Subsequent words separated by spaces or hyphens will not have their first letter uppercased.
Report incorrect code
Copy
Ask AI
{% set sentence = "the first letter of a sentence should always be capitalized." %}{{ sentence|capitalize }}
Centers text within a given field length using whitespace. This filter is not recommended or particularly useful since HubSpot’s HTML compiler will automatically strip out the white space; however, it is included here for the sake of comprehensiveness.The example below shows this filter being applied to a variable in a pre tag, so the whitespace isn’t stripped out.
Report incorrect code
Copy
Ask AI
<pre>{% set var = "string to center" %}before{{ var|center(80) }}after</pre>
Parameter
Type
Description
width
Number
Specifies the length of whitespace to center the text in.
Converts a HEX value to an RGB string. This is useful if you need to convert color variables to RGB to be used with a RGBA CSS declaration. In the example below, the value set by a color module is converted to an RGB value and used in an RGBA CSS declaration.
Report incorrect code
Copy
Ask AI
{% set my_color = "#FFFFFF" %}{{ my_color|convert_rgb }}{% set my_color2="#000000" %}<div style="background: rgba({{ my_color2|convert_rgb }}, .5)"></div>
Removes a string from a value. This filter can be used to match and cut out a specific part of a string. The parameter specifies the part of the string that should be removed. The example below removes the space and the word world from the original variable value.
Report incorrect code
Copy
Ask AI
{% set my_string = "Hello world." %}{{ my_string|cut(" world") }}
If the value is undefined it will return the first parameter, otherwise the value of the variable will be printed. If you want to use default with variables that evaluate to false, you have to set the second parameter to true.The first example below would print the message if the variable is not defined. The second example applies the filter to an empty string, which is not undefined, but it prints a message due to the second parameter.
Report incorrect code
Copy
Ask AI
{{ my_variable|default("my_variable is not defined") }}{{ ""|default("the string was empty", true) }}
Parameter
Type
Description
default_value
String
The value to return if the variable is undefined. If the variable is defined, the value of the variable will be returned instead.
truthy
Boolean
Set to true to use with variables which evaluate to false.
Sort a dict and yield (key, value) pairs. Dictionaries are unsorted by default, but you can print a dictionary, sorted by key or value. The first parameter is a boolean to determine, whether or not the sorting is case sensitive. The second parameter determines whether to sort the dict by key or value. The example below prints a sorted contact dictionary, with all the known details about the contact.
Report incorrect code
Copy
Ask AI
{% for item in contact|dictsort(false, "value") %}{{item}}{% endfor %}
Returns the difference of two sets or lists. The list returned from the filter contains all unique elements that are in the first list but not the second.
Report incorrect code
Copy
Ask AI
{{ [1, 2, 3]|difference([2, 3, 4, 5]) }}
Parameter
Type
Description
list
Array
The second list to compare to for use in finding differences from the original list.
Escapes the content of an HTML input. Accepts a string and converts the characters &, <, >, ‘, ”, and escape_jinjava into HTML-safe sequences. Use this filter for HubL variables that are used in HTML but should not allow any HTML.
Report incorrect code
Copy
Ask AI
{% set escape_string = "<div>This markup is printed as text</div>" %}{{ escape_string|escape_html }}
Escapes the content of an HTML attribute input. Accepts a string and converts the characters &, <, ‘, ”, and escape_jinjava into HTML-safe sequences. Use this filter for HubL variables that are being added to HTML attributes.Note that when escaping values of attributes that accept URLs, such as href, you should use the escape_url filter instead.
Report incorrect code
Copy
Ask AI
{% set escape_string = "This <br> markup is printed as text" %}<img src="test.com/imageurl" alt="{{escape_string|escape_attr}}">
Converts the characters { and } in strings to Jinjava-safe sequences. Use this filter if you need to display text that might contain such characters in Jinjava.
Report incorrect code
Copy
Ask AI
{% set escape_string = "{{This markup is printed as text}}" %}{{ escape_string|escape_jinjava }}
Escapes strings, including escape_jinjava, so that they can be safely inserted into a JavaScript variable declaration. Use this filter for HubL variables that are used inside HTML script elements.
Report incorrect code
Copy
Ask AI
{% set escape_string = "\tThey said 'This string can safely be inserted into JavaScript.'" %}{{ escape_string|escape_js }}
Escapes the content of a URL input, enforcing specified protocols, stripping invalid and dangerous characters, and encoding HTML entities. Returns empty if a URL is valid. Use this filter for HubL variables that are used within HTML attributes that should be valid URLs.
Report incorrect code
Copy
Ask AI
{% set escape_string = "http://example.com/with space/<html>" %}<a href="https://developers.hubspot.com/docs{{ escape_string|escape_url }}"></a>
Formats a number value into a human-readable file size (i.e. 13 kB, 4.1 MB, 102 Bytes, etc). By default, decimal prefixes are used (e.g., MB and GB), but you can set the binary parameter to true to use binary prefixes such as Mebi (MiB) and Gibi (GiB).
Report incorrect code
Copy
Ask AI
{% set bytes = 10000 %}{{ bytes|filesizeformat(binary=true) }}
Parameter
Type
Description
binary
Boolean
If set to true, binary prefixes are used, such as Mebi (MiB) and Gibi (GiB).
Converts a value into a floating point number. If the conversion doesn’t work it will return 0.0. You can override this default using the first parameter.
Strictly enforces HTML escaping. In HubSpot’s environment there isn’t really a use case for double escaping, so this is generally behaves the same as the escape filter.
Report incorrect code
Copy
Ask AI
{% set escape_string = "<div>This markup is printed as text</div>" %}{{ escape_string|forceescape }}
Formats a given number as a currency based on portal’s default currency and locale passed in as a parameter. Replaces the deprecated format_currency filter.
Please note:You should use this filter only with variables that return a date. Starting September 30, 2024, this filter will no longer return the current date when a null value is passed. After that date, a null value in the filter will return September 30, 2024.
Formats both the date and time components of a date object. This filter replaces the deprecated datetimeformat filter. By default, returns a datetime in the UTC-00:00 time zone.
Please note:You should use this filter only with variables that return a date. Starting September 30, 2024, this filter will no longer return the current date when a null value is passed. After that date, a null value in the filter will return September 30, 2024.
The format to use. Can be one a custom pattern following Unicode LDML. When using long or full, timestamp will include a Z to denote zero offset UTC time (i.e., 2:23:00 PM Z). To remove the Z designator, specify a timeZone.
timeZone
String
The time zone of the output date in IANA TZDB format. By default, returns UTC time.
Please note:You should use this filter only with variables that return a date. Starting September 30, 2024, this filter will no longer return the current date when a null value is passed. After that date, a null value in the filter will return September 30, 2024.
The format to use. Can be one a custom pattern following Unicode LDML. When using long or full, timestamp will include a Z to denote zero offset UTC time (i.e., 2:23:00 PM Z). To remove the Z designator, specify a timeZone.
timeZone
String
The time zone of the output date in IANA TZDB format. By default, returns UTC time.
Calculates the ellipsoidal 2D distance between two points on Earth.
Report incorrect code
Copy
Ask AI
<!-- in the example belowthe HubDB Location =42.3667, -71.1060 (Cambridge, MA) |Chicago, IL = 37.3435, -122.0344 -->{{ row.location | geo_distance(37.3435, -122.0344, "mi") }} MI
Groups a sequence of objects by a common attribute. The parameter sets the common attribute to group by.
Report incorrect code
Copy
Ask AI
<ul>{% for group in contents|groupby("blog_post_author") %}<li>{{ group.grouper }}<ul>{% for content in group.list %}<li>{{ content.name }}</li>{% endfor %}</ul></li>{% endfor %}</ul>
Indents text within a given field length using whitespace. This filter is not recommended or particularly useful because HubSpot’s HTML compiler will automatically strip out the white space. However, it is included here for the sake of comprehensiveness. The example below shows an indent filter being applied to a variable in a <pre> tag, so the whitespace isn’t stripped out. The first parameter controls the amount of whitespace and the second boolean toggles whether to indent the first line.
Report incorrect code
Copy
Ask AI
<pre>{% set var = "string to indent" %}{{ var|indent(2, true) }}</pre>
Parameter
Type
Description
width
Number
The amount of whitespace to be applied.
indent-first
Boolean
When set to true, the first line will be indented.
Returns a string which is the concatenation of the strings in the sequence. The separator between elements is an empty string per default, you can define it with the optional parameter. The second parameter can be used to specify an attribute to join.
Report incorrect code
Copy
Ask AI
{% set my_list = [1, 2, 3] %}{% set sep = "---" %}{{ my_list|join }}{{ my_list|join("|") }}{{ my_list|join(sep) }}
Converts values into a list. Strings will be returned as separate characters unless contained in square bracket sequence delimiters [ ].
Report incorrect code
Copy
Ask AI
{% set one = 1 %}{% set two = 2 %}{% set three = "three" %}{% set four = ["four"] %}{% set list_num = one|list + two|list + three|list + four|list %}{{ list_num }}
Applies a filter on a sequence of objects or looks up an attribute. This is useful when dealing with a list of objects where you’re only interested in a certain value of it.The basic usage is mapping on an attribute. For example, if you want to use conditional logic to check if a value is present in a particular attribute of a dict. Alternatively, you can let it invoke a filter by passing the name of the filter and the arguments afterwards.
Report incorrect code
Copy
Ask AI
{# Usage 1 #}Apply a filter to a sequence:{% set seq = ["item1", "item2", "item3"] %}{{ seq|map("upper") }}{# Usage 2 #}Look up an attribute:{{ content|map("currentState")}}
Please note:When using this filter, the page will be prerendered periodically rather than every time the page content is updated. This means that the filtered content will not be updated on every page reload.This may not be an issue for certain types of content, such as displaying a random list of blog posts. However, if you need content to change randomly on every page load, you should instead use JavaScript to randomize the content client-side.
Report incorrect code
Copy
Ask AI
{% for content in contents|random %}<div class="post-item">Post item markup</div>{% endfor %}
Searches for a regex pattern and replaces with a sequence of characters. The first argument is a RE2-style regex pattern, the second is the replacement string.Learn more about RE2 regex syntax.
Sanitizes the content of an HTML input for the output of rich text content. Accepts a string, then strips HTML tags that are not allowed. Use this filter for HubL variables that are used in HTML that should allow safe HTML.You can include the following parameters to allow specific types of HTML tags: FORMATTING, BLOCKS, STYLES, LINKS, TABLES, IMAGES. For example, sanitize_html(IMAGES).Using sanitize_html will include all parameters in the filter.You can also include a STRIP parameter to strip all HTML. All content is run through escape_jinjava as well to prevent nested interpretation.
Report incorrect code
Copy
Ask AI
{% set escape_string = "This <br> <div>markup is <img src='test.com/image'> <span>printed</span> as text.</div>" %}{{ escape_string|sanitize_html("IMAGES") }}
Randomizes the order of iteration through a sequence. The example below shuffles a standard blog loop.
Please note:When using this filter, the page will be prerendered periodically rather than every time the page content is updated. This means that the filtered content will not be updated on every page reload.This may not be an issue for certain types of content, such as displaying a random list of blog posts. However, if you need content to change randomly on every page load, you should instead use JavaScript to randomize the content client-side.
Report incorrect code
Copy
Ask AI
{% for content in contents|shuffle %}<div class="post-item">Markup of each post</div>{% endfor %}
Slices an iterator and returns a list of lists containing those items. The first parameter specifies how many items will be sliced, and the second parameter specifies characters to fill in empty slices.
Report incorrect code
Copy
Ask AI
{% set items = ["laptops", "tablets", "smartphones", "smart watches", "TVs"] %}<div class="columwrapper">{% for column in items|slice(3," ") %}<ul class="column-{{ loop.index }}">{% for item in column %}<li>{{ item }}</li>{% endfor %}</ul>{% endfor %}</div>
Sorts an iterable. This filter requires all parameters to sort by an attribute in HubSpot. The first parameter is a boolean to reverse the sort order. The second parameter determines whether or not the sorting is case sensitive. And the final parameter specifies an attribute to sort by. In the example below, posts from a blog are rendered and alphabetized by name.
Report incorrect code
Copy
Ask AI
{% set my_posts = blog_recent_posts("default", limit=5) %}{% for item in my_posts|sort(False, False, "name") %}{{ item.name }}<br>{% endfor %}
Splits the input string into a list on the given separator. The first parameter specifies the separator to split the variable by. The second parameter determines how many times the variable should be split. Any remaining items would remained group. In the example below, a string of names is split at the ; for the first four names.
Report incorrect code
Copy
Ask AI
{% set string_to_split = "Mark; Irving; Helly; Dylan; Milchick; Harmony;" %}{% set names = string_to_split|split(";", 4) %}<ul>{% for name in names %}<li>{{ name }}</li>{% endfor %}</ul>
Parameter
Type
Description
character_to_split_by
String
Specifies the separator to split the variable by.
number_of_splits
Number
Determines how many times the variable should be split. Any remaining items would remain grouped.
Converts a different variable type to a string. In the example below, a integer is converted into a string (pprint is used to confirm the change in variable type).
Report incorrect code
Copy
Ask AI
{% set number_to_string = 45 %}{{ number_to_string|string|pprint }}
Adds numeric values in a sequence. The first parameter can specify an optional attribute and the second parameter sets a value to return if there is nothing in the variable to sum.
Report incorrect code
Copy
Ask AI
// Simple sum{% set sum_this = [1, 2, 3, 4, 5] %}{{ sum_this|sum }}// Sum of attribute{% set items = [15, 10] %}{% set dict_var = [{"name": "Item1", "price": "20"}, {"name": "Item2", "price": "10"}] %}Total: {{ dict_var|sum(attribute="price") }}
Parameter
Type
Description
attribute
String
Attribute to sum.
return_if_nothing
String
Value to return if there is nothing in the variable to sum.
Returns the symmetric difference of two sets or lists. The list returned from the filter contains all unique elements that are in the first list but not the second, or are in the second list but not the first.
Cuts off text after a certain number of characters. The default is 255. HTML characters are included in this count.
Please note:Because this filter relies on the spaces between words to shorten strings, it may not work as expected for languages without spaces between characters, such as Japanese.
Report incorrect code
Copy
Ask AI
{{ "I only want to show the first sentence. Not the second."|truncate(40) }}{{ "I only want to show the first sentence. Not the second."|truncate(35, true, "..........") }}
Parameter
Type
Description
number_of_characters
Number
Number of characters to allow before truncating the text. Default is 255.
breakword
Boolean
If true, the filter will cut the text at length. If false, it will discard the last word.
end
String
Override the default ’…’ trailing characters after the truncation.
Truncates a given string, respecting HTML markup (i.e. will properly close all nested tags). This will prevent a tag from remaining open after truncation. HTML characters do not count towards the character total.
Please note:Because this filter relies on the spaces between words to shorten strings, it may not work as expected for languages without spaces between characters, such as Japanese.
Report incorrect code
Copy
Ask AI
{% set html_text = "<p>I want to truncate this text without breaking my HTML<p>" %}{{ html_text|truncatehtml(28, "..." , false) }}
Parameter
Type
Description
number_of_characters
Number
Number of characters to allow before truncating the text. Default is 255.
end
String
Override the default ’…’ trailing characters after the truncation.
breakword
Boolean
Boolean value. If true, the filter will cut the text at length. If false (default), it will discard the last word. If using only one of the optional parameters, use keyword arguments, such as truncatehtml(70, breakwords = false).
Extracts a unique set from a sequence or dict of objects. When filtering a dict, such as a list of posts returned by a function, you can specify which attribute is used to deduplicate items in the dict.
Please note:You should use this filter only with variables that return a date. Starting September 30, 2024, this filter will no longer return the current date when a null value is passed. After that date, a null value in the filter will return September 30, 2024.
Converts URLs in plain text into clickable links. If you pass the filter an additional integer it will shorten the urls to that number. The second parameter is a boolean that dictates whether the link is rel=“no follow”. The final parameter lets you specify whether the link will open in a new tab.
Parameter
Type
Description
shorten_text
Number
Integer that will shorten the urls to desired number.
no_follow
Boolean
When set to true, the link will include rel="no follow".
target="_blank"
String
Specifies whether the link will open in a new tab.
Causes words to wrap at a given character count. This works best in a <pre> because HubSpot strips whitespace by default.
Report incorrect code
Copy
Ask AI
{% set wrap_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur, ipsum non sagittis euismod, ex risus rhoncus lectus, vel maximus leo enim sit amet dui. Ut laoreet ultricies quam at fermentum." %}{{ wrap_text|wordwrap(10) }}
Creates an HTML/XML attribute string, based on the items in a dict. All values that are neither none nor undefined are automatically escaped. It automatically prepends a space in front of the item if the filter returned something unless the first parameter is false.