TL;DR
Time reporting fails for social reasons and is fixed for technical ones. It fails because reporting is friction for the person doing it and value for somebody else. It is fixed by making the act take one tap, by making the record defensible three months later, and by keeping "what I say I did" and "what the company agreed" as two different facts. Here is what that looks like in practice.
The Sunday night problem
You know the shape of it. The hours arrive as a text message on Sunday evening, or on a note in the van, or not at all. Somebody in the office retypes them on Monday. Nobody remembers whether Thursday was three hours or three and a half. Nobody can say where the person was when the shift started. And by the time an invoice goes out, the hours on it are a reconstruction.
Every part of that is expensive, but the expensive part is not the retyping. It is that the reconstruction cannot be defended. When a customer questions an invoice in June for work done in March, "we think it was six hours" is not an answer.
One clock at a time
The first rule, and it is not negotiable: a person can have one open time entry.
Clocking in when there is already an open entry is refused, by name — "Anna is already clocked in". Not because two entries are untidy, but because two open entries mean the same hour counted twice: once on an invoice to a customer and once on a payslip.
The other half of that rule is where the app reads the clock's state from. It reads it from the server, not from what the device last did. A crew sharing one phone, or somebody who clocked in on a tablet in the workshop and is now holding their own phone, would otherwise be offered a button to start a shift they are already in the middle of.
Three kinds of time
Work, travel, overtime. Three, because three is what a service company distinguishes and a longer list is a list nobody chooses from correctly.
Travel is the one worth insisting on. It shows separately per person in the hours report, and it appears on the invoice basis as restid on its own line. It starts out unbilled and never carries ROT or RUT. A customer who is charged for travel can see what they are charged for; a customer who is not still sees that it happened.
There is also a billable flag, separate from everything else. A morning in the workshop is real time that nobody bills. Marking it unbillable is not the same as deleting it, and the difference shows up later.
The duration is computed once
When an entry is closed, the paid minutes are calculated — elapsed time less the recorded break, never below zero — and stored. They are not recomputed when somebody reads the row.
This looks like an implementation detail and is actually the whole audit story. If the duration were derived on read, then an approved timesheet would change the day somebody edited a rounding rule. A March invoice would stop matching the March timesheet behind it, and nobody could explain why. An approved timesheet that changes after the fact is one nobody can defend.
Reported is not agreed
Four statuses, and the boundary between the second and the third is the point of the whole system.
Open — the clock is running.
Submitted — the person clocked out. That is all it means. Clocking out does not approve anything; the worker is done, and somebody else says whether the hours stand.
Approved — a second person, holding a separate permission, signed it off. Only approved hours reach an invoice basis.
Rejected — sent back, with a reason that stays on the row.
A field worker does not hold the approval permission. That is a deliberate split, not an org-chart accident: the hours that reach a customer were agreed by somebody other than the person who reported them, and that sentence is what makes the timesheet worth anything in a dispute.
The editability rule follows from it. An entry can be corrected while it is open, submitted or rejected. Once approved, it is somebody else's decision and may already be on an invoice basis — correcting it means rejecting it first, which leaves a trace. There is a longer post on approving without becoming the bottleneck.
A typed-in entry says so
When the office edits a start or end time, the entry records that the time came from the office rather than from a clock.
An entry typed in afterwards is not a clock-in. A timesheet that cannot tell the two apart cannot be audited, and the day somebody asks — the customer dispute, the union question, the tax audit — is the day you find out whether yours can.
The same applies to the position recorded at a clock-in: it is stamped as having come from the phone's GPS or as having no reading at all. There is a whole post on what GPS in a field app can honestly do.
Employees are not licences
Worth repeating here because it changes what you can ask of a crew.
A person who can be scheduled and a person who signs in are separate records, and the link between them is optional. Somebody can sit on the board with working hours, skills and a colour, for a whole season, without an account. The people who use the field app to clock in have accounts and count as licences.
So the question "do we have to pay for every hand in the field" has a real answer: only for the ones who report their own time. In practice you want that to be everybody, because the alternative is a supervisor entering four people's hours from memory — and then every entry is a typed-in entry, which is exactly the record you were trying to get away from.
Getting it used
The technical parts above are necessary and not sufficient. What actually moves adoption, in order:
One tap, on the screen they already opened. The clock sits above everything else on the field app's home screen, because that is what the app is opened for eight times a day and anything above it is in the way.
Tie the clock to the job. When somebody clocks in while a job is in progress, the hours land on that job rather than in a general pool that somebody has to sort out later. That is the difference between a timesheet and an invoice basis.
Do not make the reason mandatory. A note field people can use is used. A note field people must fill in produces the word "arbete" fourteen thousand times.
Show them the approval. The fastest way to make reporting feel pointless is to have it disappear into the office. A crew that sees its week approved on Monday morning reports on Friday afternoon.
Correct, do not overwrite. When an entry is wrong, reject it with a reason and let the person fix it. Silently editing somebody's hours is how a team learns the numbers are the office's numbers and stops caring what they report.
What it is not
This is not a payroll system and it will not become one. It does not calculate collective-agreement supplements, it does not know about rest-period rules, and it does not produce a payslip. What it produces is an hour, attached to a person, a job and a customer, that somebody approved. That hour exports as part of an invoice basis in CSV; there is no payroll file and no payroll export.