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:
⏰Scheduled
Daily digest
Timer
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 UTCExamples
* * * * * | Every minute |
0 * * * * | Every hour (on the hour) |
0 9 * * * | Every day at 9:00 AM UTC |
0 0 * * 0 | Every Sunday at midnight UTC |
0 0 1 * * | First day of every month |
*/15 * * * * | Every 15 minutes |
30 6 * * 1-5 | Weekdays at 6:30 AM UTC |
0 12 * * 5 | Every 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.