> ## Documentation Index
> Fetch the complete documentation index at: https://docs.timetracker.in/llms.txt
> Use this file to discover all available pages before exploring further.

# Work schedules settings

> Set up recurring work schedules in TimeTracker: per-day working hours, days off, timezones, assignments to people and groups, and one-off exceptions.

Schedules live at **Settings** → **Schedules** (`/{slug}/settings/schedules`). A schedule is a reusable template of recurring working hours. It sets what a person is **expected** to work.

<Note>
  **Schedule vs tracked time.** A schedule is what someone is expected to work. Tracked time is what they actually did. A timesheet compares the two. See [/timesheets/expected-vs-tracked-hours](/timesheets/expected-vs-tracked-hours).
</Note>

## Before you start

You need the **Manage schedules** capability (`schedule.manage`), and the **Work schedules** app must be on.

| Situation                                    | What you see                                                                                                                                       |
| -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| You hold `schedule.manage` and the app is on | The **Schedules** item appears in the settings sidebar                                                                                             |
| You do not hold `schedule.manage`            | The item is hidden. Opening the URL shows *"You don't have access to Schedules"*                                                                   |
| The **Work schedules** app is off            | The item is hidden everywhere, and the page shows a card saying the app is turned off, with a link to **Settings** → **Apps** if you may change it |

<Info>
  An app being **off** is not the same as a feature not being on your plan. Off means hidden and gone from the sidebar. Not on your plan means the item stays visible with a paywall. Work schedules is part of the `timesheets` feature, which is on the Free plan. See [/concepts/apps-and-modules](/concepts/apps-and-modules).
</Info>

By default `schedule.manage` is held by **Owner** and **Admin** only. Everyone else holds `schedule.view`, which lets them read their own schedule.

## What is on the page

The page is titled **Schedules**, with the description *"Define when people are expected to work, then assign a schedule to the whole workspace, a group, or one person."*

It has four parts:

| Part                          | Answers                      |
| ----------------------------- | ---------------------------- |
| **All schedules** (left rail) | Which schedules exist        |
| The schedule editor           | What one schedule contains   |
| **Assignments**               | Who each schedule applies to |
| **Exceptions**                | Which single dates differ    |

## All schedules

The left rail lists every active schedule. Each row shows the schedule name and, underneath, either **Every week** or **Every 2 weeks**.

* Click a row to open it in the editor.
* The **+** button in the card header starts a new schedule.
* A **New schedule** row sits at the bottom of the list and does the same thing.
* While the list loads you see *"Loading…"*.

If the workspace has no schedules yet, the editor opens ready for a new one.

## The schedule editor

The editor card is headed by the schedule's name. Under it sits a summary line such as *"Every week · starts Monday"*.

Three controls sit in the card header:

| Control               | What it does                                                                                                          |
| --------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Duplicate**         | Copies the schedule as a new one named `<name> (copy)` and opens it                                                   |
| **Delete schedule**   | Opens the delete confirmation                                                                                         |
| **Create** / **Save** | Saves. It reads **Create** for a new schedule and **Save** for an existing one, and shows *"Saving…"* while it writes |

Duplicate and Delete appear only on a saved schedule.

### Fields

| Field               | What it sets                                                                              |
| ------------------- | ----------------------------------------------------------------------------------------- |
| **Name**            | The name people see. Required, up to 80 characters. Placeholder: *"e.g. Standard week"*   |
| **Repeats**         | **Every week** or **Every 2 weeks**                                                       |
| **Week starts on**  | **Monday**, **Sunday** or **Saturday**. This sets the order the day rows are listed in    |
| **Timezone**        | The timezone the schedule's times are read in                                             |
| **Rotation starts** | Only for **Every 2 weeks**. The week that counts as Week A. Everything rotates from there |

Under the fields a preview strip states how the pattern lands. For a weekly schedule it reads *"Repeats every week"* and names the week it is showing. For a two-week schedule it shows three cards: **Week A**, **Week B**, and Week A again marked *"then repeats"*. Clicking Week A or Week B switches which week the editor is showing.

