```
How TrackDots tracks, measures, and calculates analytics
TrackDots uses a lightweight background agent that runs on the employee's Mac. It monitors activity signals every 10 seconds and syncs data to the server every 3 minutes.
An activity block is a 10-minute window of recorded activity — the fundamental unit of all analytics.
Each block stores: start/end time, key count, mouse clicks, mouse distance, primary app, window title, idle flag, and a screenshot.
The app with the most active ticks during the block wins the "primary app" label. If VS Code was active for 35 of 60 ticks and Chrome for 25, the block is labelled VS Code.
Marked idle if system idle time exceeds 5 minutes at block finalisation. Excluded from productivity scores but visible in the work diary.
If two blocks overlap by more than 50% of the incoming block's duration, the newer block is discarded. This prevents duplicate entries from multiple agent processes.
The agent captures the active window's title at each 10-second tick. The most frequent window title during the block is stored alongside the app name.
The window title is shown in the Work Diary block card and in the screenshot lightbox. It gives managers context about what the employee was working on within an app — not just which app was open.
Employees must enter a task name before starting a session — this is required, not optional. The task is shown in the app's main window and recorded as a task session on the backend.
A task session records: the task name, start time, end time, and duration. When a task changes, the previous session is closed and a new one opens automatically with no gap in tracking.
Click the green Done button next to the task input to mark the current task complete. The input clears and refocuses — enter the next task immediately to avoid untracked time. Completed tasks appear with a strikethrough in the work diary.
The Tasks tab in the Work Diary shows a doughnut chart of how tracked time was distributed across tasks. Each activity block's time is attributed to whichever task(s) overlapped it. Any block with no matching task appears as "Untracked".
You can sign in using either your username or your email address — both are accepted on the login form.
Once logged in, the sidebar shows your organisation name below the TrackDots logo. This confirms you are signed into the correct account, which is especially useful when first enrolling or if you belong to multiple organisations.
New organisations sign up at /signup/. After filling in company details and choosing a plan, you will receive a verification email. Clicking the link in that email activates your account. Free-plan accounts activate immediately; paid plans redirect to Stripe Checkout to complete payment before access is granted.
Staff users can manage the number of seats (active members) on their plan from Manage Seats in the sidebar. See the Seats & members section below for details.
A 0–100 score representing quality of work. Combines three signals:
Based on keystrokes + mouse clicks per minute of active time. More input = higher score up to a ceiling.
Based on time in productive vs unproductive apps:
Rewards steady work across the day. A full day of consistent blocks scores higher than 2 intense hours followed by nothing.
Each block has a confidence score (0–100) indicating how reliably the data reflects real work. High confidence = many keystrokes, clicks, and mouse movement. Low confidence = minimal input activity, possibly reading or away.
If the computer has been idle for more than 5 minutes at block finalisation, the block is marked idle. Idle blocks are excluded from productivity calculations.
A block may be technically "active" (not idle) yet contain very little real work — for example, an employee who left a productive app open while away from the keyboard. Low-quality block filtering identifies these blocks using two configurable thresholds and treats them like idle time.
A block is flagged as low-quality if either of the following is true:
Low-quality blocks are highlighted in amber in the Work Diary and Screenshots view. Each block carries a "LOW QUALITY" badge. They are excluded from the daily productivity score calculation but their time is still visible.
There are two exclusion modes, toggled in Settings → Low-Quality Block Thresholds:
From the team overview Low Quality Activity card, click any employee row to open their Work Diary filtered to only low-quality blocks (?lq=1 URL parameter). A banner appears at the top of the diary indicating the filter is active; click "Show all blocks" to clear it.
A focus session is a period of uninterrupted deep work. Consecutive blocks with a gap less than 120s are merged. If the merged session exceeds 30 minutes, it counts as a focus session.
Both thresholds are configurable in Settings.
A per-employee daily view of all activity. Navigate by day using the date bar at the top. Contains five tabs:
The right sidebar on the Activity tab shows two cards: Meetings (meeting sessions for the day with start/end times, duration, and approval status) and Breaks (manual pause sessions). Staff users see a "Review all meetings →" link to the Meeting Approvals page.
Append ?lq=1 to the diary URL (or click any employee from the Low Quality team card) to show only low-quality blocks. A dismissible amber banner at the top indicates the filter is active. Clicking the × clears the filter and returns to the full diary view.
The team overview dashboard shows a "Low Quality Activity — Today" card listing every employee who has low-quality blocks today. For each employee it shows:
Clicking an employee row opens their Work Diary for today, pre-filtered to show only low-quality blocks (?tab=activity&lq=1).
The card only lists employees with at least one low-quality block. If no one has low-quality activity today, the card shows an "All clear" message.
Determined by active (non-idle) blocks recorded for that day.
The "full day" threshold is configurable via Min daily hours in Settings.
Past weekdays with no tracked activity show an A cell (amber background) with an "Absent" tooltip. Today with no activity shows a dash (–) labelled "No activity yet" — it is not marked absent until the day ends. The employee's row summary shows the absent count in red next to their days-present count (e.g. 15/22 days · 3 absent).
The daily average shown per employee is calculated only over days when they were actually present — absent days are not counted in the denominator. This avoids leave periods understating a person's typical working hours.
Daily productivity score as a line chart over 14, 30, or 60 days. The trend arrow compares first half vs second half of the period:
Flags employees whose work patterns deviate from expected norms. All thresholds configurable in Settings.
Analyses last 14 days per employee. Unlike competitors who only flag underperformance, TrackDots also flags overwork.
Absent days are always excluded from signal calculations — only weekdays where the employee was actively tracked count. If the "No breaks" badge shows 3 days, hover over it to see exactly which dates those were. This makes it clear the signal is about real working days, not days off.
The burnout window is always the last 14 calendar days. An employee who was recently absent but worked hard without breaks earlier in that window will still show the signal — this is intentional.
Time in each app measured by block duration where that app was primary. Colour-coded by category: 🟢 Productive, ⚪ Neutral, 🔴 Unproductive. Click any app row to see per-employee breakdown.
Shows active vs idle ratio. An employee who tracked 8h but was idle 3h has 62% efficiency — different from raw hours.
GitHub-style grid showing daily productivity score over 30–90 days. Darker green = higher score. Hover any cell for exact date and score.
Side-by-side comparison of two employees across 7 metrics. Green = better value, red = lower. Also shows a daily hours table for each day in the period.
Scans all employees over the last 30 days and flags unusual work patterns. Each employee is assigned a severity: Critical, Warning, or All Clear.
Each employee card shows a 30-day activity sparkline. Critical cards auto-expand on load. The summary strip at the top shows total Critical / Warning counts across the team.
The Projects module tracks work across named projects. Employees select a project in the desktop app before starting a session — all activity blocks and task sessions are then attributed to that project.
The projects list shows all active projects with: total hours logged, budget usage bar, deadline, phase, and status. Filter by status using the tab bar (Active, Planning, On Hold, Completed).
Set a budget in hours and a deadline date on any project. The project profile then shows:
A composite 0–100 score shown on every project profile. Built from four equal dimensions (0–25 each):
Displayed as an arc gauge dial with a colour-coded label. If no budget or deadline is set, those dimensions default to a neutral 15/25 to avoid penalising projects that don't need them.
The project profile aggregates all logged task sessions into a per-task summary table (filtered by the selected date range):
Tasks are sorted by total time descending. The daily activity chart above shows hours stacked per team member per day with a 7-day rolling average trend line.
Generate reports from the Export page in the dashboard. Choose a date range and report type, then download immediately.
Automatically email reports on a recurring schedule. Manage schedules from the Report Schedules page.
Schedules are processed by the send_scheduled_reports management command — run it via a server cron job every hour. Use --dry-run to preview without sending, or --force to send all active schedules immediately regardless of time.
Add private notes to any employee's profile — visible only to staff users (managers/admins). Useful for recording performance observations, HR conversations, or follow-up items without cluttering the activity view.
Similarly, Project notes can be added to any project profile for internal team communication about that project.
Meeting Mode lets employees flag time spent in a meeting directly from the desktop app. Tracking continues normally — so no gaps appear — but the time is marked as meeting time and routed through a staff approval workflow before counting toward tracked hours.
While a session is active (tracking or paused), a purple Meeting Mode toggle appears in the app above the ring. Clicking it opens a modal where the employee can optionally add a note (e.g. "Team standup", "Client call") or pick from quick presets. Clicking Start opens the meeting session on the server.
Turning the toggle off ends the meeting silently — no prompt is shown. The meeting is recorded with start and end timestamps.
If the tracking session is stopped while meeting mode is on, the meeting is automatically closed at the same time.
Any activity block where ≥ 50% of its duration falls within a meeting session's time range is tagged as a meeting block. In the Work Diary these blocks show a purple 📅 MEETING chip instead of the usual LOW QUALITY or APPROVED badge, and the card background is tinted purple.
The approve/revoke button is replaced by a status label that mirrors the meeting's approval state:
Meeting blocks cannot be independently approved or revoked — their status is controlled entirely by the meeting approval.
Screenshots taken during a meeting are dimmed (60% opacity) in the Screenshots tab and show a purple Meeting badge with the approval status. They are not hidden — they remain visible for transparency — but are visually distinguished from regular screenshots.
Approved meeting time is always treated as 100% productive, regardless of activity levels, productivity score, or confidence thresholds. This means:
Pending or rejected meeting blocks are scored normally by the standard scoring engine.
Staff users see a Meeting Approvals link in the sidebar navigation. The page lists all meeting sessions across the team, filterable by status: Pending, Approved, Rejected.
Each entry shows the employee name, date, start/end time, duration, note, and current status. Pending sessions have Approve and Reject buttons. Approved/rejected sessions show who reviewed them and when.
Meeting sessions are also visible in the employee's Work Diary sidebar (the Meetings card) with colour-coded status badges.
Staff users can view and adjust the number of active members on their plan from the Manage Seats link in the sidebar (visible when on a paid plan).
Each active employee with a registered device or a staff profile assigned to your organisation counts as one seat. The sidebar plan widget shows your current usage as X / Y members with a colour-coded bar — green, amber at one seat remaining, red when full.
On the Manage Seats page, use the +/− picker to set a new seat count. The live preview updates the monthly (or annual) total as you change the number. Saving will:
To deactivate a member, go to Employees and click Deactivate next to their name. Deactivated employees retain all their historical data but no longer count toward the seat limit. Once a member is deactivated, you can reduce the seat count below their previous total.
Every employee is automatically assigned a distinct avatar colour derived from their username. This makes it easy to visually identify team members across all dashboard views — the same colour is used in the employee list, attendance grid, weekly report, burnout page, and everywhere else an avatar appears.
Staff users can override the auto-derived colour from the Edit modal on the Employees page:
The chosen colour is stored per employee and persists across sessions. Employees without a custom colour always get the same auto-derived colour — it never changes randomly.
By default TrackDots ships with a global list of app classifications — productive, neutral, and unproductive. Organisations can override these defaults with custom per-org rules in Settings → App Rules.
An admin can add app-specific rules that override the defaults for your organisation. For example, if your team uses YouTube for training, you can reclassify it as Productive. Rules are matched by app name (case-insensitive).
TrackDots supports a dark colour scheme for the dashboard and all public pages. Dark mode is comfortable for extended use and reduces eye strain in low-light environments.
Click the sun / moon icon in the top-right of any dashboard page (next to the notification bell) to switch between light and dark mode. Your preference is saved in localStorage and remembered across sessions on the same browser.
If you have not manually toggled dark mode, the dashboard follows your operating system preference (macOS System Settings → Appearance, or Windows Settings → Personalisation). The dashboard automatically switches when you change your OS setting.
TrackDots exposes a read-only REST API for integrating time data into external systems (ERP, payroll, HR platforms).
Pass your API key in the request header:
emails — comma-separated employee emails (required, max 50)date — single day YYYY-MM-DDdate_from + date_to — date range (max 90 days)API keys are managed by an admin. Keys are scoped to your organisation — they cannot access data from other organisations.