Skip to content

Time Tracking Page

The Time Tracking page is your audit log of every completed time entry recorded against jobs and workstations in the system. Every time an employee starts a timer on the Kiosk or mobile app and then stops it — or adds a manual entry by hand — a record lands on this page.

It answers questions like “how long did Jan spend on Order PB-0042?”, “who has been on the Paint Booth this week?”, and “is this job over its estimated time budget?”. Open it from the main sidebar (Time Tracking) or by navigating to /time-tracking.

Time Tracking page

Unlike the Production page, which shows live work-in-progress (active timers), the Time Tracking page is the historical record of completed work. Active timers appear on the Production page’s top-bar avatar group; closed timers appear here.


  1. What this page is for
  2. Anatomy of the page
  3. Reading the table
  4. Searching
  5. Advanced filters
  6. Summary cards
  7. Exporting to Excel
  8. How time entries get here
  9. Adding a time log manually
  10. Editing a time entry
  11. Stopping an active timer
  12. Auto-closing timers at end of shift
  13. Time entries and Job Logs
  14. Time entries and Webhooks
  15. Per-job vs system-wide view
  16. Customizing the Time Tracking page
  17. Tips and best practices

The Time Tracking page is the single source of truth for how long people spent on what. Use it for:

  • Payroll input — see total hours each employee worked, broken down by job and workstation.
  • Job costing — sum up labor time across a single job to compare against its estimate.
  • Productivity reporting — see who worked on what, when, and for how long.
  • Auditing — investigate why a job is over budget by looking at every individual timer entry.
  • Spot-checking the shop floor — confirm that clock-in / clock-out flows are being used correctly.

The page is read-mostly — entries are created on the floor (Kiosk / mobile app), not from here. From here you primarily review them, optionally edit timestamps if a mistake was made, and occasionally add a back-fill entry by hand.


The page is laid out top-to-bottom in four bands:

  1. Top toolbar — page title; the Search box on the left; Show N entries selector and the Export to Excel button on the right.
  2. Advanced filter row — Employee, Job, Order, and Workstation pickers, plus the From / To date inputs and a Clear filters button. See Advanced filters.
  3. Summary cards — three at-a-glance numbers for the currently filtered set: Total time, Entries, Employees. See Summary cards.
  4. The table itself, one row per completed time entry, sorted by most recently started first. Standard pagination with a Showing X–Y of Z counter sits underneath.

The page lists only entries whose timer has been stopped. Active timers (still running) appear on the Production page top bar and on the relevant job’s Time Tracking tab — see Stopping an active timer.


Each row shows:

