Scheduler & Cron Jobs
Schedule tasks to run at specific times or on recurring schedules. Perfect for reminders, daily digests, follow-ups, and automated workflows.
Overviewβ
BotGami's scheduler system lets you:
- π Schedule one-time tasks β Run after a delay or at a specific time
- π Create recurring jobs β Use cron expressions for repeating schedules
- β° Send reminders β Schedule messages for users
- β Cancel scheduled tasks β Stop pending tasks before they run
Quick Start: Schedule a Reminderβ
Let's create a simple reminder bot:
Step 1: Create a command to set a reminder
- Add Command Trigger for
/remind - Add Ask node: "In how many minutes?"
- Add flow.schedule node:
- Mode:
delay - Trigger Name:
reminder
- Mode:
- Connect
DelayMsinput to:answer * 60000(minutes to ms) - Add Send Message: "I'll remind you in
{{answer}}minutes!"
Step 2: Create the reminder trigger
- Add Scheduled Trigger with name
reminder - Add Send Message: "β° Here's your reminder!"
Scheduler Nodesβ
sys.cron_trigger β Recurring Schedulesβ
Fires automatically based on a cron schedule. Runs at the bot level (not per-user).
Configuration:
- Name β Unique identifier for this cron job (e.g.,
daily_digest) - Expression β Cron expression (e.g.,
0 9 * * *) - Timezone β IANA Timezone string (e.g.,
America/New_YorkorUTC). Defaults toUTCif empty.
Outputs:
TriggerTimeβ When the trigger firedParamsβ Any parameters passed
ββββββββββββββββββββββ
β sys.cron_trigger ββββΆ NEXT
β "0 9 * * *" ββββΆ TriggerTime
β "daily_digest" β
ββββββββββββββββββββββ
sys.scheduled_trigger β Receive Scheduled Tasksβ
Fires when a task scheduled by flow.schedule executes.
Configuration:
- Name β Must match the trigger name used in
flow.schedule
Outputs:
Paramsβ Data passed during schedulingTaskIDβ Task identifierUserIDβ Target user (if specified)TriggerTimeβ Execution time
βββββββββββββββββββββββ
β sys.scheduled_ ββββΆ NEXT
β trigger "reminder" ββββΆ Params
β ββββΆ UserID
βββββββββββββββββββββββ
flow.schedule β Schedule a Taskβ
Schedule a task from within any flow.
Configuration:
- Trigger Name β Name of the trigger to fire
- Mode β How to specify timing:
delayβ Milliseconds from nowdatetimeβ Specific date/time
Inputs:
| Input | Socket | Description |
|---|---|---|
DelayMs | Number | Only for delay mode. Time to wait in milliseconds. |
DateTime | String | Only for datetime mode. ISO 8601 format (e.g., 2023-12-31T23:59:00Z). |
Params | Object/JSON | Data passed to the sys.scheduled_trigger. accessing via Params output. |
UserID | Number | Target user ID. Defaults to current user. for sys.scheduled_trigger context. |
RepeatCount | Number | -1=infinite, 0=one-time (default), >0=N times. |
You can also set default values directly in the node's configuration panel if you don't want to use input sockets.
Outputs:
TaskIDβ Use this to cancel the task laterScheduledForβ When the task will run
flow.cancel_schedule β Cancel a Taskβ
Cancel a pending scheduled task.
Inputs:
TaskIDβ The ID returned byflow.schedule
Outputs:
Successβ Task was cancelledNotFoundβ Task not found or already executedCancelledβ Boolean result
flow.schedule_message β Quick Message Schedulingβ
Convenience node to schedule a message without a separate trigger.
Inputs:
| Input | Description |
|---|---|
Message | Text to send |
DelayMs | Delay in milliseconds |
DateTime | Alternative: specific date/time |
ChatID | Target chat (default: current user) |
Cron Expression Formatβ
Standard 5-field format: minute hour day month weekday
| Field | Values | Wildcards |
|---|---|---|
| Minute | 0-59 | * = every, */5 = every 5 |
| Hour | 0-23 | * = every |
| Day of Month | 1-31 | * = every |
| Month | 1-12 | * = every |
| Day of Week | 0-6 (Sun=0) | 1-5 = Mon-Fri |
Common Examplesβ
| Expression | Description |
|---|---|
0 9 * * * | Daily at 9:00 AM |
0 9 * * 1-5 | Weekdays at 9:00 AM |
*/15 * * * * | Every 15 minutes |
0 0 * * 0 | Sundays at midnight |
0 0 1 * * | First of each month |
30 8,12,18 * * * | 8:30 AM, 12:30 PM, 6:30 PM daily |
Examplesβ
Daily Digestβ
Send a summary to all users every morning:
ββββββββββββββββββββββ βββββββββββββββββββ ββββββββββββββββββββ
β sys.cron_trigger βββββΆβ Get Users βββββΆβ For Each β
β "0 9 * * 1-5" β β (from DB) β β β
β "daily_digest" β βββββββββββββββββββ ββββββββββ¬ββββββββββ
ββββββββββββββββββββββ β
βΌ
ββββββββββββββββββββ
β Send Message β
β "Good morning!"β
ββββββββββββββββββββ
Appointment Reminderβ
Send reminder 24 hours before:
User Books Appointment
β
βΌ
βββββββββββββββββββββββ
β flow.schedule β
β Mode: datetime β
β Trigger: reminder β
β DateTime: (apt - 24h) β
β Params: {apt_id} β
βββββββββββββββββββββββ
β
βΌ (24 hours later)
βββββββββββββββββββββββ
β sys.scheduled_ β
β trigger "reminder" β
βββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββ
β Send Message β
β "Reminder: Your β
β appointment is β
β tomorrow!" β
βββββββββββββββββββββββ
Follow-Up Messageβ
Send a follow-up 1 hour after user interaction:
// After user completes a form
flow.schedule:
Mode: delay
DelayMs: 3600000 // 1 hour
TriggerName: "followup"
Params: {
user_name: var.name,
form_type: "survey"
}
Cancellable Reminderβ
Let users cancel their own reminders:
Setting the reminder:
flow.schedule β Save TaskID to var.reminder_id
Canceling:
/cancel command β flow.cancel_schedule with var.reminder_id
Repeat Countβ
Control how many times a task repeats:
| Value | Behavior |
|---|---|
0 | One-time only (default) |
-1 | Infinite (for cron) |
5 | Repeat 5 times, then stop |
For cron expressions, RepeatCount defaults to -1 (infinite).
Best Practicesβ
Name your triggers clearly: daily_digest, appointment_reminder, weekly_report
Always save the TaskID if users might need to cancel:
var.pending_reminder = TaskID
Cron expressions use UTC by default. Specify timezone if needed:
Timezone: "America/New_York"
For mass notifications (daily digest to all users), add delays between messages to avoid Telegram rate limits.
Error Handlingβ
If a scheduled task fails:
- Status is set to
failed - Error message is logged
- The task won't retry automatically
For critical tasks, consider:
- Using Try-Catch in your triggered flow
- Logging failures to admin
- Implementing manual retry logic
Next Stepsβ
- Booking System Tutorial β β Uses scheduler for reminders
- Best Practices β β Scheduling patterns