K
Docs
Building Bots

Timers

Timers schedule flows to run automatically on a repeating interval using cron expressions — no user interaction needed. Perfect for daily digests, periodic cleanups, and scheduled announcements.

🔬What a timer looks like

This is what a timer card looks like in your bot's Timers tab:

Daily digest
Timer
Scheduled
Cron expression
0 9 * * *
📐Under the hood — timers are cron jobs
TypeScript
// A Timer is a cron job — Kitcord schedules these for you:
import { CronJob } from "cron";

new CronJob("0 9 * * *", async () => {
  // Your flow runs here on every tick (daily at 9 AM UTC):
  const topScores = await db.all("SELECT * FROM scores ORDER BY points DESC LIMIT 10");
  await leaderboardChannel.send(formatLeaderboard(topScores));
}).start();

// Kitcord reads timers[] from your Kit and schedules each cron automatically.

🗓️Cron Expressions

Timers use standard 5-field cron syntax. All times are UTC.

minute
hour
day
month
weekday
0–59
0–23
1–31
1–12
0–7
0 9 * * *← Every day at 9:00 AM UTC
Examples
* * * * *Every minute
0 * * * *Every hour (on the hour)
0 9 * * *Every day at 9:00 AM UTC
0 0 * * 0Every Sunday at midnight UTC
0 0 1 * *First day of every month
*/15 * * * *Every 15 minutes
30 6 * * 1-5Weekdays at 6:30 AM UTC
0 12 * * 5Every Friday at noon UTC
💡Good to know

Weekday 0 and 7 both mean Sunday. Ranges work: 1-5 = Monday through Friday. Step values work: */15 = every 15 minutes.

Sparks in Timer Flows

Timer flows don't have a user invoking them, so most input.* sparks are not available. You can still use:

{{input.guild.id}}Server ID (shared with other flow types)
{{timestamp}}Current time in ISO format when the timer fires
{{date}}Today's date (YYYY-MM-DD)
{{score}}Any spark set by an upstream piece in this timer flow
Pro tip

Use Send Message with a channel ID in the config, or store the channel ID in the Vault and read it at the start of the timer flow.

📋Scheduling Notes

  • All cron times are UTC — remember to offset for your local timezone.
  • The minimum interval is 1 minute (*/1 or * * * * *). Tighter intervals are not supported.
  • If your bot is offline when a timer fires, the tick is skipped — not queued.
  • Multiple timers can point to the same flow.
  • Timers run in the same execution environment as Spell and Trigger flows.