Settings — Notifications
Permission: Admin only.
The Notifications group in Settings controls the SMS and email notifications your company sends automatically:
- General — when SMS may be sent (quiet hours).
- Triggers — the notifications themselves: what fires them, the message, and who receives it.
For an overview of all Settings sections, see Settings.
Add-on Feature. SMS & Email Notifications are an add-on feature.
General
Settings → Notifications → General
SMS: Quiet hours
Quiet hours holds SMS notifications back to a time of day.
- Turn Quiet hours on.
- Under Send between, set the From and To times. Anything raised outside these hours waits until the window opens again.
- Click Save changes.
Some messages ignore quiet hours — a login one-time code is always sent immediately.
Triggers
Settings → Notifications → Triggers
A table of every notification your organization has set up, with its Name, Type (the event that fires it) and Interface (SMS or Email). Each row has a Delete button; click a row to edit it.
Click New notification to add one.
The notification panel
When you create or edit a notification, the panel has four cards.
1. Notification
- Name — a label for your team (e.g. SMS – Pickup to warehouse). It must be unique.
2. Trigger
- Send a notification when — the event that fires the notification:
- New order created
- Order status changes
- Order location status changes
- T&T shipment report created
- Route stop completed
- and this expression is met — optional extra conditions on top of the
trigger. Build them in Visual mode or write them in Text mode.
- Combine conditions with: AND / OR — how multiple conditions are joined.
- Each condition row picks a property (Select property), an Operator and a Value. Click Add Condition for more rows.
- For Route stop completed, Stop Notification Settings appear. Pick one of the Common Scenarios and check the Preview of which stops will be notified. Under Show Advanced Settings you can set exactly Which stop to notify (for example Next stop (immediate) or Completed stop (confirmation)), How many stops to notify, and Send notification before arrival (for example 15 minutes before arrival).
3. Message
- Send notification via — SMS or Email.
- Delay after creation (seconds) (SMS only) — optional delay before the SMS goes out. Leave empty to send immediately.
- Template Content — the message body. An email has a template for the
Email subject and one for the Email body. Use template variables in
{{ . }}syntax to insert dynamic data (e.g.{{.Order.InternalOrderNumber}},{{.Pickup.LocationName}},{{.Delivery.EstimatedStart}},{{.Delivery.TrackingLink}}). - Available Variables (click to insert) — a searchable list of the variables for the chosen trigger. Click a variable to insert it into the template.
- A preview of the rendered message, and for SMS a character counter that shows how many SMS segments the message will be sent as.
4. Recipients
Choose who receives the notification based on their relationship to the order. Which types are offered depends on the trigger:
- Customer contacts — contacts on the order’s customer.
- Stop contacts — contacts on the stop’s location.
- Pickup contacts — contacts on the pickup location.
- Delivery contacts — contacts on the delivery location.
Under Always notify, click New to add email addresses or phone numbers that receive every notification of this kind.
Click Save to apply, or Cancel to discard. To delete a notification, use Delete in the panel or on its row; it stops being sent.
Template & condition reference
This is the deep reference for building notification triggers, conditions, and message templates. Notifications are triggered by new orders, changes to orders and order locations, completed route stops, and track & trace reports. Conditions are written in the expr language , and templates use Go template syntax.
Event types and triggers
1. Order status changes (ORDER_STATE_CHANGED)
Triggered when an order’s status changes (e.g., from “pending” to “dispatched” or “delivered”).
Data Objects Available:
- Order — The order that changed status
- Pickup — The pickup location for the order
- Delivery — The delivery location for the order
- Driver — Assigned driver (if any)
- Customer — Order’s customer information
- Recipient — Who this notification is being sent to
2. Order location status changes (ORDER_LOCATION_STATE_CHANGED)
Triggered when a specific stop (pickup or delivery location) changes status (e.g., “dispatched” to “arrived” or “completed”).
Data Objects Available:
- Stop — The specific location that changed status
- Order — The parent order
- Pickup — The order’s pickup location
- Delivery — The order’s delivery location
- Driver — Driver handling the stop
- Customer — Order’s customer
- Recipient — Who this notification is being sent to
3. New order created (ORDER_CREATED)
Triggered when a new order is created in the system.
4. T&T shipment report created (TT_SHIPMENT_REPORT_CREATED)
Triggered when a recipient submits a delivery report through the track & trace system.
This event type requires the Track & Trace add-on feature to be enabled in your system.
5. Route stop completed (ROUTE_STOP_COMPLETED)
Triggered when a stop on a route is completed. Which stops are notified, and when, is set in the trigger’s Stop Notification Settings (see Triggers above).
Order status reference
The following status values are available for use in notification conditions and template variables:
| Status | Description | Typical Use Case |
|---|---|---|
unassigned | Order created but no driver assigned | Initial order confirmation notifications |
planned | Order assigned to driver but not yet started | Dispatch planning notifications |
dispatched | Driver has started the order route | Customer notification of dispatch |
in_transit | Driver is en route between locations | Progress update notifications |
arrived | Driver has arrived at pickup/delivery location | Arrival notifications for recipients |
delivered | Order delivery completed successfully | Final delivery confirmation |
complete | Entire order lifecycle finished | Final completion notifications |
cancelled | Order has been cancelled | Cancellation notifications |
Status usage examples
Order creation notification:
// Trigger when new orders are created
Order.Status == "unassigned"Dispatch notification:
// Trigger when orders are dispatched
OldStatus == "planned" && NewStatus == "dispatched"Arrival notifications:
// Trigger when driver arrives at any location
NewStatus == "arrived"Completion notifications:
// Trigger when delivery is completed
NewStatus == "delivered" || NewStatus == "complete"Exception handling:
// Trigger for cancelled orders
NewStatus == "cancelled"Setting conditions with Expr
Use expr language expressions to filter when notifications are sent. Conditions must evaluate to a boolean value.
Common examples:
// Only for specific order statuses
Order.Status == "delivered"
// Only for pickup locations
Stop.LocationType == "pickup"
// Only for external drivers
Driver.IsExternal == true
// Multiple conditions
Order.OrderType == "express" && NewStatus == "dispatched"
// Customer-specific notifications
Customer.SendNotificationBeforeArriving == true
// Status transitions
OldStatus == "in_transit" && NewStatus == "delivered"Available operators:
- Comparison:
==,!=,<,<=,>,>= - Logical:
&&,||,! - String operations:
contains(),startsWith(),endsWith() - Arithmetic:
+,-,*,/,%
Advanced status-based conditions
Single status triggers:
// Trigger only when order becomes unassigned
NewStatus == "unassigned"
// Trigger only when order is planned
NewStatus == "planned"
// Trigger only when order is dispatched
NewStatus == "dispatched"
// Trigger only when driver is in transit
NewStatus == "in_transit"
// Trigger only when driver arrives
NewStatus == "arrived"
// Trigger only when delivery is complete
NewStatus == "delivered"
// Trigger only when order is fully complete
NewStatus == "complete"
// Trigger only when order is cancelled
NewStatus == "cancelled"Status transition conditions:
// Order assignment notification
OldStatus == "unassigned" && NewStatus == "planned"
// Dispatch notification
OldStatus == "planned" && NewStatus == "dispatched"
// Journey progress notification
OldStatus == "dispatched" && NewStatus == "in_transit"
// Arrival notification
OldStatus == "in_transit" && NewStatus == "arrived"
// Delivery completion notification
OldStatus == "arrived" && NewStatus == "delivered"
// Final completion notification
OldStatus == "delivered" && NewStatus == "complete"
// Cancellation from any status
OldStatus != "cancelled" && NewStatus == "cancelled"Combined conditions:
// Express orders that are dispatched
Order.OrderType == "express" && NewStatus == "dispatched"
// Delivery arrivals only (not pickup arrivals)
Stop.LocationType == "delivery" && NewStatus == "arrived"
// Pickup completions only
Stop.LocationType == "pickup" && NewStatus == "delivered"
// External driver notifications
Driver.IsExternal == true && NewStatus == "dispatched"
// High-priority cancellations
Order.Priority == "high" && NewStatus == "cancelled"Notification interfaces
Email notifications
- Subject Line — customizable email subject
- HTML Content — rich email body with templates
- Attachments — include images, documents, signatures
SMS notifications
- Text Message — plain text SMS content
- Sender ID — organization shortname or name (max 11 chars)
- Quiet hours — SMS respect the quiet hours set under General
Message guidelines
SMS guidelines:
- Keep under 160 characters
- Include essential information only
- Always add tracking link when relevant
Example SMS:
Order [ORDER_NUMBER] dispatched! Driver [DRIVER_NAME] assigned.
Pickup expected [PICKUP_ETA]. Track: [TRACKING_LINK]Email guidelines:
- Professional subject lines
- Clear, structured content
- Include complete order details
- Provide clear next steps
Example email:
Subject: Order Dispatched - [ORDER_NUMBER]
Dear [CUSTOMER_NAME],
Your order has been dispatched:
Order: [ORDER_NUMBER]
Driver: [DRIVER_NAME] ([DRIVER_PHONE])
Pickup: [PICKUP_LOCATION]
Expected: [PICKUP_ETA]
Track: [TRACKING_LINK]
Best regards,
[COMPANY_NAME]Template variables reference
Go Template Syntax. Zendera uses Go template syntax with {{.FieldName}}
format. All field names are case-sensitive.
Order data (Order.*):
{{.Order.OrderID}}— Unique order identifier{{.Order.InternalOrderNumber}}— Human-readable order number (e.g., “ABCZ214”){{.Order.TrackingLink}}— Public tracking URL{{.Order.Status}}— Current order status string{{.Order.OrderType}}— Order type (e.g., “express”, “regular”){{.Order.Reference}}— Customer reference
Location data (Pickup.*, Delivery.*, Stop.*):
{{.Stop.LocationName}}— Location name{{.Stop.FullAddress}}— Complete formatted address{{.Stop.ETA}}— Formatted ETA string (e.g., “15:30 on 20 June 2022”){{.Stop.TrackingLink}}— Location-specific tracking URL{{.Pickup.Earliest}}/{{.Delivery.Latest}}— Service time windows
Driver data (Driver.*):
{{.Driver.Name}}— Full driver name{{.Driver.FirstName}}— Driver first name{{.Driver.PhoneNumber}}— Driver contact number
Customer & recipient data:
{{.Customer.Name}}— Customer name{{.Recipient.FirstName}}— Recipient first name{{.Recipient.Email}}— Recipient email address
Event data:
{{.OldStatus}}/{{.NewStatus}}— Status change information{{.Timestamp}}— Event timestamp
Template functions and conditionals
Conditional logic:
{{if eq .Order.Status "delivered"}}
<p>Your order has been delivered!</p>
{{else if eq .Order.Status "in_transit"}}
<p>Your order is on the way.</p>
{{else}}
<p>Order status: {{.Order.Status}}</p>
{{end}}Driver conditional:
{{if .Driver}}
Driver: {{.Driver.Name}} ({{.Driver.PhoneNumber}})
{{else}}
No driver assigned yet
{{end}}Date formatting:
{{.Pickup.Earliest.Format "2006-01-02 15:04"}}
{{.Timestamp.Format "January 2, 2006"}}Complete template examples
Example 1: Customer delivery notification
Event: Order Location Status Changed
Condition: Stop.LocationType == "delivery" && NewStatus == "delivered"
Recipients: Customer contacts
Email subject:
Your order #{{.Order.InternalOrderNumber}} has been deliveredEmail body:
<h2>Delivery Confirmation</h2>
<p>Hello {{.Recipient.FirstName}},</p>
<p>Great news! Your order #{{.Order.InternalOrderNumber}} has been successfully delivered to {{.Stop.LocationName}}.</p>
<p><strong>Delivery Details:</strong></p>
<ul>
<li>Delivered to: {{.Stop.FullAddress}}</li>
<li>Delivery time: {{.Stop.CompletedAt.Format "January 2, 2006 at 15:04"}}</li>
{{if .Driver.Name}}
<li>Delivered by: {{.Driver.Name}}</li>
{{end}}
</ul>
<p>Thank you for choosing our service!</p>Example 2: Driver arrival SMS
Event: Order Location Status Changed
Condition: NewStatus == "arrived"
Recipients: Stop contacts
SMS:
Driver {{.Driver.FirstName}} has arrived at {{.Stop.LocationName}} for order #{{.Order.InternalOrderNumber}}. ETA was {{.Stop.ETA}}.Example 3: Express order alert
Event: Order Created
Condition: Order.OrderType == "express"
Recipients: Always notify (dispatch team)
Email subject:
URGENT: Express Order Created - #{{.Order.InternalOrderNumber}}Email body:
<h2>Express Order Alert</h2>
<p>A new express order has been created and requires immediate attention:</p>
<ul>
<li><strong>Order:</strong> #{{.Order.InternalOrderNumber}}</li>
<li><strong>Customer:</strong> {{.Customer.Name}}</li>
<li><strong>Pickup:</strong> {{.Pickup.LocationName}}</li>
<li><strong>Delivery:</strong> {{.Delivery.LocationName}}</li>
<li><strong>Pickup Window:</strong> {{.Pickup.Earliest.Format "15:04"}} - {{.Pickup.Latest.Format "15:04"}}</li>
<li><strong>Delivery Window:</strong> {{.Delivery.Earliest.Format "15:04"}} - {{.Delivery.Latest.Format "15:04"}}</li>
</ul>
<p>Please assign a driver immediately.</p>Data object relationships
- Order → Order Locations: Each order has one pickup and one delivery location
- Order → Customer: Every order belongs to a customer account
- Order → Driver: Orders may have an assigned driver (can be null)
- Order Location → Documentation: Each location can have associated documentation
Complete template variable reference
Recipient data (Recipient.*)
{{.Recipient.FullName}}— Complete recipient name (e.g., “OW”){{.Recipient.FirstName}}— Recipient first name (e.g., “Obi”){{.Recipient.LastName}}— Recipient last name (e.g., “Wan”){{.Recipient.Email}}— Recipient email address (e.g., “obiwan@jedi”){{.Recipient.Phone}}— Recipient phone number (e.g., “0740000000”)
Order data (Order.*)
{{.Order.OrderID}}— Unique order identifier{{.Order.SerialCode}}— Sequential order number{{.Order.InternalOrderNumber}}— Human-readable order number (e.g., “ABCZ214”){{.Order.TrackingLink}}— Public tracking URL{{.Order.StatusID}}— Numeric status identifier{{.Order.Status}}— Current order status string{{.Order.OrderTypeID}}— Numeric order type identifier{{.Order.OrderType}}— Order type string (e.g., “express”, “regular”){{.Order.Reference}}— Customer reference{{.Order.ShipmentID}}— Shipment identifier{{.Order.Documentations}}— Associated documentation data
Location data (Pickup/Delivery/Stop)
Status and identification:
{{.Stop.StatusID}}/{{.Pickup.StatusID}}/{{.Delivery.StatusID}}— Numeric status{{.Stop.Status}}/{{.Pickup.Status}}/{{.Delivery.Status}}— Status string{{.Stop.OrderLocationID}}— Unique location identifier{{.Stop.InternalStopNumber}}— Human-readable stop number (e.g., “ABCZ214-COLLECTION”){{.Stop.LocationID}}— Location master data identifier{{.Stop.LocationName}}— Location name{{.Stop.LocationType}}— “pickup” or “delivery”{{.Stop.LocationTypeID}}— 1 = pickup, 2 = delivery
Time fields:
{{.Pickup.Earliest}}/{{.Delivery.Earliest}}— Earliest service time{{.Pickup.Latest}}/{{.Delivery.Latest}}— Latest service time{{.Stop.EstimatedStart}}— Estimated start time{{.Stop.ETA}}— Formatted ETA string (e.g., “15:30 on 20 June 2022”){{.Stop.ArrivedAt}}— Actual arrival time (if completed){{.Stop.CompletedAt}}— Actual completion time (if completed)
Address fields:
{{.Stop.FullAddress}}— Complete formatted address (e.g., “Storgata 32, 0184 Oslo, Norway”){{.Stop.Address1}},{{.Stop.Address2}},{{.Stop.Address3}}— Address lines{{.Stop.AddressNumber}}— Street number{{.Stop.City}}— City name{{.Stop.Region}}— Region/state{{.Stop.Country}}— Country name{{.Stop.PostalCode}}— Postal/ZIP code{{.Stop.AddressCoordinates.Latitude}}/{{.Stop.AddressCoordinates.Longitude}}— GPS coordinates
Tracking and completion:
{{.Stop.TrackingLink}}— Location-specific tracking URL{{.Stop.ArrivedCoordinates.Latitude}}/{{.Stop.ArrivedCoordinates.Longitude}}— GPS at arrival{{.Stop.CompletedCoordinates.Latitude}}/{{.Stop.CompletedCoordinates.Longitude}}— GPS at completion
Driver data (Driver.*)
{{.Driver.Name}}— Full driver name (e.g., “Yoda Force”){{.Driver.FirstName}}— Driver first name (e.g., “Yoda”){{.Driver.PhoneNumber}}— Driver contact number (e.g., “0723000000”){{.Driver.ExportOrders}}— Whether driver exports orders{{.Driver.IsExternal}}— Whether driver is external{{.Driver.OptimizeRoutes}}— Whether routes are optimized
Customer data (Customer.*)
{{.Customer.ID}}— Customer identifier{{.Customer.Name}}— Customer name
Event data (status change events)
{{.OldStatusID}}/{{.OldStatus}}— Previous status{{.NewStatusID}}/{{.NewStatus}}— New status{{.OrderID}}— Related order ID{{.OrderLocationID}}— Related location ID (for location events){{.OrganizationID}}— Organization identifier{{.Timestamp}}— Event timestamp
Track & Trace report data (TT Report events)
{{.CreatedAt}}— Report creation timestamp{{.TrackTraceUUID}}— Unique track & trace identifier{{.TrackTraceLink}}— Public track & trace URL{{.Comment}}— Recipient’s comment{{.OrganizationLogo}}— Company logo attachment
Irregularities:
{{.Irregularities[].Comment}}— Irregularity comment{{.Irregularities[].IsDamaged}}— Whether damage was reported{{.Irregularities[].IsWrongQuantity}}— Whether quantity issue was reported{{.Irregularities[].ProductName}}— Product name{{.Irregularities[].InternalOrderProductNumber}}— Product number{{.Irregularities[].WrongQuantity.Ordered}}— Expected quantity{{.Irregularities[].WrongQuantity.Received}}— Actual quantity received{{.Irregularities[].Images[]}}— Associated images
Images:
{{.Images[]}}— Report images uploaded by recipient
Attachment functions (email only)
{{.AttachImage .SomeImage}}— Attach image for email{{.AttachImageInline .SomeImage}}— Embed image inline in email
Troubleshooting
Notifications not sending
Check configuration:
- Confirm expr conditions are syntactically correct
- Test conditions with sample data
Verify recipients:
- Check that recipients have valid email/phone numbers
- Ensure recipient types are correctly configured
- Verify Always notify contacts are properly formatted
Template issues:
- Validate template syntax (case-sensitive field names)
- Test templates with known data
- Check for typos in variable names
Customers not receiving messages
Email issues:
- Check spam/junk folders
- Verify email addresses are valid and not blocked
- Monitor email service delivery reports
- Test with different email providers
SMS issues:
- Check the SMS quiet hours and the trigger’s delay
- Verify phone number formats (include country codes)
- Confirm SMS service provider reputation
- Test with different mobile carriers
Condition expression errors
Syntax validation:
- Use the expr language documentation for reference
- Ensure conditions return boolean values
- Test expressions with mock data
- Use parentheses for complex logic
Common mistakes:
// Incorrect: Assignment instead of comparison
Order.Status = "delivered"
// Correct: Comparison operator
Order.Status == "delivered"
// Incorrect: Missing quotes for strings
Order.Status == delivered
// Correct: Quoted string values
Order.Status == "delivered"Performance issues
High volume notifications:
- Review conditions to avoid unnecessary triggers
- Stagger notifications for large batches
- Monitor system resources during peak times
- Use specific conditions rather than broad filters
Delivery monitoring:
- Track notification delivery rates
- Monitor failed delivery reports
- Review customer feedback regularly
- Use the API to programmatically access delivery logs
What’s next
- Settings → Webhooks & API key — push events to your own systems.
- Settings — overview.