Time tracking
Track effort with the stopwatch or the Time Calendar, gather it into timesheets, and subscribe to it from an external calendar.
orboto records the time you spend on work under the Time group in the sidebar: Time Calendar and Timesheets. A running stopwatch also lives in the top bar so you can start and stop timing from anywhere. Requesting time off has its own page - see Absences - and team-wide workload is covered in Capacity planning.
Timesheets are for internal team members. Guest and external users see only the Time Calendar, and only if it has been enabled for them.


The stopwatch (timer)
The timer in the top bar is the quickest way to track effort as it happens.

- Start a timer on a ticket (from the ticket, or by claiming work). The elapsed time counts up in the top bar.
- Pause / resume when you step away.
- Stop when you finish - orboto writes the elapsed minutes as a time entry against that ticket, using the note you set when you started.
Only one stopwatch runs at a time. If you start timing a second ticket, orboto commits the time on the first one before switching, so nothing is lost.
Who can book time
Added in v0.230.0 Every way of booking time runs the same three checks, in this order:
- The ticket. You can open the ticket and hold
time:login its project. - The project. It is active. On a project that is not active, booking is switched off.
- The day. No approved timesheet of yours covers it.
| What is wrong | Answer |
|---|---|
| You cannot open the ticket - a private ticket without access, or a ticket in a project you are not a member of | 404 |
You can read the ticket but do not hold time:log | 403 (starting a timer: errors.time.log_permission_required) |
| The project is not active | 403 errors.time.booking_disabled |
| An approved timesheet locks the day | 403 errors.time.day_locked |
The checks hold for every path that books time:
- A single entry from the ticket's Time tab, the Time Calendar or
POST /tickets/{id}/time-entries. - Several days at once (
POST /time-entries/bulk). The checks cover every ticket and day in the call, and one refusal refuses the whole booking. A ticket you can read but may not log time on answers403, like a single entry; a ticket you cannot open answers404. - The stopwatch. A start needs
time:logand a ticket you can open. The stop runs all three checks, see below. - Convert to entry on a plan block. A refusal books nothing and the block stays a plan block.
- A
#timeline in an emailed reply. A reply to a ticket mail with a line such as#time 1h30 review of the fixbooks that time for the sender. If a check fails, nothing is booked and a comment on the ticket names the reason.
Stopping a timer after you lost the right to book. The timer stops either way, but it books only when the checks pass at that moment. If you lost time:log or access to the ticket while it ran, if the project is no longer active, or if today is locked by an approved timesheet, the stop books nothing: the API answers bookingRefused: true with durationMinutes: 0, orboto timer stop prints that answer, and the MCP tool reports "nothing booked". The same holds when orboto commits a timer for you, for example when you start timing another ticket.
Claiming without time:log. orboto ticket claim still assigns you and moves the ticket to In Progress; it only starts no timer, and says so.
The Time Calendar lists only entries on tickets you can open. That includes an administrator who looks at another user's entries with View as: an entry on a ticket the administrator cannot open is not shown.
Time Calendar
The Time Calendar shows a week at a time, one column per day, with your logged time laid out as blocks so you can see where your hours went and fill any gaps.
Logging and planning time
The calendar has two ways to add something to a slot, picked by the Time entry / Plan block toggle in the header:
- Click an empty slot for a quick add at that hour, or click and drag to sweep out an exact start time and duration.
- With the toggle on Time entry, this logs actual time against a ticket right away.
- With the toggle on Plan block, it books a slot ahead of time without logging anything yet - useful for blocking your calendar before the work happens. Open a plan block and select Convert to entry to turn it into a real, logged time entry once the work is done (it needs a ticket assigned first - edit the block to add one if it doesn't have one yet). A converted block becomes read-only.
- Shift+click a slot to open an absence request pre-filled with that day - see Absences.
Either dialog asks for the project, ticket, date, duration, and an optional note. Existing blocks can be dragged to move them or resized from either edge to change their duration.
You can edit or delete an entry later, as long as it isn't part of an already-approved timesheet (see below).
Booking several days at once
To book the same entry on several days - "2 h on ACME-42, Monday to Friday" - select the days first: click a day in the calendar's header row to pick it, Shift+click another to pick the whole range, then choose Book on selected days. On a ticket, the Time tab has Log for several days for the same dialog with the ticket already filled in.
The dialog takes the ticket, start time, duration and note once, and a day list you can extend with a from/to range (with working days only on by default) or trim chip by chip. It previews as you type: a day inside an already approved timesheet is marked locked and has to be removed before you can book, and capacity warnings (over the day or week budget, non-working day, holiday, closure, absence) are listed as advice. The booking is one call - either every entry lands or none does.
The same call is available to agents and scripts: orboto timer log ACME-42 120 --dates 2026-09-14..2026-09-18 --weekdays-only on the command line, dates on the orboto_log_time MCP and chat tools, and POST /time-entries/bulk on the API.
Reading the calendar
- Your work-hours window is shaded, and the grid auto-scrolls to it when you open the page.
- Non-working days and blocked days (public holidays, company closures, approved absences) are shaded and hatched.
- Each day header shows your logged vs. goal hours for the day, turning green once you've hit your target.
- Use the zoom control to make the grid more compact or roomier.
- If you're an administrator, a View as picker lets you inspect another user's logged time (their plan blocks stay private).
The context overlay
Toggle Context to show a strip above the grid with your current milestones (as spanning bars), version releases, and ticket due dates for the visible week - so you can see what's due while you plan your time. Narrow it to specific projects with the project filter next to the toggle.
Calendar settings
The gear icon opens:
- Recurring time-entry templates - save a frequently used entry (project, ticket, duration, note, and a recurrence pattern) and insert its next occurrence as a plan block with one click instead of retyping it.
- Subscribe feed - a personal, read-only calendar URL (webcal/ICS) you can add to an external calendar app. Choose what it includes: absences, ticket due dates, milestones, and timesheet deadlines. Regenerate the URL at any time to invalidate the old one.

Timesheets
A timesheet is your logged time for a period (for example a month), gathered up for approval. Open Timesheets in the sidebar; the Mine tab is generated automatically from your time entries, no manual step required.
- Select a period to open its detail view - every entry, grouped by date, project, and ticket.
- While the timesheet is open (or rejected), select any entry to edit it inline, or edit it from the Time Calendar.
- Select Submit to send it for approval. Its status moves to submitted, then to approved or rejected.
- Every decision is kept: the detail view shows a decision history (who submitted, approved, rejected or reopened it, when, and with which note). An approved timesheet is not rejected in place - an approver reopens it with a reason, which releases the locked entries so they can be corrected and the timesheet submitted again. Each decision also lands in the workspace audit log.
- If rejected, the reason is shown so you can correct the entries and resubmit.
- Once approved, every entry in it is locked - you can no longer edit or delete them, from either the timesheet or the Time Calendar.
If you approve timesheets, the Pending tab lists everyone's submitted timesheets waiting on you, with Approve or Reject (with a required reason) on each row. Select PDF on any timesheet, yours or a team member's, to download a formatted export.
Entries on tickets you can no longer open
Added in v0.230.0 An entry on a ticket you cannot open - because the ticket became private, or because you lost access after you logged the time - keeps its date, duration and note, so the hours still add up. The ticket column reads Restricted ticket followed by the ticket key, for example Restricted ticket ACME-42; for a private ticket it shows no key, only Restricted ticket. The page shows the label in your language. The API (ticketTitle, with titleHidden: true) and the PDF export carry the English text. The rule applies to whoever reads the timesheet, on the page, in the API and in the PDF.
Troubleshooting
Logging time answers 403 or 404. 404 means you cannot open the ticket, or are not a member of its project. 403 means you can read it but your role lacks time:log, the project is not active, or an approved timesheet covers that day; the message says which. Ask a project admin for time:log, or ask an approver to reopen the timesheet - see Who can book time.
I stopped the timer and no entry appeared. The stop answered bookingRefused: true. When you stop, orboto checks again that you can open the ticket, hold time:log, that the project is active and that today is not locked. If one of them no longer holds, the timer is gone and nothing is booked. Log the time by hand once the cause is fixed.
I can't edit a time entry. It's locked into an approved timesheet. Ask your approver to reject the timesheet (with a reason) if the entry genuinely needs correcting - that reopens it for editing.
My drag on the calendar created the wrong thing. Check the Time entry / Plan block toggle in the header before you drag - it decides what a click-and-drag gesture produces, and it's remembered across sessions.
The subscribe feed isn't showing new events in my calendar app. Most external calendar apps cache a webcal/ICS feed and refresh it on their own schedule (often hourly), not instantly - give it time, or manually refresh the subscription in that app.
A plan block won't disappear after I logged the real time. Open it and select Convert to entry instead of logging a separate time entry - deleting the block just discards the plan without logging anything, and a converted block can't be deleted afterwards (it's now the real entry).