Skip to main content

Notifications

The Notifications page lets you create and manage the email notification templates used by your workflows. Once defined, a notification can be assigned to any workflow action as an event — whenever that action is executed, the application automatically sends the email to the users of the selected role.

Navigation

Path: Define → Notifications

Notifications List

The list displays all notifications defined for the tenant's Graphical Workflow Engine product.

Click to view Notifications interface

Notifications List View

ColumnDescription
NameThe notification's display name, used when selecting it in the Designer
DescriptionA short description of the notification's purpose
ProductThe product this notification belongs to (e.g., Graphical Workflow Engine)
Created DateThe date and time the notification was created

Use the search fields in the Name and Description columns to filter the list.

Actions

Click the ··· (three-dot) menu on any row to access:

  • Edit — opens the notification for editing.
  • Duplicate — creates a copy of the notification as a starting point for a new one.
  • Delete — permanently removes the notification.

Creating a Notification

Click New Notification (top-right) to open a new notification form. Each notification has three tabs: Notification, Attachments, and Logs.

Notification Tab

The Notification tab is where you define the email content.

Click to view Notification Tab interface

Notifications Tab View

FieldDescription
NameThe notification name shown in the Designer event selector
DescriptionInternal description of the notification's purpose
ProductThe product context (read-only, defaults to Graphical Workflow Engine)
Subject messageThe email subject line — supports FreeMarker binding expressions
Body messageThe full HTML email body — supports FreeMarker binding expressions and HTML formatting

Click Test notification to send a test email using the current template, allowing you to verify that the bindings resolve correctly before assigning the notification to a workflow.

Writing Notification Templates with FreeMarker

Both the subject and body are processed as FreeMarker templates. The data model available in expressions corresponds to the fields of the workflow request — the same JSON structure visible in the Logs tab's Data model column.

Subject Example

Click to view Subject example
Visitor Checked Out – ${name_first!"N/A"} ${name_last!"N/A"} (${(badge_code.label)!"No badge"}) – #${(requestId?c)!"N/A"}

This produces a subject like: Visitor Checked Out – Carlos Mendoza (AC-00013) – #2409

The !"N/A" pattern is a null-safety default — if the field is missing or null, the fallback value is shown instead of causing a template error.

Body Example

Click to view Body example
<#ftl encoding="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<#setting time_zone="Europe/Bucharest">
<#setting output_encoding="UTF-8">
<#setting locale="en_US">
<#setting url_escaping_charset="UTF-8">

Dear ${recipient().name()!"N/A"},
<br><br>
Your visitor has <b style="color:#375eec;">Checked Out</b>.
<br><br>
<b>Visit Information:</b><br>
- Request ID: ${(requestId?c)!"N/A"}<br>
- Location: <#if location?? && location.label??>${location.label}<#else>-</#if><br>
- Visitor: ${name_first!"N/A"} ${name_last!"N/A"}<br>
- Visitor Type: ${visitor_type!"N/A"}<br>
- Badge: <#if badge_code?? && badge_code.label??>${badge_code.label}<#else>-</#if><br>

<#assign actualIn = (date_actual_in)!(details.date_actual_in)!"">
<#if actualIn?has_content>
<#assign parsedDate = dateUtils.parse(actualIn)!>
<#if parsedDate??>
- Checked In At: ${parsedDate?datetime?string("dd/MM/yyyy, HH:mm")}<br>
<#else>
- Checked In At: N/A<br>
</#if>
<#else>
- Checked In At: N/A<br>
</#if>

To view the record, click the link below:
<#if wfId?has_content && requestId?has_content>
<a href="https://app.signalsync.cloud/apps/gwe/manage/${wfId}/${requestId?c}">Open Record</a>
<#else>
<a href="https://app.signalsync.cloud">Open SignalSync</a>
</#if>
<br><br>
Best regards,<br>
SignalSync Team
<br><br>
<hr>
<span style="color: red;">
WARNING: This is an automatic message generated by the system.
Please do not reply to this email, as this email address is not monitored.
</span>

Key FreeMarker Patterns

