---
title: "Measure operator work sessions"
description: "The Operator Performance report at /assets?select=operator_performance pairs each operator with the machine they worked and totals the machine's uptime percentage, uptime hours and downtime hours for their clocked sessions. Sessions come from sign-ins on a paired operator station, so the report's real job is finding sessions that were never closed. Filter by machine, operator and a window of up to 31 days, read each card as stacked hours per session or as a status strip, add or correct clock entries by hand, and export the whole report as CSV. Owner or Administrator, web only."
category: "Report on performance"
source_url: "https://www.iotflows.com/docs/monitoring/operator-performance/"
---
# Measure operator work sessions

Per-operator uptime and hours, and where the numbers come from.

The Operator Performance report pairs every operator with a machine they worked and totals what that machine did while they were clocked in. A *work session* is one stretch between an operator's *clock-in* and their clock-out on one machine. The report is at `/assets?select=operator_performance`.

**Prerequisites.** Owner or Administrator, see [Roles reference](/docs/admin/roles-reference/). Web only: the tab is absent from the Assets page in the mobile app. A device paired to a machine as an operator station, see [Set up a dedicated operator station](/docs/monitoring/operator-stations/), because that pairing is what turns a sign-in into a clock-in.

## Open the report
1. Go to **Assets**.
2. Click the **Operator Performance** tab.

The address bar reads `/assets?select=operator_performance`, followed by the `from` and `to` timestamps of the window. Every filter lives in the URL, so a report you want a supervisor to see is a link you can paste.

One card appears for each operator and machine pairing with a session in the window. An operator who worked three machines gets three cards, and each card counts only their sessions on that machine.

![The Operator Performance tab of the Assets page. A toolbar holds dashed Machines and Operators filter pills at the left, and a Bar Chart switch, a CSV button, a date range button and a blue Add Clock In/Out button at the right. Below it, four cards each show an operator avatar overlapping a machine photo, the operator's name, the machine name and identifier, then three figures: a percentage, uptime hours in blue and downtime hours in red, with a horizontal stacked bar chart underneath and a clock button at the card's top right.](/images/monitoring/mon-opperf-01.webp)

*The operator performance report, populated. Do not reuse the existing empty-state image.*

**You do not need this report if nobody signs in at a machine.** Sessions come from station sign-ins and from the entries you add by hand here. With neither, the report stays empty and there is nothing to measure.

## Filters and the period
Three controls sit above the cards, and all three write to the URL. **Machines** narrows the report to whole departments or named machines, applied with **Apply**. **Operators** narrows it to named people, searching by name, username or email, applied with **Run**.

The date button at the right sets the window. It opens on the last three days: midnight three days ago to 11:59 PM yesterday. Set any range up to 31 days, with a start time and an end time for the first and last day.

A longer range is refused with "Date range cannot exceed 31 days. Please select a shorter range.", and **Apply** stays disabled until you shorten it. There are no rolling presets here, so every visit starts from that three-day window.

## The bar chart
Each card leads with three figures for the operator's whole time on that machine. **Uptime** is the share of their sessions the machine spent running, and *uptime* is availability, see [Uptime](/docs/monitoring/metrics-reference/#uptime). **Uptime Hours** and **Downtime Hours** are the hours behind it.

With the **Bar Chart** switch on, each card draws one horizontal bar per session, stacked into uptime in blue, downtime in red and unknown time in gray, labeled in hours. *Unknown* time is any stretch the sensor reported nothing, and it counts toward neither figure.

![One operator card with the Bar Chart switch on, showing a horizontal stacked bar for each work session. Each bar carries a blue uptime segment and a red downtime segment labeled in hours, against a session label on the left axis.](/images/monitoring/mon-opperf-02.webp)

*Bar chart view. One bar per session, stacked into uptime, downtime and unknown hours.*

