Getting Started with DeskDirector
Service Catalogue
Forms
Getting started with DeskDirector Forms
DeskDirector Forms - Question Types in Detail
DeskDirector Forms - Dynamic Fields
DeskDirector Forms - Dynamic content
DeskDirector Forms - Field value format for automation
Service Catalogue
Service Types
Service Groups
Enable or Disable the 'Something Else' Option
Deskdirector - Sign up walk through
Managing your DeskDirector Subscription
Logging in to DeskDirector
Automatic Contact Creation
What is the DeskDirector Admin Portal?
What is the DeskDirector Tech Portal?
What is the DeskDirector Client Portal?
DeskDirector Roles and Permissions
Feature Configuration
Tickets & Chats
A walk through all the fields available in DeskDirector forms
Getting Started with Custom Branding
Getting Started with Custom Menus
Getting Started with Custom Email Templates
Getting Started with Surveys
Notifications & Broadcasts
Getting Started with the Menu System
BiggerBrains & Learning Center
The Developer Corner
Embedding Help Page Media
Permissions in DeskDirector
Managing Contacts
Tickets Access
Profile Pictures
Office Hours
Managing Members/Resources Profile
Enabling Master Admin
Managing Company Accounts
Monitoring Portal Usage
Service Radar
DeskDirector Desktop Portal
Main Tabs vs Ticket Tabs
Auditing and Analytics
Tech Portal Board/Queue Access Configuration
Features
Generative AI
DeskDirector with Generative AI
Setting up AI Service Providers
AI Assistants in DeskDirector
Custom Tools for AI Assistants
Knowledge Bases for AI Assistants
Ticket Summary for Tech Portal
Login & Authentication
User Groups
Approvals
Task Lists
Real-Time Chats
Macros
Menus
Menu Items
Notifications
Email Notifications
Email Template Engine
Surveys
Broadcasts
Custom Branding
Easy Integrations
Analytics
Other DeskDirector Features
Ticket Dynamic Contents
The Learning Center
Webhooks
Workflows
Group Tags
File Storage
Integrations
ConnectBooster
Wise-Pay
QuoteWerks
ConnectWise Sell (previously Quosal)
How to configure ConnectWise Sell (previously Quosal) Order Porter integration
Adding ConnectWise Sell (previously Quosal) Order Porter Link to Opportunity
Microsoft Flow (Power Automate)
Get started with the DeskDirector Power Automate Connector
Power Automate Administration
Power Automate Template Gallery
Featured Solution: Teams Ticket Discussion
Featured Solution: Ticket Briefing
DeskDirector Connector Triggers
Action: Create an email from template
Power Automate Connector - Setting up your first flow
Getting Support for the DeskDirector Connector for Power Automate
AutoTask
StreamlineIT for DeskDirector Tech Portal
ConnectWise
ConnectWise Quotes & Invoices
TimeZest integration with DeskDirector
ConnectWise - Avoid Aggressive Notifications
BiggerBrains
Logging the ConnectWise API
OneNote Notebooks
Microsoft Teams App
Introducing the DeskDirector for Microsoft Team App
Setting up Content Security Policy (CSP)
Installing the Microsoft Teams App (Tech)
Setting up Tags for Teams Discussions (Tech)
Setting up DeskDirector for Microsoft Teams for your clients (Client mode)
Branding the DeskDirector Teams App
DeskDirector Teams App Notifications
User Groups Integration with Microsoft Teams
Troubleshooting
Advanced topic: Setting up Tech & Client Mode in the same tenancy
Integrating Microsoft Teams with DeskDirector Tech Portal
Smart Alerts for Tech Users
Release Notes - DeskDirector Teams App
Contact Support
Troubleshooting
APIs and Integration
ConnectWise 2019.5+
Autotask integration major update 2022
ConnectWise Member Impersonation
Autotask Resource Impersonation
Autotask 2020.3 integration (API) resource migration
Third-party integration with DeskDirector
Authentication
Desktop Portal
Diagnosing DeskDirector Desktop Portal Issues
DD Portal for Mac: Labtech Deployment Guide
DDPortal removal tool - uninstalling Windows portals
Deploying DD Desktop Portal v5 via PowerShell
Desktop Portal v5 Installation & Common Issues
Instance & Account Queries
Setting up your custom domain
Contact Limits FAQs
Finding out what server your DeskDirector instance is on.
How search works in DeskDirector products
Portal and User Issues
User can't log in
DeskDirector Portal Browser Support
Contact can't login portal, the contact is missing in admin console but it is in ConnectWise
DeskDirector Tech Portal - How to take advantage of browser tabs
Add DeskDirector Tech Portal as a Custom Menu item inside ConnectWise Manage
Sign in with Microsoft Issue in Tech or Admin Console - "Need Admin Approval"
How do I add Tech Members/Contacts/Companies to my DeskDirector instance?
Time Stamps in DeskDirector Portal
Missing contacts or companies in DeskDirector but they are in my PSA
User Group FAQs
Chat permission granted but "Chat" option is missing on "Contact Support" page
How do we set a landing page for the client portal?
Other Articles
Login & Authentication - Common Issues
DeskDirector Desktop App - Installation Issues
Tickets & Chats - Common Issues
Contact & Service Agent Impersonation
ConnectWise Integration - Common Issues
Diagnose Entities Tool
PSA Integration - Common Issues
Approvals - Common Issues
Troubleshooting via Web Developer Tools
Switching PSA or merging with another CW/AT instance
How to Allow Time Entries for StreamlineIT Members
Email & Email Delivery - Common Issues
Essential and Dynamic Plan Breakdown
Advanced Use
DeskDirector API
Subscribing to Chat Webhooks
Portal Deep Linking
Webhook Example with Zapier
Chat Session Payload
Get started with portal extension page demo
Dynamic content based on logged in user
Clean Tickets
Exporting Portal Usage
Security
Glossary
Release Notes
Client Portal
Server
Tech Portal
Portal Release Notes - Windows/macOS
Differences Between different Desktop Portal version
Portal Release Notes - Web Client
Release Notes in the Admin Portal
Archived
- All Categories
- Glossary
- T
- Template language for DeskDirector Email Template
Template language for DeskDirector Email Template
Updated
by Andy Chen
Markup language - MJML
Mjml is a markup language designed to reduce the pain of coding a responsive email. You can find their documentation here.
DeskDirector email template utilize both MJML markup language and Liquid template engine to allow user to easily code dynamic email content.
Base structure
It all start with base mjml tag and mj-body tag, it is equivalent of html tag and body tag. Then mj-body can have multiple sections. Each section represent as row. Where row can have single or multiple mj-column.
<mjml>
<mj-body>
<mj-section background-color="#f0f0f0"></mj-section>
<mj-section background-color="#f0f0f0"></mj-section>
</mj-body>
</mjml>
Template engine - Liquid
Liquid is an template language, with this template language, we can insert token(object) into the template. Such as user's name, ticket's content etc.
Tags
Tags create the logic and control flow for templates. They are denoted by curly braces and percent signs: {% and %}.
Control Flow
Input
{% if Company.Id == 123 %}
<mj-text>Welcome to our new portal!</mj-text>
{% endif %}Output
Welcome to our new portal!
With {% else %}:
{% if Company.Id == 123 %}
<mj-text>Welcome to our new portal!</mj-text>
{% else %}
<mj-text>Welcome back!</mj-text>
{% endif %}Iteration
{% for Item in Ticket.Timeline %}
<mj-text>{{ Item.User.Name }}</mj-text>
{% endfor %}Coding Tips
For the control tags we recommend wrapping them with the <mj-raw></mj-raw> tags to make sure the tags are not removed by the MJML engine.
For example:
<mj-raw>{% for Item in Ticket.Timeline %}</mj-raw>
<mj-text>{{ Item.Note }}</mj-text>
<mj-raw>{% endfor %}</mj-raw>Filters
Filters change the output of a Liquid object. They are used within an output and are separated by a |. Filter names specified in the DeskDirector email template editor must be capitalized or they will not be recognized.
Capitalize
Input
{{ "my great title" | Capitalize }}Output
My Great Title
Upcase & Downcase
Input
{{ "My Great Title" | Upcase }},
{{ "My Great Title" | Downcase }}Output
MY GREAT TITLE, my great title
TimeAgo
Input
{{ Ticket.LastUpdated | TimeAgo }}
<br/>
{{ "2018-08-21T22:22:07Z" | TimeAgo }}Output
2 days ago
15 days ago
LocalTime
The LocalTime filter converts UTC time in the data to your local time. (The timezone is set it in admin console under System -> Office Hours)
Input
<mj-text>{{ Ticket.DateEntered | LocalTime }}</mj-text>Output
Thu, Jul 14, 2011 01:00PM
The filter supports optional parameters to change the format and/or the culture of time string.
Input
<mj-text>{{ Ticket.DateEntered | LocalTime: "f", "mi-NZ" }}</mj-text>Output
Rāpare, 14 Hōngongoi, 2011 1:00 p.m.
TimeZone
Timestamps in the data are in UTC time, but you can use this filter to convert it to your local time.
The first parameter for TimeZone is time zone ID (C# timezone ID), the second parameter is the output format of the date time (C# DateTime format string).
Input
<mj-text>{{ Ticket.DateEntered | TimeZone: "New Zealand Standard Time", "f" }}</mj-text>Output
Tuesday, September 4, 2018 9:46 AM
ImgSize
This filter resizes your portal logo image.
The parameters are the width and the height of the image.
Input
{{Branding.Logo.Url | ImgSize: 100, 100}}Output
https://dd-files-main.imgix.net/dev/2020/3/o_BJqA5y00icGmRvqxnJdQ/dibujo_19.png?fit=fill&w=100&h=100
DeepLink
This filter changes the portal link to a specific view of the portal. See Portal Deep Linking
The following example shows the supported deep linking.
Input
<mj-text><strong>Original:</strong><br />{{Links.Portal}}</mj-text>
<mj-text><strong>Ticket:</strong><br />{{Links.Portal | DeepLink: 'ticket'}}</mj-text>
<mj-text><strong>Ticket Action:</strong><br />{{Links.Portal | DeepLink: 'ticket', 'approve'}}</mj-text>
<mj-text><strong>ticket_list:</strong><br />{{Links.Portal | DeepLink: 'ticket_list'}}</mj-text>
<mj-text><strong>ticket_list approval:</strong><br />{{Links.Portal | DeepLink: 'ticket_list', 'approval'}}</mj-text>
<mj-text><strong>support_options:</strong><br />{{Links.Portal | DeepLink: 'support_options'}}</mj-text>
<mj-text><strong>pre_ticket_chat:</strong><br />{{Links.Portal | DeepLink: 'pre_ticket_chat'}}</mj-text>
<mj-text><strong>request_types:</strong><br />{{Links.Portal | DeepLink: 'request_types'}}</mj-text>
<mj-text><strong>request_type:</strong><br />{{Links.Portal | DeepLink: 'request_type', 1}}</mj-text>
<mj-text><strong>notifications:</strong><br />{{Links.Portal | DeepLink: 'notifications'}}</mj-text>
<mj-text><strong>content_page:</strong><br />{{Links.Portal | DeepLink: 'content_page', 'some-id'}}</mj-text>
<mj-text><strong>invoices:</strong><br />{{Links.Portal | DeepLink: 'invoices'}}</mj-text>
<mj-text><strong>quotes:</strong><br />{{Links.Portal | DeepLink: 'quotes'}}</mj-text>Output
Original:
https://dev.deskdirector.com/portal/deeplink?name=ticket&ticket_id=123
Ticket:
https://dev.deskdirector.com/portal/deeplink?name=ticket&ticket_id=123
Ticket Action:
https://dev.deskdirector.com/portal/deeplink?name=ticket&ticket_id=123&action=approve
ticket_list:
https://dev.deskdirector.com/portal/deeplink?name=ticket_list
ticket_list approval:
https://dev.deskdirector.com/portal/deeplink?name=ticket_list&state=approval
support_options:
https://dev.deskdirector.com/portal/deeplink?name=support_options
pre_ticket_chat:
https://dev.deskdirector.com/portal/deeplink?name=pre_ticket_chat
request_types:
https://dev.deskdirector.com/portal/deeplink?name=request_types
request_type:
https://dev.deskdirector.com/portal/deeplink?name=request_type&type_id=1
notifications:
https://dev.deskdirector.com/portal/deeplink?name=notifications
content_page:
https://dev.deskdirector.com/portal/deeplink?name=content_page&page_id=some-id
invoices:
https://dev.deskdirector.com/portal/deeplink?name=invoices
quotes:
https://dev.deskdirector.com/portal/deeplink?name=quotes
first, last & size
Notice that these filters start from a lower case letter.
Input
<mj-text>{{ Ticket.Timeline.size }}</mj-text>
<mj-text>{{ Ticket.Timeline.first.Timestamp }}</mj-text>
<mj-text>{{ Ticket.Timeline.last.Timestamp }}</mj-text>Output
1
9/3/2018 9:46:30 PM
9/3/2018 9:46:30 PM
MarkdownToHtml
This filter converts the input text content in markdown format to HTML format that can be rendered properly in email clients.
Input
{{"## some header" | MarkdownToHtml }}Output
<h2>some header</h2>