### The timezone field

The timezone belongs to the **schedule**, not to the workspace and not to the person.

<Warning>
  A person's working times are read in the timezone of the schedule they are assigned. It is not the workspace timezone. If two people need different local hours, give them two schedules with different timezones.
</Warning>

A new schedule starts with the workspace timezone already filled in, so you only change it when you need to. If a person has no schedule at all, times fall back to UTC. See [/schedules/schedule-timezones](/schedules/schedule-timezones).

## Working hours and days off

Below the fields is the week pattern. A heading reads **Weekly pattern**, with the week total on the right, such as *"40h / week"*.

There is **one row per day**, so every weekday can differ. Each row has:

| Part                    | What it does                                                                               |
| ----------------------- | ------------------------------------------------------------------------------------------ |
| Switch + day name       | On means a working day. Off means a day off                                                |
| Start and end time      | Typed or picked, in 24-hour form                                                           |
| Length                  | The period length, shown as `8h` or `7h 30m`                                               |
| **Ends next day** badge | Appears when the end time is at or before the start time, so the period runs past midnight |
| Three-dot menu          | **Add work period** and **Delete**                                                         |

A day that is off is shaded and reads **Day off**.

A day can hold more than one work period. Use **Add work period** on the three-dot menu to split a day around a long break, for example 09:00 to 13:00 and 14:00 to 18:00.

<Tip>
  Deleting the last work period on a day turns that day off. Switching a day back on gives it a fresh 09:00 to 17:00 period. A period you add on top of an existing one starts at 13:00 to 17:00.
</Tip>

### Two-week rotations

Set **Repeats** to **Every 2 weeks** and two tabs appear: **Week A pattern** and **Week B pattern**. Each tab shows its own total and the dates it covers. Week B starts as a copy of Week A, so you edit only what differs.

**Rotation starts** decides which real calendar week counts as Week A.

## Create a schedule

<Steps>
  <Step title="Open Settings → Schedules">
    Click **Settings** in the sidebar, then **Schedules**.
  </Step>

  <Step title="Start a new schedule">
    Click **+** in the **All schedules** card, or the **New schedule** row at the bottom of the list. A new schedule opens with Monday to Friday, 09:00 to 17:00, and the weekend off.
  </Step>

  <Step title="Name it">
    Type a name, for example `Standard week`. Saving without one raises *"Give the schedule a name."*
  </Step>

  <Step title="Set how it repeats">
    Choose **Every week** or **Every 2 weeks**, and pick the day the week starts on.
  </Step>

  <Step title="Choose the timezone">
    Pick the timezone the hours are worked in.
  </Step>

  <Step title="Set the hours">
    Switch each day on or off, then set the start and end time for each work period.
  </Step>

  <Step title="Click Create">
    You see *"Schedule created."* and the schedule appears in the left rail. Nobody follows it yet – you still have to assign it.
  </Step>
</Steps>

Anyone with `schedule.manage` may do this. In Northwind Studio that is Maya Ellis (Owner) and Tom Whitfield (Admin).

## Edit a schedule

Pick it in the left rail, change what you need, and click **Save**. You see *"Schedule saved."*

An edit changes the pattern for everyone assigned to it, on every date it covers. It does not change time people have already tracked.

<Warning>
  Editing a schedule that many people share is the fastest way to move a whole team's expected hours. If only one person's hours are changing, make a new schedule and assign it to them instead.
</Warning>

## Delete a schedule

Click the **Delete schedule** icon in the editor header. A confirmation modal opens:

> **Delete this schedule?**
> It moves to Trash and can't be assigned to anyone new. Existing assignments keep resolving until you change them. You can restore it from Trash before it's purged.

Click **Delete schedule** to confirm. You see *"Schedule moved to Trash."*

What happens to people assigned to it:

| Thing                | What happens                                                                  |
| -------------------- | ----------------------------------------------------------------------------- |
| Existing assignments | They keep working. Nobody's expected hours change on the day you delete it    |
| New assignments      | The schedule no longer appears in the **Assign a schedule** picker            |
| Recovery             | Restore it from **Settings** → **Trash** until the retention period purges it |

