> ## Documentation Index
> Fetch the complete documentation index at: https://docs.libredesk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Email Templates

> Customize outgoing emails with dynamic template expressions

Outgoing emails can include expressions like `{{ .Recipient.FullName }}`, which pull fields from the conversation, contact, recipient, and author. Libredesk replaces them with real values when it sends the email.

## Outgoing email templates

Edit the template under **Admin → Templates → Outgoing Email Templates**. It applies to every outgoing email, including replies to conversations, notifications, and other system-generated mail.

### Available variables

#### Conversation variables

| Variable                              | Value                                           |
| ------------------------------------- | ----------------------------------------------- |
| `{{ .Conversation.ReferenceNumber }}` | The unique reference number of the conversation |
| `{{ .Conversation.Subject }}`         | The subject of the conversation                 |
| `{{ .Conversation.Priority }}`        | The priority level of the conversation          |
| `{{ .Conversation.UUID }}`            | The unique identifier of the conversation       |

#### Contact variables

| Variable                   | Value                                 |
| -------------------------- | ------------------------------------- |
| `{{ .Contact.FirstName }}` | First name of the contact/customer    |
| `{{ .Contact.LastName }}`  | Last name of the contact/customer     |
| `{{ .Contact.FullName }}`  | Full name of the contact/customer     |
| `{{ .Contact.Email }}`     | Email address of the contact/customer |

#### Recipient variables

| Variable                     | Value                          |
| ---------------------------- | ------------------------------ |
| `{{ .Recipient.FirstName }}` | First name of the recipient    |
| `{{ .Recipient.LastName }}`  | Last name of the recipient     |
| `{{ .Recipient.FullName }}`  | Full name of the recipient     |
| `{{ .Recipient.Email }}`     | Email address of the recipient |

The recipient is whoever receives the email. In replies to conversations, `Recipient` and `Contact` are the same person. They differ only in [email notification templates](#email-notification-templates), where the recipient is an agent.

#### Author variables

| Variable                  | Value                               |
| ------------------------- | ----------------------------------- |
| `{{ .Author.FirstName }}` | First name of the message author    |
| `{{ .Author.LastName }}`  | Last name of the message author     |
| `{{ .Author.FullName }}`  | Full name of the message author     |
| `{{ .Author.Email }}`     | Email address of the message author |

The author is the sender of the message. When Libredesk itself sends the email (automations, conversation continuity), the sender is the built-in System user, so these fields stay empty - otherwise emails would render "System" as the author's name.

#### Message variables

| Variable                   | Value                                                                                                                                                                              |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `{{ .IsAIComposed }}`      | `true` when the reply was written by an [AI assistant](/configuration/ai#assistants) rather than a person                                                                          |
| `{{ .IsContinuityEmail }}` | `true` when the email is a [conversation continuity](/configuration/livechat#conversation-continuity) email, i.e. unread live chat messages emailed to a contact who left the chat |

Use them to disclose AI replies, or to skip parts of the template that don't fit an automated email:

```html theme={null}
{{ if .IsContinuityEmail }}
  <p>You have new messages:</p>
{{ else }}
  <p>Dear {{ .Recipient.FirstName }},</p>
{{ end }}

{{ if .IsAIComposed }}
  <p>This reply was composed by an AI assistant.</p>
{{ end }}
```

### Template functions

These work in any template, alongside the variables above.

| Function                  | Value                                                                                                                             |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `{{ RootURL }}`           | Root URL of the Libredesk instance, set under **Admin → General**                                                                 |
| `{{ SiteName }}`          | Site name, set under **Admin → General**                                                                                          |
| `{{ LogoURL }}`           | URL of the uploaded logo                                                                                                          |
| `{{ FaviconURL }}`        | URL of the uploaded favicon                                                                                                       |
| `{{ Date "2006-01-02" }}` | Current date and time, formatted with a [Go layout](https://pkg.go.dev/time#pkg-constants). `{{ Date "" }}` uses the ANSIC layout |

### Using variables in replies and private notes

The same expressions work when an agent types them in the reply editor or a private note, and in macros. Libredesk replaces them when the message is saved, so the agent sees the final text right away.

## Example outgoing email template

<Note>
  Templates support HTML formatting. Use tags like `<p>` and `<br />` to control spacing and line breaks. Plain text without HTML tags renders without line breaks.
</Note>

```html theme={null}
<p>Dear {{ .Recipient.FirstName }},</p>

{{ template "content" . }}

<p>Best regards,<br />
{{ .Author.FullName }}</p>
---
<p>Reference: {{ .Conversation.ReferenceNumber }}</p>
{{ if .IsAIComposed }}
  <p>This reply was composed by an AI assistant.</p>
{{ end }}
```

### How the template wraps a message

The template wraps every message an agent sends. Whatever the agent types in the editor goes where `{{ template "content" . }}` sits.

So if the template already opens with "Dear `{{ .Recipient.FirstName }}`" and closes with "Best regards, `{{ .Author.FullName }}`", agents should write neither a greeting nor a sign-off. They write only the body.

#### Correct usage

**Message written in text editor:**

```
Thank you for contacting us. I've reviewed your account and can confirm that your refund has been processed.
```

**Email received by customer:**

```
Dear John,

Thank you for contacting us. I've reviewed your account and can confirm that your refund has been processed.

Best regards,
Sarah Smith
---
Reference: TKT-2024-001
```

#### Duplicated greeting and sign-off

**Message written in text editor:**

```
Hello John,

Thank you for contacting us. I've reviewed your account and can confirm that your refund has been processed.

Best regards,
Sarah
```

**Email received by customer (with unwanted duplication):**

```
Dear John,

Hello John,

Thank you for contacting us. I've reviewed your account and can confirm that your refund has been processed.

Best regards,
Sarah

Best regards,
Sarah Smith
---
Reference: TKT-2024-001
```

### Other template shapes

A template with no greeting means agents write their own. A template that is only the content placeholder means agents write the whole email, greeting and sign-off included. Read the active template before deciding what to write.

## Email notification templates

Edit these under **Admin → Templates → Email notification templates**. The default outgoing email template wraps each one, and the subject line takes the same expressions as the body.

The first three go to agents, so `{{ .Recipient.* }}` is the agent being notified and author fields are empty. The CSAT request goes to the contact, as a normal reply in the conversation.

Each template has its own variables:

| Template                         | Variables                                                                                                                                                                                                                                                                |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Conversation assigned            | Conversation, Contact, Recipient                                                                                                                                                                                                                                         |
| Mentioned in conversation        | Conversation, Recipient, `{{ .MentionedBy.FirstName }}`, `{{ .MentionedBy.LastName }}`, `{{ .MentionedBy.FullName }}`, `{{ .MentionedBy.Email }}`, `{{ .Message.Content }}` (the private note), `{{ .Message.UUID }}`                                                    |
| SLA breach warning, SLA breached | Conversation (`{{ .Conversation.Priority }}` is empty here), Recipient, `{{ .SLA.Metric }}` (First response, Resolution, or Next response), `{{ .SLA.DueIn }}` (time left, for the warning email), `{{ .SLA.OverdueBy }}` (time past the deadline, for the breach email) |
| CSAT request                     | Everything an outgoing email gets (Conversation, Contact, Recipient, Author, `{{ .IsAIComposed }}`), plus `{{ .CSATLink }}` (rating page URL, append `?rating=1` to `?rating=5` for one-click rating) and `{{ .CSATUUID }}`                                              |

<Note>
  In the CSAT request, `{{ .Author.* }}` holds the person who resolved the conversation, and is empty when an automation resolved it.
</Note>
