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

WhereHow
ConsoleTenants → your tenant → Schedules. Pick what to run, when, and in which timezone.
Your appGET/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

TargetrefNotes
Logic Blockthe block's nameRuns in the background as the person who created the schedule.
Glyphthe Glyph idCounts against your Glyph run limits like any other run.
Connector actionthe connector id, plus actionUses the connector as configured for the tenant, including the creator's personal credentials.
Crewthe crew's slugThe run is queued; open the crew's run to see its result. The crew must be active.
Automationa custom event typeThe 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

FrequencyExample
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

PlanSchedules per tenantShortest interval
Freenone—
Starter10every 15 minutes
Pro100every 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"); set overlap to allow to 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.