To actually move people off a deleted schedule, assign them a different one.

## Assignments

The **Assignments** card answers who each schedule applies to. Its description reads *"Who each schedule applies to. A person's assignment wins over their group's, which wins over the workspace default."*

| Column         | Shows                                                                                      |
| -------------- | ------------------------------------------------------------------------------------------ |
| **Schedule**   | The schedule name                                                                          |
| **Applies to** | **Everyone**, a group name, or a person's name                                             |
| **Level**      | A badge reading **Workspace**, **Group** or **Person**                                     |
| **Effective**  | The date window, for example **Always**, `2026-08-01 → open`, or `2026-08-01 → 2026-12-31` |
| (row action)   | A remove button                                                                            |

When nothing has been assigned yet, the card reads *"No assignments yet. Everyone is on the workspace default schedule."*

### The default schedule

There is no separate "default schedule" setting. The default is whichever schedule is assigned at the **Workspace** level. That row shows **Everyone** in the **Applies to** column and usually **Always** as its window, meaning it has no start date and covers every date.

### How precedence works

For any date, one schedule wins:

1. A schedule assigned to **the person**
2. Otherwise, a schedule assigned to **their group**
3. Otherwise, the **workspace** assignment

A person can have at most one assignment covering a date at each level.

### Assign a schedule

<Steps>
  <Step title="Click Assign">
    The **Assign a schedule** dialog opens: *"Bind a schedule to everyone, a group, or one person over a date range."*
  </Step>

  <Step title="Pick the schedule">
    **Schedule** lists active schedules only. A deleted one is not offered.
  </Step>

  <Step title="Pick who it applies to">
    **Applies to** offers **One person**, **A group**, or **Everyone (workspace)**. Choosing a group or a person adds a second picker below it.
  </Step>

  <Step title="Set the dates">
    **Start** defaults to today. **End** is disabled while the **No end date** checkbox is ticked, which is the default.
  </Step>

  <Step title="Add a note (optional)">
    A short reason, for example *"covering parental leave"*.
  </Step>

  <Step title="Check who it touches">
    The dialog states how many people the assignment affects before you save.
  </Step>

  <Step title="Click Assign schedule">
    You see *"Schedule assigned."* The row appears in the table straight away.
  </Step>
</Steps>

The count of affected people ignores client-portal contacts, and for a group it counts only the people whose **primary** group it is.

### Replacing a schedule someone is already on

If the target already has a schedule covering those dates, the dialog shows a panel naming it and its window, plus a field:

**End the current schedule on** – a date that must be on or after the current schedule's start, and before your new start. The hint reads *"The new schedule takes over the next day."* It fills in the day before your new start for you.

Saving with this filled in ends the old assignment and creates the new one in a single step. The toast reads *"Schedule updated."*

Without it the save is refused: *"This target already has a schedule covering those dates. End or remove that one first."*

### Remove an assignment

Click the remove button on the row. A confirmation modal opens:

> **Remove this assignment?**
> The members it covers fall back to their next-most-specific schedule (group or workspace default). This does not delete the schedule itself.

Confirm with **Remove assignment**. You see *"Assignment removed."*

### Assigning from a person's record

You can also assign from a person's own record, under **Settings** → **Team Members**. Their record has a **Schedule** section split in two:

* **Their own schedule** – assignments aimed at this person, with an **Assign a schedule** button.
* **Inherited** – what they fall back to, from their groups and then the workspace, each badged with its level.

That section only ever creates a **person-level** assignment. Group and workspace assignments are changed here on the schedules page.

## Exceptions

The **Exceptions** card handles a single date that differs from the pattern. Its description reads *"One-off changes for a single date. Removing an exception restores the inherited schedule."*

