Getting Started with DeskDirector
Admin Console
Admin Console : Getting Started
Portal
Settings
Profile
Features
Enable/Disable Chat Callback Feature
Enabled/Disable Pre-Ticket Chat
Enable or Disable the 'Something Else' Option
Embedding Media as the Help Page
Tickets
Permissions
Portal Permissions in DeskDirector
FastTrack in DeskDirector
Setting Up and Using the VIP Priority
How to setup the Flag feature (ConnectWise)
Have Approvals go to Approvers according to site (ConnectWise)
Quotes (ConnectWise)
Invoices (ConnectWise)
Request Types
Forms
Getting started with DeskDirector Forms
DeskDirector Forms - Question Types in Detail
DeskDirector Forms - Dynamic Fields
DeskDirector Forms - Sections and Conditionals
DeskDirector Forms - Embed content
DeskDirector Forms - Title Automation
Importing Wufoo Forms to DD Forms
Companies
Contacts
Managing Contacts in DeskDirector
Exporting Contacts as CSV
Ticket Group Permissions
Contact Impersonation
Menus
Menu Items
Intro to Menu Items
Creating Menu Items
Extension Menu Security and Query Paramaters
Adding BiggerBrains Menu Item
Learning Center
Getting Started with the Learning Center
How to change the name of the Learning Center
Useful Learning Center Tips - Adding files from Google and Dropbox
Notebooks
Portal Access
Notifications
Desktop Installer
Feature Preview
Tech
System
Feature Configuration
Default Ticket Board and Source
Setting up your Approval Statuses
Adding a VIP Priority via the Admin Console
Automatic Contact Creation
Setting Reopened Ticket Status
Setting Status when Ticket is Closed
Change Ticket Status when Customer Adds Note
Hosts Configuration
PSA Integration (ConnectWise/Autotask)
Setting Office Hours
Enabling OAuth (Microsoft Login) for DeskDirector Portal
Logging in with Passwordless
Global Magic Token: Logging in via URL
Email Notifications Overview
Setting up Office 365 Mail Delivery
Setting up SMTP Server Mail Delivery
Getting Started with Email Template Engine - DeskDirector
Creating Custom Email Template
Setting Email Templates for Notification Events
Email Templates Auto Login Link
HTML Email Templates - ConnectWise
HTML Email Templates - Autotask
Integrations
BiggerBrains
ConnectBooster
ConnectWise Sell (previously Quosal)
How to configure ConnectWise Sell (previously Quosal) Order Porter integration
Adding ConnectWise Sell (previously Quosal) Order Porter link to opportunity
QuoteWerks
Wise-Pay
Microsoft Flow
How to setup the DeskDirector Flow Connector
How to share the DeskDirector Flow Connector
DeskDirector Flow Connector Reference
DeskDirector Flow Connector Ticket Event Payload Reference
Flow integration example - Microsoft Teams notifications
Flow integration example - DD Forms
Flow integration example - workflow with user interactions
Advanced
Deleting Orphaned Tickets
Developer Corner
Managing Webhooks
ConnectWise API Integration Tester
Autotask Data Sync
Diagnose Entities Tool
Analytics
Account
Tech Portal
Tech Portal : Getting Started
Tickets
Managing Tickets from the Tech Portal
Tech Portal Ticket Details
Creating a Ticket from the Tech Portal
Request more information (forms request) with Task Forms
Broadcasts
Chat
Getting Started with DeskDirector Chat
Handling Chat Requests
Viewing Chat History from the Tech Portal
Creating a Chat Session from the Tech Portal
Changing your Presence
"Pre-Ticket Chat" Feature
"Call me Back" Feature
Macros
Notifications
Client Portal
Client Portal : Getting Started
Contact Support
Creating a Ticket from the Client Portal
Submitting a Generic Ticket
Creating a Chat Session from the Client Portal
Viewing Chat History from the Client Portal
Tickets
Approvals
Quotes & Invoices
Learning Center
Notifications
Logging in to DeskDirector Workflow
Features
Tickets & Chats
Notifications & Broadcasts
Custom Forms & Request Types
Custom Branding
Custom Menus
Custom Email Templates
Approvals in DeskDirector
Easy Integrations
Advanced Authentication. No password, Single Sign On, MFA and beyond?
Analytics
Other DeskDirector Features
How Tos & FAQs
APIs and Integration
Creating an Integrator Login in ConnectWise (SOAP API)
Creating a ConnectWise RESTful API Key
ConnectWise 2019.5+
Creating an integrator API resource in Autotask
Autotask 2020.3 integration (API) resource migration
Authentication
How User Authentication works in DeskDirector
Setting/Resetting a Contact's Password
Logging in with Active Directory
Diagnosing Automatic Login Issues
Desktop Portal
Installing the DeskDirector Desktop Portal
Diagnosing DeskDirector Desktop Portal Issues
Diagnosing login problems using the new DDGetSID CLI tool
Antivirus Blocking DeskDirector Portal Installation
Troubleshooting your DeskDirector Portal installation
DD Portal for Mac: Labtech Deployment Guide
DDPortal removal tool - uninstalling Windows portals
Instance & Account Queries
Setting up your custom domain
3000 Contact Limit FAQs
Finding out what server your DeskDirector instance is on.
Administration Guide
How search works in DeskDirector products
Adding and removing features from your DD Portal Advantage plan
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 we set a landing page for the client portal?
Tickets
User can't see "All Tickets" option
Tickets are missing in DeskDirector but they are on my PSA
My customer is seeing deleted tickets in portal
Ticket Description missing on ConnectWise emails
Other Articles
Top 10 Request Types
Generic vs Customized Request Types
Using Markdown
Desktop Portal (Installed client) Vs. Web Portal (Web Client)
Outdated Articles
Advanced Use
DeskDirector API
Subscribing to Chat Webhooks
Portal Deep Linking
Webhook Example with Zapier
Chat Session Payload
Legacy URL Linking in DeskDirector
Get started with portal extension page demo
Dynamic content based on logged in user
Clean Tickets
Release Notes
Client Portal
Server
Tech Portal
Portal Release Notes - Windows/macOS
Differences Between Desktop Portal v2 and v3/v4
Portal Release Notes - Web Client
Glossary
- 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 |
.
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