Scheduling Agent Runs
Set up a schedule and your agent will wake up at the times you choose, do the work, and leave the results in chat — even when you’re not looking. A daily morning briefing, an hourly site check, a one-off “remind me in 30 minutes” — they all use the same simple mechanism.
What can I do with it?
| Scenario | Example |
|---|---|
| Same time every day | Every morning at 8 AM, summarize overnight news |
| Weekdays only / weekends only | Twice a day on weekdays — 9 AM and 6 PM market check |
| Hourly or sub-hourly polling | Every hour, check this inventory page and alert me only if it changed |
| One-time delayed run | ”Come back in 30 minutes and finish the meeting notes” |
| Heavy work in off hours | Every Sunday at 3 AM, run the weekly cleanup |
A scheduled run is a simple loop: the agent works, leaves the result in chat, and a push notification lets you know it’s ready. You step away, your agent works, you check the answer when you come back.
Two ways to set up a schedule
1. Just tell the agent in plain language
Easiest path. Type it into chat the way you’d ask a person.
“Every morning at 8, pull the top 5 AI news stories from yesterday and summarize them.”
“Check this page every hour and only tell me if the price changes.”
“Come back in 30 minutes and recheck the result.”
The agent will register the schedule itself. A “Schedule registered” card appears in chat showing the next run time and the exact instruction it saved. You just confirm it looks right.
An agent can have up to 5 of its own active schedules at any one time — recurring and one-time schedules count toward the same shared cap. Schedules you add yourself from the UI are not subject to this cap.
2. Set it up from the UI
The Schedules menu (/agents/<agent>/schedules) has two distinct sections.
Heartbeat (looking around on its own)
At the top of the page, the Heartbeat toggle decides whether the agent looks around on its own, even without you. Leave it on and the agent decides on its own when to check in next — less often when there’s nothing to do, more often when something’s pending. Rather than picking a fixed interval, it reads the situation each time and sets the next check-in point. Just below, “Next heartbeat: …” shows the next scheduled time.