| Column         | Shows                                                                |
| -------------- | -------------------------------------------------------------------- |
| **Date**       | The date the exception covers                                        |
| **Applies to** | **Everyone**, a group name, or a person's name                       |
| **Type**       | A badge with the exception type                                      |
| **Hours**      | The replacement or extra hours, or a dash when the type carries none |
| (row action)   | A remove button                                                      |

When there are none, the card reads *"No exceptions yet."*

### The six exception types

| Type                  | Effect on that date                                         |
| --------------------- | ----------------------------------------------------------- |
| **Public holiday**    | The day becomes non-working                                 |
| **Day off**           | The day becomes non-working                                 |
| **Leave**             | The day becomes non-working                                 |
| **Working day**       | The day becomes working, with exactly the hours you enter   |
| **Replacement hours** | The pattern's hours are replaced by the hours you enter     |
| **Additional period** | The hours you enter are added on top of the pattern's hours |

The last three ask for hours. The first three do not.

### Add an exception

<Steps>
  <Step title="Click Add exception">
    The **Add an exception** dialog opens: *"A one-off change for a single date."*
  </Step>

  <Step title="Pick who it applies to">
    **Applies to** defaults to **Everyone (workspace)**. You can narrow it to a group or one person.
  </Step>

  <Step title="Pick the date and type">
    **Date** defaults to today. **Type** defaults to **Public holiday**.
  </Step>

  <Step title="Enter hours if the type needs them">
    For **Working day**, **Replacement hours** and **Additional period** a start and end time appear, seeded at 09:00 to 17:00. **Add period** adds another row. Each row has its own remove button.
  </Step>

  <Step title="Add a reason (optional)">
    For example *"national holiday"*.
  </Step>

  <Step title="Click Add exception">
    You see *"Exception added."*
  </Step>
</Steps>

### Remove an exception

Click the remove button on the row. The confirmation reads **Remove this exception?** – *"The date returns to its inherited schedule."* You see *"Exception removed."*

### When an exception does not apply

An exception only applies when its level is at least as specific as the assignment in force for that person.

<Warning>
  Someone on their **own personal** schedule does **not** pick up a workspace-wide public holiday. Their personal assignment wins. People on a group or workspace assignment do receive it. If a holiday must reach everyone, add it at the same level as the assignments they are on, or add a person-level exception for anyone on a personal schedule.
</Warning>

## Example

Northwind Studio, set up by Maya Ellis:

1. She creates **Standard week** – Monday to Friday, 09:00 to 17:00, timezone `Europe/London`. That is 40 hours a week.
2. She assigns it at **Everyone (workspace)** with no end date. Sarah Lin, Jonas Bergman, Priya Raman and Daniel Okafor all follow it.
3. Ana Ferreira is a part-time contractor. Maya creates **Part-time (Mon, Wed, Fri)** with 09:00 to 13:00 on those three days and the rest off – 12 hours a week – and assigns it to **One person: Ana Ferreira** from 1 September, with no end date.
4. For the December bank holiday she adds an exception: **Everyone (workspace)**, 25 December, **Public holiday**.

Sarah's timesheet for that week now expects 32 hours instead of 40. Ana keeps her own pattern, because her personal assignment outranks the workspace holiday.

## Permissions

| Capability        | What it allows                                              | Who holds it by default                                    |
| ----------------- | ----------------------------------------------------------- | ---------------------------------------------------------- |
| `schedule.manage` | Create, edit, duplicate, delete, assign, and add exceptions | Owner, Admin                                               |
| `schedule.view`   | See your own schedule                                       | Owner, Admin, Project Manager, Finance, Member, Contractor |

Hiding the sidebar item is a convenience. Every change is re-checked when it is saved, so a stale tab or a bookmarked URL cannot get around it. Capability is only half the question – see [/concepts/roles-and-capabilities](/concepts/roles-and-capabilities).

## What happens next

| Downstream         | Effect                                                                                                  |
| ------------------ | ------------------------------------------------------------------------------------------------------- |
| Timesheets         | Expected hours per day come from the schedule, so a timesheet can show short, complete or overtime days |
| Time Clock         | Expected minutes, lateness and absence are all measured against the schedule                            |
| Daily reminders    | Reminders fire on working days only, in the timezone on the schedule                                    |
| Deadline reminders | These fire a set time before the person's own working day ends                                          |