ColumnWhat it shows
EmployeeThe employee who started the timer.
JobThe job name on the first line; the job’s Ref No (#PB-0042) on a smaller second line below it.
OrderThe parent order’s name on the first line; the order’s Ref No on a smaller second line below it.
WorkstationThe workstation column the work was logged against, shown as a small badge.
StartedTimestamp when the timer was started.
StoppedTimestamp when the timer was stopped.
DurationTotal elapsed time, formatted compactly: 45s, 12m, 1h 32m.

A dash (-) appears when a piece of data is missing (e.g., an employee record was deleted, or the timer is somehow incomplete).

The table is sorted by Started timestamp, descending — most recent first — and this is not user-configurable from the page.


Type into the search box. The query matches against:

  • Employee name or surname
  • Job name or Ref No
  • Order name or Ref No

Search is case-insensitive and uses contains matching, so “Kow” matches “Kowalski” and “0042” matches “PB-0042”.

The list refreshes about 300 ms after you stop typing. The query is reflected in the URL, so a filtered view (e.g., “every entry on order PB-0042”) can be bookmarked or shared.

Search stacks with the advanced filters below — for example you can pick Employee = Jan Kowalski, then type “table” in the search box to see only Jan’s entries on jobs whose name/ref/order contains “table”.


Beneath the search row sits the advanced filter bar — five precise filters plus a date range. All filters combine with AND, all of them update the URL (so views are bookmarkable and shareable), and all of them are honored by the summary cards and the Excel export.

These four are searchable combobox pickers with the same UX:

  1. Click the picker to open the dropdown.
  2. Start typing — the list filters as you type.
  3. Click an option, or click the top All employees / All jobs / All orders / All workstations row to clear that filter.

The lists are scoped to options that actually have time entries — you won’t see jobs that no one has ever clocked into, so the dropdown stays short.

FilterWhat it matches
EmployeeEntries started by that one person.
JobEntries on a specific job (one product / production line item).
OrderEntries on any job belonging to a specific customer order. Useful for “how many hours have we spent on Acme’s order so far?”.
WorkstationEntries logged at a specific workstation, regardless of which job. Useful for capacity and bottleneck reporting on a specific machine or station.

Two From / To date inputs filter by the entry’s Started timestamp:

  • From — only entries that started on or after this date (inclusive, from 00:00 local time).
  • To — only entries that started on or before this date (inclusive, through 23:59 local time).
  • Leaving either blank means no bound on that side — set just From = 2026-01-01 to see everything from January onwards.

When at least one filter (search, picker, or date) is active, a Clear filters button appears on the right of the filter row. Clicking it resets every filter at once and reloads the table with no filter applied — a single round-trip, not five.


A three-card row directly above the table shows aggregates for the currently filtered set (across all pages, not just the page on screen):

CardWhat it counts
Total timeSum of duration_seconds across every matching entry, formatted as Xh Ym.
EntriesHow many entries match the current filters.
EmployeesHow many distinct employees are represented in the matching entries.

The cards update automatically whenever you change a filter, so you can answer questions like “how many hours did the paint team put into the Acme order in January?” in a few clicks — pick Workstation = Paint Booth, Order = Acme, From = 2026-01-01, To = 2026-01-31, and read the Total time card.


Top-right of the page is an Export to Excel button. Click it and the browser immediately downloads a .csv file named time-tracking_YYYY-MM-DD_HHMMSS.csv (Excel, Numbers, and Google Sheets all open it natively).

The export:

  • Applies every active filter — search, employee, job, order, workstation, and date range. What you see in the filtered table is exactly what lands in the file.
  • Includes all matching entries across every page — pagination is bypassed, so even if the table is showing “Page 1 of 27” you still get all 27 pages worth of rows in the file.
  • Streams as it generates, so very large selections won’t time out or eat memory on the server.
ColumnNotes
EmployeeName Surname joined together.
JobThe job’s name.
Job Ref NoThe job’s reference number (e.g., PB-0042).
OrderThe parent order’s name.
Order Ref NoThe parent order’s reference number.
WorkstationThe workstation the entry was recorded against.
StartedYYYY-MM-DD HH:MM:SS.
StoppedYYYY-MM-DD HH:MM:SS.
Duration (h:mm:ss)Human-readable elapsed time.
Duration (minutes)Minutes with two decimal places — easy to sum for payroll.
Duration (seconds)Raw seconds — easy for downstream scripts.
  • Pre-filter before exporting. A weekly payroll export typically means: pick From = Monday and To = Sunday, then Export. Or pick Employee = Jan for a one-person payroll line.
  • No filters = export everything. Clicking Export with nothing filtered downloads every completed entry in the system. Useful for a one-shot backup or off-site analysis.
  • The file is UTF-8 with a BOM, so Polish characters, German umlauts, etc. open correctly in Excel without any “Import wizard” gymnastics.

Time entries can be created in several ways. All of them end up in the same place — this page — once they’re stopped.

An employee at a workstation taps Start Work on the Kiosk or mobile app, enters their PIN, and a timer begins running against a specific job × workstation pair. When they tap Stop Work, the timer closes, the duration is computed, and the entry appears here.

2. Manual “Add Time Log” from the Job panel

Section titled “2. Manual “Add Time Log” from the Job panel”

Open a job → switch to the Time Tracking tab → click Add Time Log. You pick an employee, a workstation, a started timestamp, and a stopped timestamp. The entry is back-filled with the exact duration you specified.

This is useful for capturing work that was done but not clocked (e.g., the employee forgot to start a timer, or the device was offline). See Adding a time log manually.

If an employee leaves a timer running at the end of the shift, your scheduled Cron Job endpoint will close it automatically when triggered. The cron’s “Auto-closed by cron job” note ends up in the job log; the time entry appears here with the cron’s close-time as Stopped.

If you spot an active timer on the Job panel’s Time Tracking tab, you can hit the Stop button on it. The timer closes immediately and the entry appears here.


You can’t create a brand-new entry directly from this page. Manual entries are created per job:

  1. Open the job (via the Jobs page or by clicking through from Time Tracking).
  2. Switch to the Time Tracking tab in the Job panel.
  3. Click Add Time Log.
  4. Pick the Employee (type at least one character to search).
  5. Pick the Workstation the work was done on (must be a workstation that exists on the job).
  6. Set Started at and Stopped at (date + time pickers). Stopped must be after Started.
  7. Click Save.

The entry is created with the exact duration between Started and Stopped, a corresponding job log entry is added with the note Time tracked: 1h 25min (added manually by <your name>), and any matching time_log_saved webhooks fire with mode: "manual".

Why a job log too? Job logs are the per-workstation chronological notes attached to a job. Every time entry produces one so that the audit trail is unified — see Time entries and Job Logs.


Mistakes happen — a timer was started at 7:00 but the employee actually arrived at 7:30. To correct it:

  1. Open the job (from the table, click through, or use search to find it on the Jobs page).
  2. Switch to the Time Tracking tab.
  3. Click the pencil icon next to the entry.
  4. Adjust Started at and/or Stopped at.
  5. Optionally add a Note describing why the entry was edited (this is appended to the job log).
  6. Click Save.

The entry’s duration is recomputed automatically. A new job log entry is added with the note Time entry edited by <your name>. New duration: 55min (plus any reason note you added), and time_log_saved webhooks fire again to reflect the new duration.

Only stopped entries can be edited. Active timers cannot be edited — stop them first, then edit.

There is no audit trail of previous values. The job log captures that an edit happened, but not the old timestamps. If that matters for your compliance setup, archive the previous job-log values before editing.


The Time Tracking page lists only stopped entries, so it never shows active timers. To stop one mid-shift:

  • From the Kiosk / mobile app — the employee taps Stop themselves.
  • From the Job panel — open the job → Time Tracking tab → click the red Stop button on the in-progress entry.
  • From the Cron Job — call the cron endpoint URL configured for the workstations in question (see Cron Jobs).

In all cases, once stopped, the entry moves out of the active list and shows up on this page.


Workshops where employees occasionally forget to clock out can use Cron Jobs to close stale timers automatically. Set one up per team / per shift to:

  • Run on a cron schedule (e.g., 17:00 every weekday).
  • Close every active timer on the workstations assigned to that cron.
  • Append a Auto-closed by cron job: <name> note to each affected job log.
  • Optionally email a summary of all closed entries to a supervisor.

The closed entries then appear on this page exactly as if they had been stopped by hand.

See Cron Jobs for the full configuration guide.


Every time entry on this page has a corresponding job log entry on the job it was recorded against. Job logs are the per-workstation chronological audit trail you see on a job’s Logs tab. The integration looks like this:

EventJob log note format
Timer stopped on Kiosk / mobileTime tracked: <duration>
Cron job auto-closeAuto-closed by cron job: <name>
Manual “Add Time Log”Time tracked: <duration> (added manually by <user>)
Manual “Stop” from Job panelTime tracked: <duration> (manually closed by <user>)
Time entry editedTime entry edited by <user>. New duration: <new>

The job log captures qty = 0 for these auto-generated entries — they’re labor records, not quantity records. If an employee logged both time and quantity (the Kiosk lets you do both in one submission), the qty is captured on the same log.


Every time entry — whether it’s created on the Kiosk, manually added, stopped from the job panel, or auto-closed by a cron — triggers the time_log_saved webhook event for any subscribed endpoint.

The payload includes:

  • Job and workstation context
  • The duration in minutes
  • The employee (id, name, surname)
  • The mode field, which tells you how the entry was created:
    • "manual" — created via Add Time Log, Stop button, or Edit
    • "work_stopped" — created when the Kiosk/mobile timer was stopped normally

Use these to push time entries into a payroll system, billing system, or productivity dashboard in real time. See Webhooks for full configuration.


You can look at time entries from two angles:

ViewWhereBest for
System-wideThis page (/time-tracking)Cross-job reporting, finding all of one employee’s entries, daily/weekly review
Per-jobJob panel → Time Tracking tabJob costing — “how much labor on this job?” — plus per-job edit/stop/add controls

Both views read from the same underlying data, so an entry added in one is visible immediately in the other.

Both views also have summary cards at the top:

  • The system-wide page shows three cards — Total time, Entries, Employees — computed across the currently filtered set, including any active date range. See the Summary cards section above.
  • The per-job tab shows four cards — estimated time (sum of workstation estimates), total tracked time, entry count, and distinct employee count. When total tracked exceeds estimated, the number is highlighted in red — a fast visual signal that a job is over budget.

Most of what flows into this page is configured elsewhere:

To change…Go to…
Who can clock in (employee PIN management)App Settings → Employees
Which workstations support time trackingJob panel → Workstations tab → Allow Time Tracking per row
Per-job time estimates (used in budget vs actual)Job panel → Workstations tab → Estimated Time per row
End-of-shift auto-closeApp Settings → Cron Jobs (docs)
Forwarding time entries to external systemsApp Settings → Webhooks (docs)
Rename “Time Tracking” in the sidebarApp Settings → Naming

Changes take effect immediately — no refresh required.


  • Encourage the Kiosk / mobile flow first — it captures clean Start / Stop timestamps with no manual intervention. Use manual Add / Edit only to correct exceptions.
  • Always set workstation estimates on each job. Without them, the per-job Time Tracking tab can show actual time but has nothing to compare it against.
  • Pair this page with end-of-shift cron jobs. Without auto-close, employees who forget to stop their timers will produce abnormally long entries. The cron prevents that and is invisible to the floor.
  • When editing entries, leave a reason in the Note field. The note ends up in the job log permanently — your future self (and any auditor) will thank you.
  • Combine with time_log_saved webhooks to push hours into your payroll provider or BI dashboard automatically — see Webhooks.
  • Use the search broadly — searching by an Order Ref No is the fastest way to see every minute of labor that has gone into a specific customer’s order. The dedicated Order picker is the more precise way once you know the customer; search is for “I’ll know it when I see it”.
  • For payroll, lean on the date range + Employee filter + Export. Pick the pay period in From / To, optionally narrow to one employee, glance at the Total time card to spot-check, then Export to Excel for the actual payroll file.
  • For job costing, combine Order or Job with the date range. Filter to one Order across the calendar period the work was done, then read the Total time card and compare against the estimate on the per-job tab.
  • Audit anomalies before editing. A timer that ran for 18 hours is almost always not an actual 18-hour shift — it’s a forgotten clock-out. Check the job log notes for Auto-closed by cron job: … markers; those are cron-introduced and can be safely shortened to the real end of shift.
  • The summary always matches what you’d export. If you ever want to sanity-check the Excel file, glance at the Entries card first — the number of data rows in the downloaded .csv will match (minus the header row).