Skip to main content

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

  1. Add Command Trigger for /remind
  2. Add Ask node: "In how many minutes?"
  3. Add flow.schedule node:
    • Mode: delay
    • Trigger Name: reminder
  4. Connect DelayMs input to: answer * 60000 (minutes to ms)
  5. Add Send Message: "I'll remind you in {{answer}} minutes!"

Step 2: Create the reminder trigger

  1. Add Scheduled Trigger with name reminder
  2. 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_York or UTC). Defaults to UTC if empty.

Outputs:

  • TriggerTime β€” When the trigger fired
  • Params β€” 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 scheduling
  • TaskID β€” Task identifier
  • UserID β€” 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 now
    • datetime β€” Specific date/time

Inputs:

InputSocketDescription
DelayMsNumberOnly for delay mode. Time to wait in milliseconds.
DateTimeStringOnly for datetime mode. ISO 8601 format (e.g., 2023-12-31T23:59:00Z).
ParamsObject/JSONData passed to the sys.scheduled_trigger. accessing via Params output.
UserIDNumberTarget user ID. Defaults to current user. for sys.scheduled_trigger context.
RepeatCountNumber-1=infinite, 0=one-time (default), >0=N times.
UI Configuration

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 later
  • ScheduledFor β€” When the task will run

flow.cancel_schedule β€” Cancel a Task​

Cancel a pending scheduled task.

Inputs:

  • TaskID β€” The ID returned by flow.schedule

Outputs:

  • Success β€” Task was cancelled
  • NotFound β€” Task not found or already executed
  • Cancelled β€” Boolean result

flow.schedule_message β€” Quick Message Scheduling​

Convenience node to schedule a message without a separate trigger.

Inputs:

InputDescription
MessageText to send
DelayMsDelay in milliseconds
DateTimeAlternative: specific date/time
ChatIDTarget chat (default: current user)

Cron Expression Format​

Standard 5-field format: minute hour day month weekday

FieldValuesWildcards
Minute0-59* = every, */5 = every 5
Hour0-23* = every
Day of Month1-31* = every
Month1-12* = every
Day of Week0-6 (Sun=0)1-5 = Mon-Fri

Common Examples​

ExpressionDescription
0 9 * * *Daily at 9:00 AM
0 9 * * 1-5Weekdays at 9:00 AM
*/15 * * * *Every 15 minutes
0 0 * * 0Sundays 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:

ValueBehavior
0One-time only (default)
-1Infinite (for cron)
5Repeat 5 times, then stop

For cron expressions, RepeatCount defaults to -1 (infinite).


Best Practices​

Use Descriptive Trigger Names

Name your triggers clearly: daily_digest, appointment_reminder, weekly_report

Store Task IDs

Always save the TaskID if users might need to cancel:

var.pending_reminder = TaskID
Mind the Timezone

Cron expressions use UTC by default. Specify timezone if needed:

Timezone: "America/New_York"
Rate Limiting

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:

  1. Using Try-Catch in your triggered flow
  2. Logging failures to admin
  3. Implementing manual retry logic

Next Steps​