Clicking the toggle saves immediately. If you only want the agent to move when you call it or when a scheduled task fires, turn the heartbeat off and use “Add Schedule” below to register specific times only.
Add Schedule (recurring or one-time)
For more precise timing, press Add Schedule. At the top of the form there’s a Repeat / Once switch, then a Name (optional) field, then the prompt box — both the name and the prompt are shared by both modes, so switching modes keeps whatever you’ve typed in either.
Why bother naming it: the title shown on schedule and run-history cards comes straight from this name (e.g. “Morning news briefing”). Leave it blank and the card falls back to a truncated preview of the prompt instead — fine for a one-off, but a long prompt makes for a long, hard-to-scan card title, so it’s worth naming anything you’ll reuse. You can change the name any time from the edit screen, up to 120 characters.
When you choose Repeat
- Set the repeat rule. Pick one of two shapes at the top:
- At a specific time — tap the days of the week you want (quick buttons for
DailyandWeekdays), then pick a single time. The agent runs once on each chosen day, at that time. Example:Weekdays+9:00 AM→ fires once every weekday morning at 9. - Every (interval) — pick one of
30 min·1 h·2 h·3 h·6 h·12 h, and it repeats at that interval around the clock, every day. (There’s no way to restrict this to specific days or hours from this screen — for that, ask the agent in chat, as noted below.) - Your account timezone is applied automatically and shown at the top of the box (e.g.
Asia/Seoul).
- At a specific time — tap the days of the week you want (quick buttons for
- Save. The new schedule appears in the list with the next scheduled run time. The prompt you typed above is sent to the agent verbatim at every scheduled run — this schedule always carries the fixed instruction you gave it.
When you choose Once
- Pick when it should run:
- Quick picks: tap
In 1 hour·Today 6 PM·Tomorrow 9 AM·Next Mondayto jump straight to that time. Any option that’s already in the past drops off the list automatically. - Or enter a date and time directly.
- You can schedule anywhere from 1 minute from now up to 1 year out. For anything further, use a repeating schedule and turn it off once you no longer need it.
- Once you pick a time, a confirmation preview shows up, e.g. “Runs once at Aug 12 (Wed), 9:00 AM · in about 7 days.”
- Quick picks: tap
- Save. It fires exactly once at the time you picked, then the schedule turns itself off. The run stays in your history.
Either way, saved schedules show up in the list with a Once / Repeat badge on the card so you can tell them apart at a glance. Once a one-time schedule fires, its badge changes to Done.
From the list you can:
- Toggle active/inactive — pause a recurring schedule without deleting it; it’s skipped until you re-enable it. A one-time schedule can be toggled too, as long as it hasn’t run yet — once it fires, it can’t be reactivated, so the toggle disappears.
- Edit — for a recurring schedule, change the instruction (prompt) and the repeat rule (days/time, or interval). For a one-time schedule, change the instruction and the scheduled time only (converting it to recurring isn’t supported); one that already ran can no longer be edited.
- Delete — remove it once you no longer need it.
- Show/hide inactive schedules — keep the list tidy when you’ve parked a few schedules.
A schedule left inactive for 90 days is permanently deleted from the server (the heartbeat toggle is the one exception — it’s always kept). If you plan to reuse it later, re-enable it or edit it within that window.
The iOS and Android apps offer the same schedule editor, so you can add and manage recurring and one-time schedules on the go.
Any repeat rule the UI’s “Add Schedule” can’t express — a precise minute-level time, or an interval that should only run during certain hours (e.g. “every 2 hours, but only 9 AM–6 PM on weekdays”) — ask the agent directly in chat instead, and it will register a more precise rule for you. One-time delayed runs can be registered from the UI directly, or by asking in chat.
Automation cadence suggestions
Even without a schedule already in place, your agent may notice on its own that a certain kind of request keeps coming back on a regular beat — for instance, seeing that the last few times you asked for something, it was always on a Monday morning, around the same hour. When it spots that, it will add one short question to the end of its reply, something like “Want me to just do this on that schedule from now on, without you having to ask?”
The key thing to understand: that question is only a suggestion — nothing gets created just by the agent asking it. The agent is only naming the day and time it actually observed. A recurring schedule only comes into existence after you clearly say yes in chat. Once you do, a new recurring schedule is created the same way as under “Set it up from the UI” above, and from then on it shows up in the Schedules list like any other — you can review, edit, or delete it there. If you decline or don’t respond, nothing happens, and the agent may ask again later if the same pattern shows up again.
This kind of suggestion won’t repeat if a schedule already covering that work exists, and it won’t appear for occasional, irregular requests that don’t form a clear pattern.
How an automatic run plays out
[Registered schedule]
│
│ Run time arrives
▼
Agent wakes up automatically
│
│ Picks tools and does the work
│ (only tools you've already enabled are available)
▼
Drops the result into chat
│
│ ┌──────────────────────────────┐
└▶│ Push notification fires │
│ Open the chat to read it │
└──────────────────────────────┘The result lands in your chat exactly like a normal message would. The message is tagged with which schedule woke the agent and what instruction it was given, so you can tell a scheduled answer apart from your own back-and-forth — even days later.
Where do I see the result?
- In chat: the answer arrives as a new message. A “Triggered by schedule” tag and the original instruction are shown alongside it.
- Push notification: if mobile / desktop notifications are on, you get a ping when the result lands. Tap it to jump straight to the chat.
- Schedules menu: each schedule card shows the total run count and next scheduled run. For the last run time, check the run history below.
- Run history: the agent’s Logs menu (
/agents/<agent>/logs) shows schedule run records (success/failure, timestamp). Note that the Logs view currently shows the run history of the first schedule in the list only. To review a specific schedule’s history in detail, open that schedule directly from the Schedules menu. - Schedule timeline in the Office and Team screens: at the bottom of the Office’s table view and card view, and at the bottom of the Schedules tab on each team’s detail screen, every visible agent gets its own row on a shared timeline. Centered on “now,” a filled dot marks a time in the last 24 hours when that agent actually ran, and a hollow ring marks its next scheduled run within the coming 24 hours — so you can scan when a whole group of agents has run and is about to run, in one glance. Click a row to expand that agent’s schedules right there and add or edit them.
Safety rails
Because scheduled runs spend SU while you’re away, several guardrails are in place:
| Guardrail | Behavior |
|---|---|
| Tool approval | Tools marked Approval Required (risky ones such as skill install or running code) are never auto-executed during a scheduled run — they wait for you |
| SU balance | If your SU run out, the next scheduled run is skipped |
| Daily autonomous budget | Separately from your SU balance, automatic runs that happen while you’re away (schedules, heartbeat, etc.) are capped per agent at 500 SU per day by default, measured as a rolling 24-hour total. Once that cap is hit, further automatic runs are skipped until the budget frees up, and you get a push notification the first time it happens. Even with plenty of SU left, a scheduled run can still be skipped for this reason |
| Unread-message cap | If unread messages from the agent pile up past the configured limit, further scheduled runs are skipped. Opening the chat and reading the messages resets the counter, and runs resume from the next slot |
| Repeated-failure alert | If the same schedule fails several times in a row, a push notification tells you to take a look |
| No double-runs | A single agent only runs once at any moment — overlapping or stuck schedules can never spin up two parallel executions |
| Active hours | If you’ve configured active hours, registering a schedule that fires outside that window isn’t blocked — it’s still created. The agent just gets told you won’t be alerted until those hours reopen, so it can check with you again or proceed as-is if you clearly asked for that specific time |
A scheduled run can only use tools you already enabled, and Approval Required tools stay frozen until you approve them in person. Your agent works inside the limits you set ahead of time.
Common patterns
Daily morning briefing
Get news / stock / inbox summaries at a fixed time each day. Wake up, open the chat, done.
Watch + alert only on change
“Check this page every hour and alert me only if the price moves.” Quiet by default, loud only when it matters.
Periodic cleanup
Run heavy weekly summaries or data cleanup early Sunday morning so they don’t fight with your weekday work.
One-off delayed run
“Come back in an hour and recheck this.” Ask in chat, or set it up yourself from “Add Schedule → Once” by picking a date and time. Once it runs, the schedule deactivates itself — it won’t fire again and you don’t have to clean it up.
Next steps
- Equipping Tools — pick the tools your agent will use while you’re away
- Skills & the Autonomous Skill System — package repeated work into a skill for more reliable automation
- Sharing an Agent (Snapshots) — how share links differ from your own scheduled runs
Advanced
You don’t need any of this for normal use. Skip unless you want fine timing control or are debugging odd behavior.
Schedule types
| Type | How to create | Description |
|---|---|---|
| Scheduled (Add Schedule → Repeat) | UI (Add Schedule) | Either “a specific day/time, once” or “a fixed interval, around the clock” — fires the saved prompt exactly (no self-adjustment) |
| One-time (Add Schedule → Once) | UI (Add Schedule) or agent schedule_create tool | Fires once at the chosen time, then deactivates itself. Set from the UI directly: 1 minute to 1 year out. Registered by the agent from chat: up to 7 days out |
| Recurring (cron) | Agent schedule_create tool only | UTC cron expression. Precise daily/weekly/hourly timing |
Heartbeat is separate from this table — it’s a single always-on schedule per agent, toggled at the top of the page, and it’s never created via “Add Schedule”.
The “Add Schedule” button in the UI supports both Repeat (fires a fixed prompt on a set day/time or interval) and Once (fires once at a time you pick) — both different from the self-pacing heartbeat. The UI’s repeat rule is limited to two shapes — “a day/time, once” or “a fixed interval, all day” — so anything more precise (minute-level timing, or an interval restricted to certain hours) requires asking the agent in chat, which registers it using its scheduling tool with a standard cron expression.
One-time vs recurring
A one-time run deactivates itself after it fires. A recurring run keeps going until you stop it — but whether it auto-expires depends on how it was created:
- A recurring schedule you asked the agent to set up directly in chat stays active indefinitely, with no expiration.
- A recurring schedule the agent registers on its own initiative (say, while checking in autonomously) auto-expires after 7 days by default, so forgotten schedules don’t keep firing forever.
- Either way, if you specify a lifetime yourself (“just keep this for two weeks”), that value wins, up to 90 days.
Picking a time (cron expressions)
Under the hood, when the agent registers a cron schedule it uses standard cron notation. Times are stored in UTC and shown in your local timezone.
| Expression | Meaning |
|---|---|
0 8 * * * | Daily at 08:00 UTC (= 17:00 KST) |
0 23 * * * | Daily at 23:00 UTC (= 08:00 KST next day — use this for a Korea-morning briefing) |
0 * * * * | Every hour on the hour |
0 9 * * 1-5 | Weekdays at 09:00 |
0 0 * * 0 | Every Sunday at midnight |
Asking in plain language (“run at 8 AM Korea time”) lets the agent handle the timezone conversion for you.
Concurrency protection
A single agent only ever has one execution line active.
- If schedule times overlap, or a previous run is still going when the next one’s time arrives, only one runs.
- If a run is in flight when the next slot comes due, the next slot is skipped or queued — never doubled.
- Even when multiple servers try to fire the same schedule at the same instant, the system ensures only one of them actually runs it.
- After a system restart, schedules that were “due” while the system was down are realigned forward to a fresh future time and resume cleanly.
So no, your agent can never accidentally fire the same task 60 times in an hour.
When many agents share the same cron expression (e.g. 0 * * * *) they could otherwise all fire at the same instant. To spread that load, every agent-registered recurring (cron) schedule automatically gets up to 180 seconds of random delay added to its start time. This is automatic — there is nothing to configure — and it does not apply to one-time delayed runs.
What the Office/Team timeline actually shows
The schedule timeline at the bottom of the Office and team screens only ever shows a 48-hour window centered on now: 24 hours back, 24 hours forward.
- Each filled dot is one run (turn) that actually started at that time. If the same agent runs several times close together, the dots overlap and read as density.
- An agent with too many dots (e.g. one that runs every minute) has its oldest dots dropped, and that fact is shown as a
⋯mark at the left edge of its row — it’s never silently trimmed. - A hollow ring is drawn once per active schedule, at its single nearest upcoming run. A next-run time that’s already in the past (not yet picked up, or pushed out by active hours) is never drawn as if it were still coming.
- If the next run is more than 24 hours out, the timeline only shows a
▸arrow at the right edge to say “something’s coming, just outside this window” — it never invents a position for it. - Heartbeat and sensor watches share the same axis, distinguished by color.
How “Adjust pace automatically” works
When the toggle is on, the agent recalculates the next check-in time every time a check finishes, based on two things:
- Anything already on the calendar — a delayed task waiting to run, or a new message/webhook that just came in — whichever comes soonest
- A minimum check-in cadence — by default, a full check-in is guaranteed at least once every 8 hours (up to 3 times a day)
The next check-in is set to whichever of those two comes first. If the agent decides there’s nothing worth checking right now, that only pushes the minimum-cadence floor later — it never pulls it earlier. The computed time is also always at least 15 minutes after the check that just finished. Active hours (your notification window) play no part in this calculation — the heartbeat keeps running on its own schedule outside those hours too; active hours only decide whether the result reaches you as an immediate push or waits until the window reopens.
When an automation cadence suggestion appears
- It’s judged from the agent’s own record of “I finished this kind of work” declarations, not from schedules you registered in chat. A pattern needs at least 3 occurrences of the same kind of work before the check even runs, and it only looks at the most recent 8.
- It only fires for work that already has a saved way of doing it (a workflow) you previously approved — if the approach varies each time, running it unattended would produce inconsistent results.
- It only fires when the completion times clearly line up on a daily, weekly, biweekly, or monthly beat. If the times are scattered or the interval is ambiguous, it stays quiet rather than guessing at a cadence.
- It won’t suggest again if an active schedule already covers that same kind of work.
- The suggestion isn’t a separate card like the one shown when you ask for a schedule directly — it’s one short sentence tacked onto the end of the agent’s normal reply, and your answer in that same chat decides whether anything gets created.
Limits and retention
| Item | Value |
|---|---|
| Active schedules an agent can create for itself (recurring + one-time combined, sensors excluded) | Max 5 |
| One-time delay range (set from the UI) | 1 minute – 1 year |
| One-time delay range (registered by the agent from chat) | 1 minute – 7 days |
| Auto-expire for recurring schedules the agent creates on its own (default) | 7 days — schedules you asked for directly in chat never expire. Set a lifetime yourself and it applies either way, up to 90 days |
| Consecutive-failure alert threshold (default) | 3 failures in a row (set to 0 to disable failure alerts) |
| Run history retention | The run record itself is kept up to 90 days — but its output/error text is cleared after 30 days, leaving only the timestamp and success/failure after that |
| Inactive schedule retention | 90 days, then permanently deleted (heartbeat exempted) |
Schedules you create yourself from the UI are not subject to the active-schedule cap, and they don’t auto-expire unless you set that yourself.