<Note>
  The **Time Clock** app requires **Work schedules**. You cannot turn Time Clock on without it, because expected minutes and absence detection come from the schedule. Turning Work schedules off warns you that it takes Time Clock with it.
</Note>

## Common questions

<AccordionGroup>
  <Accordion title="Can different days have different hours?">
    Yes. Working hours are set per day, so Monday can be 09:00 to 17:00 and Friday 09:00 to 13:00 in the same schedule.
  </Accordion>

  <Accordion title="Can a shift run past midnight?">
    Yes. Set an end time at or before the start time and the period is marked **Ends next day**.
  </Accordion>

  <Accordion title="Does deleting a schedule change anyone's hours?">
    Not on its own. Assignments pointing at it keep working. To move people off it, assign them a different schedule.
  </Accordion>

  <Accordion title="Can one person have two schedules at once?">
    No. At each level – person, group, workspace – only one assignment may cover a given date. To switch schedules mid-year, end the current one and start the new one the next day. The dialog does both in one step.
  </Accordion>

  <Accordion title="Why is a person still on the old schedule?">
    A personal assignment beats a group one, and a group one beats the workspace default. Check the **Level** column, or open their record under **Settings** → **Team Members** to see their own assignments and what they inherit.
  </Accordion>

  <Accordion title="Where do people see their own schedule?">
    On their own profile. It needs only `schedule.view`. See [/schedules/my-schedule](/schedules/my-schedule).
  </Accordion>
</AccordionGroup>

## Troubleshooting

| Message or symptom                                                                         | Cause                                                            | Fix                                                                             |
| ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| *"Give the schedule a name."*                                                              | The **Name** field is empty                                      | Type a name and save again                                                      |
| *"This target already has a schedule covering those dates. End or remove that one first."* | Two assignments would overlap at the same level                  | Use **End the current schedule on** in the dialog, or remove the old assignment |
| *"The current schedule has to end before the new one starts."*                             | The cutover date is on or after the new start date               | Pick an earlier cutover date                                                    |
| *"The current schedule can't end before it started."*                                      | The cutover date is before the old assignment's start            | Pick a date inside the old window                                               |
| *"That schedule has been deleted. Pick an active one."*                                    | The schedule was deleted in another tab                          | Pick an active schedule, or restore the deleted one from Trash                  |
| *"Pick which person this schedule applies to."*                                            | **Applies to** is set to a group or person but none is chosen    | Choose one in the picker below                                                  |
| A timezone is rejected                                                                     | The zone is not recognised                                       | Pick one from the list rather than typing it                                    |
| A day shows no expected hours                                                              | The day is switched off, or an exception made it non-working     | Check the day switch, then the **Exceptions** table for that date               |
| **Schedules** is missing from the sidebar                                                  | You lack `schedule.manage`, or the **Work schedules** app is off | Ask an owner or admin. They can check **Settings** → **Apps**                   |

## Related guides

<CardGroup cols={2}>
  <Card title="Schedules overview" icon="calendar-clock" href="/schedules/overview">
    What a schedule is and why it matters.
  </Card>

  <Card title="Assign a schedule" icon="user-check" href="/schedules/assign-a-schedule">
    Person, group and workspace assignments in detail.
  </Card>

  <Card title="Working hours and days off" icon="clock" href="/schedules/working-hours-and-days-off">
    Per-day hours, breaks and overnight shifts.
  </Card>

  <Card title="Schedule timezones" icon="globe" href="/schedules/schedule-timezones">
    Why the timezone lives on the schedule.
  </Card>

  <Card title="Expected vs tracked hours" icon="scale-balanced" href="/timesheets/expected-vs-tracked-hours">
    How a timesheet uses the schedule.
  </Card>

  <Card title="Apps" icon="toggle-on" href="/settings/apps">
    Turning Work schedules and Time Clock on or off.
  </Card>
</CardGroup>