PatternDescription
${fieldName!"fallback"}Outputs the field value, or the fallback if null/missing
${requestId?c}Converts a numeric value to a plain string (avoids locale formatting)
${object.label!"fallback"}Accesses the label property of an entity reference field
${recipient().name()}Returns the full name of the email recipient based on the assigned role
<#if field?? && field.label??> ... </#if>Null-safe check before accessing nested properties
dateUtils.parse(dateString)Parses an ISO date string into a FreeMarker date object for formatting
${parsedDate?datetime?string("dd/MM/yyyy, HH:mm")}Formats a parsed date with a custom pattern
<#setting locale="en_US">Sets the locale for date and number formatting
<#setting time_zone="Europe/Bucharest">Sets the time zone for date display
Accessing Nested Fields

Request fields that contain entity references (such as location, badge_code, host) are objects with label and value properties. Use ${location.label!"N/A"} to display the human-readable name. Use null-safety patterns (??) to avoid template errors when the field has not been filled in.

The Data Model

The Data model column in the Logs tab (see below) shows the exact JSON structure of any sent notification. Use this to understand what field names and paths are available in your FreeMarker expressions when building or debugging a template.

Attachments Tab

The Attachments tab allows you to attach documents to the notification email. Two options are available:

  • Upload Attachments — upload a static file (e.g., a PDF document) to be included in every email sent by this notification.
  • Workflow Templates — opens a selector dialog to choose one or more document templates defined in the workflow's Templates tab. When selected, the application generates the document dynamically at the time of sending, populated with the request's data, and attaches it to the email.

In the Workflow Templates selector:

  • Browse templates across all workflows (columns: Workflow, Template Name).
  • Use the preview icon (📄) to view the template before selecting.
  • Check the rows you want to assign and click Assign.

The Attachments list shows each assigned attachment with its name and whether it is a dynamic Workflow Template (Yes) or a static uploaded file.

Logs Tab

The Logs tab provides a delivery history for every email sent using this notification template. This is useful for verifying delivery, diagnosing failures, and inspecting the exact data that was used to generate each message.

ColumnDescription
DescriptionA description of when this notification fires (e.g., "Notifies the host when a visitor has checked out")
TypeThe channel used — currently always EMAIL
StatusSUCCESS or ERROR
DateTimestamp of when the email was sent
ToThe recipient email address
MessageClick the document icon (📄) to view the full rendered email exactly as it was delivered
Data modelClick the eye icon (👁) to inspect the full JSON data model that was passed to the FreeMarker template at the time of sending

Using the Data Model for Template Development

The Data model column shows the complete request JSON — every field, entity reference, nested object, and system property that was available to the template at send time. This is the primary tool for understanding what binding expressions to use when writing or troubleshooting notification templates.

For example, a visitor check-out notification's data model includes fields such as name_first, name_last, badge_code.label, location.label, date_actual_in, date_actual_out, requestId, wfId, and the full nested details and workflow objects.

Troubleshooting

How do I find out which field name to use in my template?

Open the Logs tab of the notification and click the eye icon (👁) in the Data model column of any recently sent log entry. The JSON shown is the exact data passed to FreeMarker at send time. The top-level keys are the field names you can use directly in expressions (e.g., ${name_first}, ${location.label}). Nested fields under details can be accessed as ${details.fieldName}.

Why is my binding expression showing 'N/A' instead of the actual value?

This happens when the field is null, missing from the data model, or has not been filled in on the form. Use the !"fallback" null-safety pattern (e.g., ${fieldName!"N/A"}) to handle this gracefully. Check the Data model in the Logs tab to confirm whether the field is present and what its actual value is.

Can I send the same notification to multiple roles?

Yes. Add the notification multiple times as separate events on the same action in the Designer — once per role. For example, you can notify both the Client and the Assigned Supervisor when a request status changes by creating two Notification events on the same connector, each targeting a different role.

How do I attach a dynamically generated document to a notification?

Use the Workflow Templates option in the Attachments tab. Select the template defined in the workflow's Templates tab — the application will generate the document automatically using the request data at send time and attach it to the email. This is useful for attaching forms, reports, or badges directly to status-change notifications.