How Digest works?
Opens batch window
Accumulates trigger until the next digest schedule
Moves to next workflow step
- Trigger: When task status is changed (First task status change is received at Jul 30, 7:00 AM UTC)
- Digest Schedule: Daily at 7:00 PM (in recipient’s timezone)
- Recipient’s Timezone: Europe/London (UTC+1).

Configuring Digest schedule
It is the recurring schedule when an open digest should be closed. This schedule might differ from the time notifications are actually sent. e.g., if you want to send a daily digest summarizing activities from the previous day at 9:00 AM, you would set the Digest schedule to close daily at midnight and follow it with Time Window or Delay node to send the notification at 9:00 AM.Fixed Schedule
Fixed Schedule
- Repeat every: Defines the recurrence of the digest, such as every 5 minutes, hourly, daily, etc. It is a combination interval (1,2,3 etc.) and frequency (daily, weekly, monthly, hourly and minutely). e.g. you can set frequencies as:
- every 5 minutes (here, interval is
5
withminutely
frequency) - every hour
- every 3 days
- every weekday
- every 2 weeks on selected days of the week (e.g. Mondays and Wednesdays of the week)
- every month on selected days of the month (e.g. 1st, 3rd, and 5th Mondays of the month or 1st - 5th day of the month)
- every 5 minutes (here, interval is
- Time: Specifies when the digest should be closed for daily, weekly or monthly frequency. The time is always in reference to the timezone selected.
- Timezone: Set the timezone for the Time specified. You can select recipient’s timezone, which will be dynamically calculated for each recipient. You can set recipient timezone in user profile with
$timezone
key in HTTP API oruser.set_timezone()
method from your backend or Frontend SDKs. Timezones should be in IANA (TZ identifier) format, such asAmerica/New_York
. - Starting from: Defines the starting point for recurring schedule. e.g., if starting from is
2024-07-17 17:00
and repeat every is set to daily at 4pm IST, first schedule will be 18th July 4pm IST. You can set a future starting point if you want the first digest to be sent later. Note that in this case, all triggers from when the workflow is activated until the first schedule after the “starting from” time will be included in the first digest. Referred to asdtstart
in dynamic schedule expression.
Dynamic Schedule (Send Digest based on user preference)
Dynamic Schedule (Send Digest based on user preference)
Variable | Type | Description |
---|---|---|
frequency | string (mandatory) | Choose from one of the below options: minutely hourly daily weekly (mandatory to pass weekdays in this case) weekly_mo2fr (weekly on Monday to Friday) monthly (mandatory to pass monthdays in this case) |
interval | integer (optional) | Interval at which the frequency will repeat. Interval 2 with frequency daily would mean repeat every 2 days. Defaults to 1 if not set. |
weekdays | array[] (mandatory for weekly frequency) | Days of the week for weekly frequency. Pass the first 2 characters of days of the week in an array as ["su", "mo", "tu", "we", "th", "fr", "sa"] |
monthdays | array[map] (mandatory for monthly frequency) | Days of the month for monthly frequency (e.g. 1st, 3rd, and 5th Mondays of the month or 1st - 5th day of the month). Pass as [{"pos": 1, "day": "mo"}] , where pos defines the day index and day defines the type of day (can be referred to define the day of the week). e.g., 1st,2nd day of the month will be set as [{"pos": 1, "day": ""},{"pos": 2, "day": ""}] . |
time | string (optional) | Time for daily, weekly, or monthly frequency when the digest will close. Defined in hour and minute as hh:mm . Defaults to 00:00 if not set. |
dtstart | datetime (ISO-8601 format) (optional) | Starting time from which the first schedule will be calculated. Set as 2024-08-01T10:40:50 in ISO-8601 format. Defaults to current_timestamp at the time of setting the schedule if not defined. |
tz_selection | string (optional) | Timezone selection. time and dtstart will both be in this timezone. - Leave empty "" for fixed timezone - Set to "recipient" if the timezone needs to be picked dynamically from user property or trigger data. |
tz_fixed | string (mandatory if "tz_selection": "" ) | Timezone to pick in case of fixed tz_selection . Add timezone in IANA (TZ identifier) format as America/New_York . Defaults to UTC if not set. |
Passing dynamic schedule for users
You can either pass dynamic schedule in each workflow trigger or a better way to handle is to store it in user profile. You can store any number of schedules in user profile or in tenant properties. It’s a good practice to map the digest schedule to either workflow or category identifier in user profile (If you have multiple notification categories in your system). Refer create user profile section to understand how user properties are set in user profile.Advanced settings
Retain Items
Retain Items
Min Trigger Count
Min Trigger Count
Using Digest (Batch) variables in templates
Batch output variable has 2 type of variables:$batched_events
array : All the event properties corresponding to a batched event is appended to this array and can be used in the template in the array format. The number of event properties returned here is limited by retain batch events.$batched_event_count
: This count represents the number of events in a batch and is utilized to render the batch count in a template. For instance, you might send a message like,Joe left 5 comments in the last 1 hour
where 5 corresponds to $batched_event_count.
$batched_events
array.$batched_events_count
and $batched_events
array of all properties passed in the event payload as shown below:
Enable batching
option in Mock data button on template details page. Once enabled, you’ll start getting $batched_events
variable in auto suggestion on typing {{
in template editor. The variables in mock data will be treated as event properties and Event Count
will imitate the number of times this event will be triggered in the batch.

Transforming Digest variable output
There can be cases where you need to split the digest output variables into multiple arrays based on keys in your input data. e.g., to send a message likeYou have got 5 comments and 3 likes on your post today
where post and likes are interaction_type in your input payload. You can use data transform node and generate relevant variables using JSONNET editor to handle this use case.

comment_count
: to get the count of all interactions whereinteraction_type = comment
like_count
: to get the count of all interactions whereinteraction_type = like
all_comments
: to fetch all array objects whereinteraction type = comment
You have got {{comment_count}} comments and {{like_count}} likes on your post today
.
Some common notification use cases
Sending immediate or digest notification based on user's preference
Sending immediate or digest notification based on user's preference
Deliver individual alerts to users throughout the day and provide a summary of all alerts at day’s end
Deliver individual alerts to users throughout the day and provide a summary of all alerts at day’s end
Send recommendation or top stories at the end of the day
Send recommendation or top stories at the end of the day
Send batched reminders for pending activities or courses
Send batched reminders for pending activities or courses
Frequently Asked Questions
What happens when digest schedule is changed and an existing digest is running?
What happens when digest schedule is changed and an existing digest is running?
What happens when dynamic schedule is empty?
What happens when dynamic schedule is empty?
What happens when wrong schedule is passed in dynamic schedule?
What happens when wrong schedule is passed in dynamic schedule?
What happens when digest node follows time window?
What happens when digest node follows time window?