A schedule runs something for one tenant at the times you choose: a Logic Block, a Glyph, a connector action, a crew, or an automation. You set it up once and it runs on its own, in the background, in that tenant.
Schedules are included in the Starter and Pro plans. On the Free plan the Schedules tab shows an upgrade message and nothing can be created.
Where to create one
| Where | How |
|---|---|
| Console | Tenants → your tenant → Schedules. Pick what to run, when, and in which timezone. |
| Your app | GET/POST/PUT/DELETE /app/{orgCode}/schedules and GET/POST /app/{orgCode}/schedulerun, signed in as the tenant's user. The tenant always comes from the sign-in token. |
| AI assistant (MCP) | create_schedule, list_schedules, update_schedule, delete_schedule, run_schedule_now, list_schedule_runs. Each takes the tenantCode. |
What it can run
| Target | ref | Notes |
|---|---|---|
| Logic Block | the block's name | Runs in the background as the person who created the schedule. |
| Glyph | the Glyph id | Counts against your Glyph run limits like any other run. |
| Connector action | the connector id, plus action | Uses the connector as configured for the tenant, including the creator's personal credentials. |
| Crew | the crew's slug | The run is queued; open the crew's run to see its result. The crew must be active. |
| Automation | a custom event type | The schedule's input is published as that event, so any automation listening for it runs. |
The schedule's input is a fixed JSON object handed to the target as its request. A crew reads the text in its input field.
When it runs
| Frequency | Example |
|---|---|
| Once | { "kind": "once", "at": "2030-01-05T09:30" } — local time in the schedule's timezone, in the future |
| Every N minutes | { "kind": "every", "minutes": 30 } |
| Daily | { "kind": "daily", "time": "07:00" } |
| Weekly | { "kind": "weekly", "days": ["mon", "wed"], "time": "18:00" } |
| Monthly | { "kind": "monthly", "day": 15, "time": "06:00" } — day 31 means the last day of the month |
| Cron | { "kind": "cron", "expression": "0 9 ? * MON-FRI *" } — six-field cron |
Every schedule has an IANA timezone such as America/New_York; daylight saving is handled for you. You can also set a startDate and endDate.
Limits by plan
| Plan | Schedules per tenant | Shortest interval |
|---|---|---|
| Free | none | — |
| Starter | 10 | every 15 minutes |
| Pro | 100 | every minute |
A one-off schedule that has already run no longer counts toward the limit. Each run also counts as one API call toward your plan's API limits.
What happens on each run
- Every target runs as the person who created the schedule, in the schedule's tenant. A Logic Block or Glyph sees the tenant's feature flags as they apply to that person, and a Glyph receives that person as
ctx.user. A connector action looks up that person's email and name for any field that takes the caller's identity. - If the previous run is still going, the new one is skipped (the default
overlap: "skip"); setoverlaptoallowto run anyway. - A paused schedule, a run outside the start/end dates, and an org over its daily limit are skipped too, and each skip is recorded with its reason.
- After 5 failed runs in a row the schedule pauses itself. Fix the cause, then resume it to clear the count. If the thing it runs has been deleted, it pauses immediately.
- A one-off schedule is marked completed after its single run.
Pause, resume, run now
Set state to paused to stop a schedule without deleting it, and back to active to resume. Run now fires an active schedule once, right away, exactly like its timetable would.
Run history
Every run, including skipped ones, is recorded in the communication audit. The schedule's run history lists each run's time, status (success, error, skipped) and a message — the failure, or why it was skipped.
Who may manage schedules
Schedules follow your normal access policies: creating needs createschedules, editing and pausing updateschedules, deleting deleteschedules, and reading getschedules. Add a Deny on createschedules to keep a group from scheduling.