## The timeline view
Turning **Bar Chart** off replaces the bars with a status strip laid across the window, on an axis labeled by date and hour. Use it to see when in the window the operator's sessions sat, rather than how long they added up to.

The switch is available only for a window of three days or shorter. Above that it is grayed out and locked on, which is why a monthly report only ever shows bars. The default window is inside that limit by a minute.

![One operator card with the Bar Chart switch off, showing a rounded horizontal status strip in place of the bars, over a time axis labeled with dates and hours such as Sep 17, 06:00 AM.](/images/monitoring/mon-opperf-03.webp)

*The timeline view. The strip shows where in the window the operator's sessions sat, on an axis labeled by date and hour.*

The strip does not tell you whether a session closed. The clock timeline in [Edit or delete an entry](#entry-edit) does.

## What each column means
A *clocked item* is one work session with its own totals. Each bar on a card is a clocked item, and so is each row of the CSV.

| Column | Definition | Source |
|---|---|---|
| **Uptime** | Share of the operator's sessions on this machine that the machine spent running | The sensor's running and stopped states |
| **Uptime Hours** | Hours the machine ran during those sessions | The sensor |
| **Downtime Hours** | Hours the machine was stopped during those sessions | The sensor |
| Unknown hours | Hours the sensor reported nothing during a session. Drawn as the gray band on a bar, never as a card figure | Gaps in sensor reporting, see [Troubleshoot a device that is offline](/docs/hardware/troubleshoot-offline-device/) |
| Clocked category | The label the report gives one session. It names the bar on the chart and fills the `Clocked Category` column in the CSV | The report endpoint |
| Clock start, clock end | The two clock events that bound the session. The end is empty when the session was never closed | Station sign-in and sign-out, or a manual entry |

Every timestamp is in the organization's time zone, not the browser's, see [Shifts and time zone](/docs/admin/shifts-and-timezone/).

## Add a manual clock-in
Use this when an operator worked but no session exists: they signed in on their own laptop, or the tablet was down.

1. Click **Add Clock In/Out** at the right of the toolbar.
2. On **Select Operator**, search and click the person.
3. On **Select Assets**, search by machine name or identifier and click the machine.
4. Choose **Clock In**, **Clock Out** or **Clock In & Out**.
5. Set the date and time for each action you chose.
6. Click **Add Time**. The report reloads and a toast reads "Time added".

![The Add Clock In/Out dialog on its third step. The chosen operator and machine sit in two blue chips at the top, above a three-way selector reading Clock In, Clock Out and Clock In & Out with Clock In & Out chosen, and below it a green Clock In heading with a date button and a time picker, then a red Clock Out heading with its own date button and time picker. An Add Time button sits at the top right.](/images/monitoring/mon-opperf-04.webp)

*Adding a manual clock-in entry to correct a session.*

### Manual clock-in fields
| Field | Required | Notes |
|---|---|---|
| Operator | Yes | Any organization member. People with a pending invite are not listed |
| Asset | Yes | The machine the session belongs to. Search matches the custom name, the custom identifier or the catalog name |
| Action | Yes | **Clock In**, **Clock Out** or **Clock In & Out**. Defaults to **Clock In** |
| **Clock In** date and time | For **Clock In** and **Clock In & Out** | Defaults to 6:00 AM yesterday |
| **Clock Out** date and time | For **Clock Out** and **Clock In & Out** | Defaults to 9:00 AM yesterday |

**Why is the entry on the wrong day?** Both pickers default to yesterday, not today. Click straight through and you file a session for yesterday morning, on a machine that may already have one.

**Clock In & Out** writes two separate events. If the clock-in saves and the clock-out fails, the session is left open, so check the timeline before you retry.

## Edit or delete an entry
Every clock event can be moved, flipped or removed, whether a station wrote it or you did.

1. Click the clock button at a card's top right. The **Operator Clockin/Clockout** dialog lists that operator's clock events on that machine, oldest first.
2. Each event reads **Clocked In** or **Clocked Out** with its date and time. Between a clock-in and the clock-out that follows it, a pill gives the length, for example `8h 12m`.
3. Hover an event to reveal its pencil and trash icons.
4. Click the pencil to change the date and time, then click **Edit Time**. A toast reads "Time entry updated".
5. Click the trash, confirm the event named in the dialog, and click **Delete**. A toast reads "Time entry deleted".

In the edit dialog, clicking the green **Clocked In** or red **Clocked Out** label flips the event to the other kind. Use that when a sign-out was recorded as a sign-in, which otherwise leaves two clock-ins in a row and no session between them.

An event with no duration pill after it is a session nobody closed. Add the missing clock-out with the dialog's own **Add Clock In/Out** button, which arrives prefilled with this operator and machine.

## Edit a work session's times
A *job work session* is the stretch an operator spent on one job. It is not a clock session, and it is corrected on the machine's page rather than here.

Open the machine, find the work-session strip under its operations, and drag either end of a session bar, see [Inspect a single machine](/docs/monitoring/asset-detail/). To type the times instead, open **Job History** and edit the session in its **Work Sessions** list, where you can also delete one or add one with **New Session**, see [Start, pause, and complete a job](/docs/production/run-a-job/).

Times are validated before they are sent. The edit is refused with "Session cannot start in the future", "Start time must be before end time", "Start and end time cannot be the same", "Session cannot end in the future", or "Overlaps with another session" naming the job it collides with.

Editing a job session changes what the job is credited with, not the operator's clocked hours here.

## Export to CSV
Click **CSV** in the toolbar. The file downloads as `operators_report_<start>_to_<end>.csv`, for example `operators_report_Aug 20, 2026_to_Sep 19, 2026.csv`.

The export writes one row per clocked item: the operator's username, first name, last name and email, the machine's name and identifier, the department, the clocked category, that session's uptime and downtime in hours and as percentages, and the clock start and end. A pairing with no sessions in the window still gets a row, with `N/A` in the three clock columns. What every export in the product carries is listed in [Available exports](/docs/monitoring/exports-reference/).

The button is disabled while the report is empty. There is no PDF and no scheduled version of this report.

## Reading the report fairly
Use this report to find sessions that were never closed, not to rank people. An operator who forgets to clock out looks like the best performer on the hours columns, which is exactly why the manual edit exists.

Two more reasons the number is not a person's performance. The uptime percentage is the machine's, so an operator who spent a shift waiting on tooling carries that machine's downtime. And a session only exists if someone signed in at a paired station, so an operator working a machine without one looks like they did nothing.

For why the machine was stopped, go to [Analyze downtime with Pareto and trend charts](/docs/monitoring/downtimes/).

## Errors
| Message or symptom | Means |
|---|---|
| "You are not authorized to view this page." | Your role is neither Owner nor Administrator. The tab shows for everyone; the report does not |
| "No operator report data available for selected date range." | No sessions matched. Widen the window, clear the **Operators** filter, or confirm a station is paired |
| "Date range cannot exceed 31 days. Please select a shorter range." | **Apply** stays disabled until the range is 31 days or shorter |
| The **Bar Chart** switch is grayed out | The window is longer than three days, so the timeline is unavailable |
| "Something went wrong with clock in", "Something went wrong with clock out" | That clock event was not written. With **Clock In & Out**, the other event may already exist |
| "Failed to download CSV. Please try again." | The file was not written. Nothing on the server changed |
| A clock-in with no duration pill after it | The operator never clocked out. Add the clock-out by hand |

## See also
- [Set up a dedicated operator station](/docs/monitoring/operator-stations/)
- [Find your next job in the Work Queue](/docs/production/work-queue/)
- [Start, pause, and complete a job](/docs/production/run-a-job/)
- [Available exports](/docs/monitoring/exports-reference/)
- [Roles reference](/docs/admin/roles-reference/)
