Attendance
Who checked in today, what was on each rep’s call sheet, and what was missed — derived from the visits your reps file in KeyLink. About 4 minutes.
Route: /app/field/attendance — in the sidebar’s Field group, beside Field Team. Admin and internal roles only, like the rest of the rep management surfaces.
KeyOne has no clock-in. The only evidence it holds that a rep was at work is the visits they started, completed or skipped on their phone, so every figure on this page is derived from those — and a rep with nothing started is shown as exactly that, never as “absent”.
Daily activity
Pick a date (today by default). The page reads days in your browser’s time zone — it says which at the top — so a visit started at 00:30 in Johannesburg belongs to today, not to yesterday in UTC.
The four tiles
- Users checked in · of N — reps who started at least one visit that day, out of the reps in scope.
- Missed calls — stops still planned with nothing started, on a day that has arrived. A stop the rep skipped with a reason is not a missed call. For a date in the future the tile reads “no data” and says why: nothing can have been missed yet.
- Hours worked — the sum of recorded visit durations, or completion time minus start time where the phone sent no duration. A visit with neither is left out and counted: a note under the tiles says how many. When nothing was timed the tile reads “no data”, not 0.
- Tasks completed — forms filed that day.
Check-ins per rep
One group of bars per rep: unscheduled check-ins, scheduled check-ins, and scheduled stores (the size of the day’s call sheet).
What “scheduled” means here. A stop a manager booked from Field Planning is scheduled. A stop the rep planned themselves is unscheduled. KeyOne does not record an ad-hoc call separately from a rep-planned one — a visit is created as a plan either way — so “unscheduled” reads as “not booked by a manager”, and the chart’s caption says so.
A day with no visits at all shows “No visits recorded for …” rather than a row of zero-height bars.
Check-ins table
Every rep who started a visit that day, with time taken, time allocated, strike rate, stores visited and missed stops. Click a name to open the rep’s page.
- Time allocated is the rep’s configured work window (set in the rep record; see
/app/people/field-reps). Where none is configured the cell reads ”—” — the page never assumes 08:00–17:00 on a rep’s behalf. - Strike rate is completed ÷ scheduled. When nothing was on the sheet it reads ”—”: zero out of zero is not 0%.
- A
*after time taken marks a rep with at least one check-in that carries no duration.
Employee ID and mobile number are not stored in KeyOne, so those columns are absent rather than blank. Supervisor appears only when the org tree has a manager set for at least one rep (/app/people?tab=org-tree).
Missed check-ins
Reps who had at least one missed day in the 30 days ending on the chosen date, most missed first. A missed day is a day with stops on the sheet where every stop is still planned and untouched — no start, no skip, no completion. One skip with a reason makes it a worked day with a bad outcome, not an absence.
Attendants report
The same table over a period (the last 30 days by default, at most a year), one row per rep on the team — active reps always, an inactive rep when they have history in the period. Columns add days worked, days on sheet and days missed, and an Open rep → action per row.
Over a period, time allocated is the work window multiplied by the number of days the rep had stops on the sheet or check-ins (KeyOne has no calendar of working days); on a single day it is the window itself, whether or not the rep had stops.
Filters
- Channel — the outlet’s channel from the customer record (
/app/customers). Offered only when at least one customer has a channel recorded; an outlet with no customer record has no channel and drops out of a channel-filtered view. - Supervisor — the manager on the rep’s user record, from the org tree. Offered only when at least one rep has a manager set.
Izon’s company, supplier and client-role filters have no counterpart in KeyOne (one tenant is one company, and there is no supplier dimension), so they are not offered.
Where the numbers come from
Everything on this page is read live from the field visits table through GET /api/v1/field/attendance/daily and GET /api/v1/field/attendance/report; nothing is stored separately, and nothing waits for a warehouse load. The definitions above are the ones the server applies — see core/internal/field/attendance.go.