Repeats: asks that run on a schedule
Last updated October 8, 2026
On this page
A repeat is an ask you set to run again on a schedule: "every Monday at 09:00, ask the SEO Analyst and the Analytics Analyst to review the last 28 days, and combine their answers". It belongs to you. Each time it runs, it is your ask, posted by you in the same thread, with the same agents and the same choices, and every check an ask passes is made again at that moment.
This page covers making a repeat, what happens when it runs, what pauses or skips it, and Work › Repeats. Asking several agents at once is in Asking several agents together.
The page describes the golive branch. What is not possible yet is listed
at the end.
Before you start#
The examples use the demo company from the quickstart: sam (the sales lead) makes repeats and ada (the admin) sets the company's time zone. Without a model key the stub planner answers each run with its "No model is configured" note; the schedule, the runs and the pauses work the same.
Repeats are read in the company's time zone. Set it first (Ada, on Setup › Time zone; see Setting up a company); until then every time is UTC.
Making a repeat#
Open the repeat sheet from any of these:
| From | What it starts with |
|---|---|
| Repeat this… in the message box's + menu | Your draft: its text and agents |
| Repeat this… in the menu of one of your own ask messages | That ask: its text, agents, way and dates |
| Repeat… under an ask to several agents | That ask |
| Work › Repeats › New repeat | Nothing; Post in first, and Start from a suggestion |
| Set up for me on an app's Automation tab | The app's suggested repeat, in a new conversation of yours |
Nothing runs until you press Save repeat.
Try it: the Marketing weekly review#
The Marketing app suggests one repeat, the Marketing weekly review: every Monday at 09:00, SEO Analyst and Analytics Analyst review the last 28 days against the 28 before, and the Marketing Lead combines their answers into one review with three things to do this week.
- As ada, open Setup. Under Time zone choose Change, type
Asia/Kolkataand choose Use. The note reads "Times now read in Asia/Kolkata: repeats and app schedules run at its local times". - As sam, open Work › Repeats. Mine says "Nothing repeats yet. Ask in a conversation, then choose Repeat this."
- Choose New repeat. Under Start from a suggestion pick Marketing weekly review. The sheet fills in: Post in "A new conversation", the name, the ask, both agents, Combined "combined by Marketing Lead", Every week on Monday at 09:00, and under it "Mondays at 09:00 IST. Next: Mon 12 Oct, 09:00 · Mon 19 Oct, 09:00 · …".
- Leave the rest and choose Save repeat. The row reads Marketing weekly review, "SEO Analyst and Analytics Analyst, combined by Marketing Lead", "Mondays at 09:00 IST", the next Monday, "Not run yet" and Active.
- In the row's menu choose Run now: "Marketing weekly review is running now". Open the conversation: your ask is posted as yours with the line "Repeat · Marketing weekly review · Mondays at 09:00 IST · by Sam Ortiz", followed by the ask's card.
The sheet#
| Field | What it does |
|---|---|
| Post in | Only from Work › Repeats: one of your threads, or A new conversation ("A conversation named after the repeat, yours, with its agents. Nothing runs until the first time comes."). A repeat in a one-to-one conversation asks its one agent. |
| Name | What the repeat is called everywhere; filled from the ask's first words |
| Ask | The text posted at each run |
| Agents | One to six agents, and with two or more how they answer: Combined (with combined by), Each answers, or One leads (with led by: each run asks the lead, which may ask the others) |
| When | Every day, Weekdays, Every week (pick the days), Every month (a day from 1 to 31, Last day, or the first, second, third, fourth or last of a weekday), Every few hours (1 to 24), or under Advanced a schedule typed in the grammar below; a time; and the zone ("Asia/Kolkata, the company's", Change for the repeat's own). Under it the next five times ("Checking…" while they load). |
| Period | When the ask names dates (below) |
| If an agent needs to ask | Ask me, the thread's owner or each agent's team lead; wait (no time limit, 30 minutes to 1 day, nights and weekends included); then go on with its best guess, keep waiting or stop that agent. A new repeat starts with: you, 2 hours, then its best guess. |
| If a run is missed | Run once when the server is back (the default) or Skip it |
| If an agent wants to change something using what other agents found | Wait for my OK (the default) or Skip it and tell me (below) |
| Spending | Up to, a run (required; the company's default filled in; at most the ceiling an admin sets) and Up to, a month (optional), in the company's currency |
Save repeat stays greyed out until it has where to post, a name, an ask, an agent and an amount a run may spend; the line beside it says what is missing. A repeat made from an ask with files says "Files attached to the ask are not attached again."
Dates in a repeat#
A repeat keeps the words of its ask, not the dates: "the last 28 days" is read again at each scheduled time, so each Monday's run covers the 28 days before that Monday. The sheet shows the next run's window: "Mon 12 Oct will cover 14 Sep–11 Oct".
- When you changed the dates of the ask you are repeating ("review the last one month", changed to 1–30 Sep), the sheet asks: "This ask used 1–30 Sep. Each run should cover: [last one month] [these same dates]".
- When the ask names fixed dates ("1 Sep to 30 Sep"), every run covers those dates, and the sheet says so.
- A run that is late (the server was down) still covers the window of the time it was scheduled for, not the moment it ran.
How each phrase reads is in The dates the ask covers.
Schedules#
| Form | Meaning |
|---|---|
daily@09:00, weekdays@09:00, weekends@10:00 |
Every day; Monday to Friday; Saturday and Sunday |
mon@09:00, mon,thu@17:30 |
Those days (mon tue wed thu fri sat sun) |
monthly:1@09:00 |
Day 1 of each month; a day a month lacks (the 31st) runs on its last day |
monthly:last@09:00 |
The last day of each month |
monthly:first-mon@09:00 |
The first Monday of each month (first, second, third, fourth, last) |
every:2h, every:1d, hourly |
At a fixed interval |
weekly@mon 09:00, monthly@1 09:00 |
Accepted, and stored as mon@09:00 and monthly:1@09:00 |
A repeat runs at most once an hour ("A repeat runs at most once an hour"). A schedule that does not read is refused with the list of forms. A local time a clock change skips runs at the first minute after it; an hour that repeats runs once. Times show in the repeat's zone and, when yours differs, in yours as well ("Mon 12 Oct, 09:00 IST (05:30 your time)").
When it runs#
At each scheduled time the server checks everything an ask checks, as you, at that moment, then posts your ask in the thread and runs it exactly as if you had sent it: the same agents, the same way, the same rule for questions, a time limit of 4 hours, and the per-run spending limit. Each run is in your inbox and in the thread like any of your asks.
| At the time | The run |
|---|---|
| The previous run is still open | Skipped: "Skipped: last Monday's is still running" |
| One agent can no longer be asked (you lost the right, it was paused or offboarded, the thread's owner took it out) | Goes on without it, and says so on the repeat line ("Analytics Analyst was left out: …"); the repeat shows Needs attention |
| The combiner, every agent, you or the thread cannot go on | Skipped, with the reason |
| Someone who may not read what the agents read has joined the thread since you saved it | "Skipped until you confirm: …", and Needs attention with Confirm |
| The repeat's monthly limit, or the company's monthly cap for all repeats, is reached | Skipped until the month turns: "Skipped: this repeat's limit for October is reached"; you are told once |
| The server was not running at the time | With Run once when the server is back: one run when it starts, however many times were missed, its line reading "Ran at 11:04 instead of 09:00: the server was not running". With Skip it: a Missed row and no run. |
When an agent wants to change something#
A run that carries what other agents found (a combine, an agent reading another's answer) is in review mode: it reads and answers freely, but a step that would change something (save a record, use a tool that writes, hand work on) is held, since nobody is watching. With Wait for my OK (the default) you get an approval in your inbox, "Weekly pricing draft wants to write to Content items · decide by 13:00": the time is when the run's 4-hour limit ends. Only you may approve it. Undecided by then, it is withdrawn and the answer says the step was not done. With Skip it and tell me the step is refused at once and the answer says so. The Marketing weekly review writes nothing, so it never asks.
Work › Repeats#
Work gains a Repeats tab, with three filters: Mine, In my threads and, for admins, All. Each row shows:
| Column | What it shows |
|---|---|
| Name | The repeat and a link to its thread |
| Agents | "SEO Analyst and Analytics Analyst, combined by Marketing Lead" |
| When | "Mondays at 09:00 IST" |
| Next | The next time, or nothing while paused |
| Last | How the last run went ("Ran", "Ran late", "Skipped", "Missed"), when and what it cost; "Not run yet" |
| State | Active, Paused with why, or Needs attention with what |
Each row's menu:
| Item | Who | What it does |
|---|---|---|
| Run now | The owner, admins | Runs it at once; the next time stays as it is. Offered only when it would run: not while the last run is still open or the repeat is paused by someone else. By anyone but the owner it pauses the repeat instead ("Run now by anyone else pauses it instead of running it, so nothing is posted as theirs"), and the owner is told. |
| Pause, Resume | The owner, the thread's owner, admins | See Pauses |
| Edit | The owner, admins | The sheet again; a change applies from the next run. Saved by anyone but the owner, it pauses the repeat ("Edited by Ada Park") until the owner resumes it. Two people editing at once: "Someone changed this repeat while you edited · Reload", with your fields kept. |
| Runs | Whoever sees the row | The repeat's runs: date, outcome, cost and a link to the ask. "No runs yet." until the first. |
| Give to… | Admins | Gives the repeat to another person; it stays paused until they resume it, and runs as their ask |
| Delete | The owner, admins | "No more runs. What its runs posted stays in the conversation.", with "Also stop the run in progress, if there is one" |
Needs attention carries what to do: "Pat Kim joined Pipeline review; Pat Kim may not read Contacts and Leads, which Sales Assistant reads" with Confirm (offered when Ask anyway would be; see Who else sees the answers); "Analytics Analyst was left out: you can no longer ask it" with Remove from repeat; a model gap with Fix this or Ask an admin (see When no model may take the data).
A thread's details panel lists that thread's repeats too, under Repeats, with their next times and the same menu.
You may have 20 active repeats (an admin sets the number). At the limit the sheet says "You have 20 active repeats. Pause or delete one to add another" and Save repeat is greyed out.
Pauses#
A paused repeat keeps its schedule. Resume takes the next time after now and does not catch up on what it missed.
Who may lift a pause depends on who made it: your own pause, you; a pause by the thread's owner or an admin, only the thread's owner or an admin; a pause the system made, you, once its cause is gone.
| A repeat pauses when | It reads |
|---|---|
| You pause it | "Paused by its owner" |
| The thread's owner or an admin pauses it | "Paused by Pat Kim" |
| Someone other than you edits it or presses Run now | "Edited by Ada Park" |
| You are deactivated or offboarded | "Owner deactivated"; the thread's owner and admins are told, and an admin may give it to someone else |
| You are taken out of the thread, or the thread is closed | "Paused: Pat Kim took Sam Ortiz out of Marketing", "Paused: Pat Kim closed Marketing"; a run under way is stopped |
| An admin ends the session, or revokes the token, that made or last changed it | "Paused: the session that made it was ended" |
| Three runs in a row are skipped or fail (a model gap counts) | "Paused: each run since 6 Oct was skipped because …", or "Paused after 3 runs in a row did not go through" |
| The company is restored from a backup, or copied from one | "Paused after a restore (…)": a backup restored on Tuesday never sends Monday's run again |
| An admin turns repeats off | "Turned off by an admin"; turned on again, every repeat stays paused until its owner resumes it |
Each of these lands in your inbox ("Your repeat Marketing weekly review is paused: …").
Settings#
On Setup (admins):
- Time zone: the company's zone, a searchable list with your browser's
suggested. Every repeat without a zone of its own and every app
schedule (an app's
weekdays@07:00trigger) runs at local times in it, and dates such as "last week" are read in it. Changing it recomputes the next time of every repeat; a local time already run is never run twice. - Repeats: People may set asks to repeat (off pauses every repeat and hides Repeat this: "An admin turned repeats off"), Active repeats a person, at most (1 to 100, default 20), An ask may spend, by default (the per-run amount the sheet fills in), A person may raise it to, and All repeats together, a month (at that cap every repeat skips until the month turns, and admins are told once).
An app's schedules and suggested repeats show on its Automation tab, with the next time of each trigger in the company's zone (see Apps).
Not possible yet#
- A repeat that starts a new thread each time, or one owned by a team.
- A person's own time zone: times are the company's (or the repeat's own), with yours shown beside them.
- A week starting on Sunday in date phrases.
- Approvals with a time of their own beyond the run's limit, and reminders.
- Attaching files to a repeat.
For developers#
API#
All under /api, with Authorization: Bearer <token>.
| Method and path | Body | Notes |
|---|---|---|
POST /threads/:id/repeats |
{ title, text, agents, mode?, combiner?, lead?, answers_questions?, rule?, wait_minutes?, schedule, time_zone?, catch_up?, on_change?, period_mode?, limit_per_run_cents, limit_per_month_cents?, confirm_audience? }, or { from_message, schedule, limit_per_run_cents, … } to copy your own ask |
Anyone who may post in the thread and ask the agents. mode: combined, each or lead (with lead, default the first agent; a lead that cannot lead is 422). catch_up: once or skip; on_change: wait or skip; period_mode: phrase (read again each run) or fixed. from_message of someone else's message: 403. |
POST /repeats |
The same, with thread or new_thread: true |
From Work › Repeats |
GET /repeats?scope=mine|threads|thread:<id>|all |
Repeats; all for admins |
|
GET /repeats/suggestions |
The installed apps' suggested repeats, each with may_set_up and, when you may not ask every agent, who can |
|
GET /repeats/:id, GET /repeats/:id/runs?cursor= |
One repeat; its runs (the last 100 are kept) | |
PATCH /repeats/:id |
Any field above, with version |
409 version_conflict; by an admin who is not the owner it also pauses the repeat. null clears time_zone and limit_per_month_cents. |
POST /repeats/:id/pause, POST /repeats/:id/resume, POST /repeats/:id/run-now |
Pause: the owner, the thread's owner, admins. Resume: 403 when the pause is not one the caller may lift. Run now: the owner, admins; 409 repeats_off, paused, still_running |
|
POST /repeats/:id/give |
{ to } |
Admins |
DELETE /repeats/:id |
The owner, admins | |
GET /schedules/preview?schedule=&time_zone= |
{ canonical, words, next }: monthly:first-mon@09:00 reads "On the first Monday of each month at 09:00" with the next five times; 422 with the forms |
|
GET /settings/asks, PUT /settings/asks |
{ repeats, max_repeats_per_person, default_group_limit_cents, max_group_limit_cents, repeats_month_cap_cents, max_period_days, ask_anyway_max_class, coordinator_classes } |
Admins change it; anyone signed in reads the limits a sheet needs |
PUT /company |
{ time_zone } |
An IANA name; 422 for one the server does not know (""Mars/Base" is not a time zone (an IANA name such as Asia/Kolkata or Europe/London)") |
A repeat (RepeatView), shortened:
{ "id": "…", "thread": "…", "owner": "sam", "title": "Weekly check",
"text": "review the last 28 days", "agents": ["seo-analyst", "analytics-analyst"],
"mode": "combined", "combiner": null,
"rule": { "ask": ["asker"], "answer_within_minutes": 120, "then": "assume" },
"schedule": "mon@09:00", "words": "Mondays at 09:00", "time_zone": null, "zone": "Asia/Kolkata",
"catch_up": "once", "on_change": "wait", "period_mode": "phrase",
"limit_per_run_cents": 500, "limit_per_month_cents": null, "month_spent_cents": 0,
"state": "active", "paused_reason": null, "attention": [],
"next_at": "2026-10-12T03:30:00Z",
"next_period": { "from": "2026-09-14", "to": "2026-10-11", "words": "14 Sep to 11 Oct 2026" },
"last": null, "version": 1,
"may": { "edit": true, "pause": true, "resume": false, "delete": true, "run_now": true, "give": false } }
Errors: 422 invalid (the schedule, more often than hourly, the agents, no
per-run limit: "Set a spending limit for each run (limit_per_run_cents)"),
too_many_repeats, repeats_off; 403 denied; 409 audience,
version_conflict, still_running, one_to_one.
Events#
| Event | When |
|---|---|
repeat_changed |
Created, edited, paused, resumed, deleted or given: change, by, reason, session |
repeat_fired |
A run was posted: scheduled_for, late, group or task |
repeat_skipped |
A time was skipped or missed: scheduled_for, reason |
company_time_zone_changed |
from, to, by |
CLI#
With the server stopped:
ok --state orchkernel-demo/state.db --as sam repeats # your repeats; `repeats list --all` for every one (admins)
ok --state orchkernel-demo/state.db --as sam repeats pause <id>
ok --state orchkernel-demo/state.db --as sam repeats resume <id>
ok --state orchkernel-demo/state.db --as sam repeats run <id> # Run now
ok --state orchkernel-demo/state.db --as sam repeats delete <id> [--stop]
ok tick runs whatever repeats are due, as the server's clock does every 30
seconds.