Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions docs/guide/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ hand; `syncedAt` and `error` describe the last sync.
The same object plus:

- `participants`: `userName`, `displayName`, `mandatory`, `timezone`,
`onVacation`, `workingDays` (their own week, or `null` to follow the
standup), `otherStandups` (how many other standups they're on) and `source`
`onVacation`, `workingDays` (their own days on this standup, or `null` to
follow its days), `otherStandups` (how many other standups they're on) and `source`
(`manual` or `group`);
- `admins`;
- `keptOff`: group members taken off by hand, whom syncs keep off;
Expand Down Expand Up @@ -169,14 +169,14 @@ Moods are withheld per person when the standup keeps them anonymous; only the te

### Team

`GET /people` — needs `people.view`. Everyone on a roster of a standup where the caller has it, with `email` (when known), `timezone`, `onVacation`, `workingDays` / `workingDaysLabel` and their `standups` (`mandatory`, `admin`).
`GET /people` — needs `people.view`. Everyone on a roster of a standup where the caller has it, with `email` (when known), `timezone`, `onVacation`, `workingDays` / `workingDaysLabel` (*Varies by standup* when their days differ) and their `standups` (`mandatory`, `admin`).

Schedules of others need `schedules.manage` on a standup the person is on:

| Method | Path | Notes |
| --- | --- | --- |
| `GET` | `/people/:userName/schedule` | Same shape as `/me/schedule` |
| `PATCH` | `/people/:userName/schedule` | `{ workingDays }` — the person is DM'd |
| `GET` | `/people/:userName/schedule` | Same shape as `/me/schedule`; `standups` lists only the standups the caller manages |
| `PATCH` | `/people/:userName/schedule` | `{ workingDays, standupId }` — needs `schedules.manage` on that standup; the person is DM'd |
| `POST` | `/people/:userName/overrides` | Same body as `/me/overrides`; managers may set past dates and are never subject to the policy — the person is DM'd |
| `DELETE` | `/people/:userName/overrides/:date` | Withdraw |
| `GET` | `/requests` | Pending time-off requests: all of them with `schedules.manage` across the workspace, otherwise those of people on standups where the caller has it |
Expand All @@ -189,8 +189,8 @@ Schedules of others need `schedules.manage` on a standup the person is on:
| `GET` | `/me/standups` | `linked: false` until the account has a Chat identity; otherwise `timezone` (own override or `null`), `chat.dmUrl` (deep link to the bot's DM once one exists) and each standup with `today` = `submitted`, `waiting`, `closed` or `null` plus `progress` (`{ submitted, expected }` while a run exists) |
| `GET` | `/me/submissions?limit=10` | My recent answers, with my own `moodComment` |
| `PATCH` | `/me` | `{ timezone?: string \| null, onVacation?: boolean }`; `409 not_linked` without a Chat identity |
| `GET` | `/me/schedule` | My personal week (`workingDays`, `workingDaysLabel`), the `policies` of my standups and upcoming `overrides` (each with `status`, `setBy`, `channel`, `decidedBy`) |
| `PATCH` | `/me/schedule` | `{ workingDays: "mon-thu" \| "adhoc" \| "reset" }` — the same words the DM `days` command takes; `400 invalid` otherwise |
| `GET` | `/me/schedule` | My days on each standup (`standups`: `standupId`, `name`, the standup's `days`, my `workingDays` and `workingDaysLabel`, `timeOffPolicy`), the `policies` of my standups and upcoming `overrides` (each with `status`, `setBy`, `channel`, `decidedBy`). The top-level `workingDays` and `workingDaysLabel` are deprecated |
| `PATCH` | `/me/schedule` | `{ workingDays: "mon-thu" \| "adhoc" \| "reset", standupId }` — the same words the DM `days` command takes, for one standup; `400 invalid` otherwise. Without `standupId` every standup changes; that form is deprecated |
| `POST` | `/me/overrides` | `{ date }`, `{ dates: [] }` or `{ from, to }` (ISO, ≤ 31 days), `working?: boolean`, `reason?` — a day off or an extra working day; `403 refused` when the standup's time-off policy says so, with the reason |
| `DELETE` | `/me/overrides/:date` | Withdraw an entry |
| `POST` | `/me/skip` | `{ standupId, reason }` — skip today's run with a one-line reason (up to 150 characters), posted in the day's thread; `400 invalid` on `reason` when it is missing or too long, `409 no_open_run` before it opens or after it closes, `409 already_submitted` once answered |
Expand Down
4 changes: 2 additions & 2 deletions docs/guide/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ space. `status` without a `#id` prefix reports every standup in the space.
| `mandatory @user…` / `optional @user…` | Count toward the wrap-up report, or not |
| `vacation @user…` / `back @user…` | Mark people away — no prompts, not counted as missing |
| `off @user <date\|range> [reason]` / `working @user <date>` | Mark someone away or working on given days; `off @user cancel <date>` undoes ([Personal schedules](./schedules)) |
| `days @user mon-thu\|adhoc\|reset` | Someone's personal week |
| `days @user mon-thu\|adhoc\|reset` | Someone's days on this standup |
| `admin @user…` / `unadmin @user…` | Manage the standup's admins, who are its Managers |
| `role @user <role>` / `role @user remove <role>` | Grant or revoke a role on this standup, say `Viewer` for a stakeholder. Roles follow email, so `role pat@example.com Viewer` works for someone not yet in Chat. You can only grant a role whose permissions you hold here |
| `roles` | Who holds a role on this standup, and the roles you can grant |
Expand Down Expand Up @@ -100,7 +100,7 @@ Anyone can DM the bot directly:
| `vacation` (or `ooo`) | Pause prompts for yourself across all your standups |
| `off <date\|range> [reason]` / `working <date>` | A day off (e.g. `off tomorrow comp off`) or an extra working day |
| `off list` / `off cancel <date>` | Upcoming entries / withdraw one |
| `days mon-thu\|adhoc\|reset` | Your own week ([Personal schedules](./schedules)) |
| `days [#standup] mon-thu\|adhoc\|reset` | Your days on one standup; on several, the bot asks which and gives the number ([Personal schedules](./schedules)) |
| `back` | Resume prompts |
| `unskip` | Take back today's skip while the run is open — or press **↩️ Undo skip** on the prompt card |
| `timezone <IANA>` | Get prompts at the standup's prompt time in *your* timezone (all your standups) |
Expand Down
2 changes: 1 addition & 1 deletion docs/guide/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ Zapier/n8n, or your own service:
| --- | --- | --- |
| `submission` | Every submission and edit | `standup`, `date`, `user`, `answers`, `mood`, `late`, `edited`, `editApprovedBy` (who approved an edit after the deadline, otherwise `null`). Mood comments are never sent |
| `wrap_up` | The run closes | `standup`, `date`, `summary` (the posted wrap-up's numbers, plus `teamMood` on anonymous standups) |
| `schedule_change` | Someone's week or days off change | person, summary, who, channel — see [Personal schedules](./schedules#integrations) |
| `schedule_change` | Someone's days on the standup, or their days off, change | person, summary, who, channel — see [Personal schedules](./schedules#integrations) |
| `time_off_request` | A request needs approval | person, dates, working, reason, request ids |
| `test` | **Send test** in the standup's settings | `standup` |

Expand Down
2 changes: 1 addition & 1 deletion docs/guide/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Pick only the scopes the assistant needs:
| `read` | `get_me`, `list_standups`, `get_standup`, `get_my_standups`, `list_runs`, `get_run`, `list_blockers`, `get_team`, `get_insights`, `get_schedule`, `list_time_off_requests` |
| `blockers:write` | `acknowledge_blocker`, `update_blocker`, `resolve_blocker` |
| `submit` | `submit_answers` (every answer required, and the mood when the standup asks for one; `moodComment` is optional), `skip_today` (takes a one-line `reason`, posted in the day's thread) |
| `schedule` | `update_my_settings` (timezone, vacation), `set_working_days`, `set_days_off`, `cancel_day_off`, `decide_time_off_request` |
| `schedule` | `update_my_settings` (timezone, vacation), `set_working_days` (with `standupId`), `set_days_off`, `cancel_day_off`, `decide_time_off_request` |
| `manage` | `run_standup_now`, `nudge_standup` — only on standups you manage |

The token is shown once. Copy it before closing the panel.
Expand Down
2 changes: 1 addition & 1 deletion docs/guide/roles.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Built-in roles can't be changed. Copy one to start a custom role.
| `standups.configure` | Change the schedule, questions, mood, escalation and webhook; run now, nudge, close polls | ✓ | ✓ | | |
| `standups.archive` | Archive a standup and bring it back | ✓ | ✓ | | |
| `people.manage` | Add and remove people, mark them required, make managers, grant roles on the standup | ✓ | ✓ | | |
| `schedules.manage` | Change people's weeks and days off, decide time-off requests | ✓ | ✓ | | |
| `schedules.manage` | Change people's days and days off on the standup, decide time-off requests | ✓ | ✓ | | |
| `blockers.manage` | Resolve anyone's blocker | ✓ | ✓ | | |
| `standups.create` | Create standups | ✓ | | | |
| `standups.delete` | Delete an archived standup with its history | ✓ | | | |
Expand Down
59 changes: 39 additions & 20 deletions docs/guide/schedules.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,37 @@ on days they don't work — and from being counted as missing.

## Two building blocks

**A personal week** overrides the standup's days for one person:
**A person's days** on a standup. The standup's own days are the default,
and anyone can be given different days, including days the standup doesn't
run for everyone else. Days belong to one standup: someone on two standups
can work Monday to Friday on one and Wednesday to Sunday on the other.

| Setting | Meaning |
| --- | --- |
| Follow the standup (default) | Expected on every day the standup runs |
| Custom week, e.g. `mon-thu` | Expected only on those weekdays |
| Follow the standup (default) | Expected on the standup's days, and on any it adds later |
| Custom days, e.g. `mon-thu` or `wed-sun` | Expected only on those days, whichever they are |
| Ad hoc | No fixed days — expected only on dates marked *working* |

New people, whether they join a group roster or are added by hand, follow
the standup's days.

**Dated overrides** mark single days or ranges as *off* or *working*, with a
short reason. Comp-off after a weekend shift is an *off* override on the
weekday; an ad hoc person marks their *working* days. Both can be set ahead.

When a run opens, someone is expected only if the date is a working day for
them and not overridden off. Everyone else starts the run as **away** with a
reason — day off, not a working day, vacation, or calendar out-of-office — gets
no prompt, is not counted as missing, and shows under *Away* on the overview
and in reports. A standup still only runs on its own days, so a Saturday
worker is not prompted on Saturday unless the standup itself includes Saturday.
them and not overridden off. On the standup's own days, everyone else starts
the run as **away** with a reason — day off, not a working day, vacation, or
calendar out-of-office — gets no prompt, is not counted as missing, and shows
under *Away* on the overview and in reports.

On any other day, the standup runs only if someone on it works that day: their
own days include it, or they marked it *working*. That run, at the usual
times, is just for them. Nobody else is prompted, listed as away or counted.
The weekly digest still posts after the standup's last day, so answers from a
Saturday or Sunday after it show in that week's Insights rather than in the
digest already posted. Days off and *working* days are per person, so a
*working* Saturday opens a Saturday run on every standup they are on.

## From Chat

Expand All @@ -37,7 +50,7 @@ DM the bot:
| `working sat` | An extra working day (ad hoc people use this for every day they work) |
| `off list` | What's coming up, with each entry's status |
| `off cancel <date>` | Withdraw an entry |
| `days mon-thu` · `days adhoc` · `days reset` | Your own week, or back to the standup's |
| `days mon-thu` · `days adhoc` · `days reset` | Your days on your standup, or back to its days. On several standups, the bot asks which and replies with the command for each, such as `days #12 mon-thu` |

Dates read naturally: `today`, `tomorrow`, a weekday name (the next one), `19 sep`,
`sep 19`, `2026-09-19`. A date without a year means the coming one unless it is
Expand All @@ -50,7 +63,7 @@ Managers, in the team space with an @mention of someone on that standup:
| --- | --- |
| `off @Asha tomorrow dentist` / `working @Asha sat` | Mark someone away or working |
| `off @Asha cancel <date>` | Undo it |
| `days @Asha tue-sat` | Someone's personal week (`days mon,tue` without a mention still sets the standup's days) |
| `days @Asha tue-sat` | Someone's days on this standup only (`days mon,tue` without a mention still sets the standup's days) |

The person is DM'd every time a manager changes their schedule, with the
one-word reply that undoes it.
Expand All @@ -61,13 +74,17 @@ one-word reply that undoes it.
space, or everyone in the Google Group it follows
([group rosters](./directory#rosters-that-follow-a-google-group)). Per
person, tick whether they are on the standup, whether they are required, and
which of the standup's days they work. Days the standup doesn't run are
greyed out. The create form uses the same grid, with everyone in the space
ticked to start with.
- **Team → Edit schedule** on any person: the week, the overrides list with
who set each one, an add row, and *Mark away today*.
- **My page → My schedule**: the same controls for yourself, plus *Off today*
and *Off tomorrow*.
which days they work on it. The standup's days are marked *default*; any
other day can be ticked too. Each row says *Default* or *Custom*, with
*Reset to default*, and each tick saves straight away and shows *Saved*.
Ticking exactly the standup's days puts the person back on the default. The
create form uses the same grid, with everyone in the space ticked to start
with.
- **Team → Edit schedule** on any person: their days on each standup you
manage, the overrides list with who set each one, an add row, and *Mark
away today*.
- **My page → My schedule**: your days on each standup, the same controls,
plus *Off today* and *Off tomorrow*.
- **Standup → Overview**: the *Away* group under today's run, with reason chips.
- **Standup → Settings → Time off**: the policy below.

Expand All @@ -77,9 +94,10 @@ One setting per standup, under *Settings › Schedule*. A manager is an admin of
a standup the person is on; managers and workspace admins can mark that person
away or working in every mode.

A person changing their own schedule is bound by the policy of every standup
A person changing their own days off is bound by the policy of every standup
they are on and don't administer. Someone who runs one team and sits on
another still needs the other team's approval.
another still needs the other team's approval. Days belong to one standup, so
changing them is bound by that standup's policy only.

| Policy | A person marking themselves | Managers hear about it |
| --- | --- | --- |
Expand All @@ -95,7 +113,7 @@ person counts as expected for that run and is told so.

| A person under *Needs approval* or *Managers only* | Allowed? |
| --- | --- |
| Changing their personal week | No — there is no request for a week, so managers set it |
| Changing their days on that standup | No — there is no request for days, so its managers set them |
| Asking again for a day that is already approved | Yes — only the reason changes |
| Asking for the opposite of an approved day | No — ask a manager |
| Withdrawing a pending request, or giving back a day off | Yes |
Expand Down Expand Up @@ -140,6 +158,7 @@ statuses on Business and Enterprise editions.

Webhooks receive two more events: `schedule_change` (person, summary, who,
channel) and `time_off_request` (person, dates, working, reason, request ids).
A change to someone's days goes to that standup's webhook and digest only.
The JSON API exposes the same controls under `/me/schedule`, `/me/overrides`,
`/people/:userName/schedule`, `/people/:userName/overrides` and `/requests`
— see [JSON API](./api). MCP tokens with the `schedule` scope get
Expand Down
4 changes: 2 additions & 2 deletions docs/guide/user-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ blocker is tagged or has updates, only an explicit resolve closes it.
| `timezone` / `timezone reset` | Show / clear your personal timezone |
| `off tomorrow comp off` / `off 22 sep to 24 sep sick` / `working sat` | A day (or range) off, or an extra working day — see [Personal schedules](./schedules) |
| `off list` / `off cancel <date>` | What's coming up / withdraw an entry |
| `days mon-thu` / `days adhoc` / `days reset` | Your own week, or back to the standup's |
| `days mon-thu` / `days adhoc` / `days reset` | Your days on your standup, or back to its days. On several standups, the bot asks which, for example `days #12 mon-thu` |

## Your own page — `/app/me`

Expand All @@ -77,7 +77,7 @@ SSO**. You get:
- today's standups with an **Answer in Chat** link and **Skip today** (it asks
for the one-line reason too);
- your recent answers;
- your timezone, vacation mode and **My schedule** (your week and days off).
- your timezone, vacation mode and **My schedule** (your days on each standup, and days off).

If your account isn't linked to Chat yet, it links the first time you use the
bot, or straight away when your admins have set up the
Expand Down
4 changes: 2 additions & 2 deletions docs/guide/web-app.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ rosters](./directory)). Per person:
| --- | --- |
| On standup | Prompted for this standup |
| Required | Listed as missing when they don't answer. The others still get the prompt but never count as missing |
| Mon–Sun | The days they work. Unticked days mean no prompt, and never missing. The standup's own off days are greyed out |
| Mon–Sun | The days they work on this standup. The standup's days are marked *default*; any other day can be ticked, and the standup then runs that day for them. Each row says *Default* or *Custom* (with *Reset to default*), and each tick saves at once and shows *Saved*. Unticked days mean no prompt, and never missing |

**Roster** switches between *Picked from the space* and *Everyone in a Google
Group*. Either way, **Last sync** shows when the roster was last checked, with
Expand All @@ -82,7 +82,7 @@ Group*. Either way, **Last sync** shows when the roster was last checked, with

The create form uses the same grid, with everyone in the space ticked to start.

Personal weeks, days off and time-off approvals also live under **Team → Edit
People's days on each standup, days off and time-off approvals also live under **Team → Edit
schedule**, **My page → My schedule** and **Team → Requests** — see
[Personal schedules](./schedules).

Expand Down
Loading
Loading