TL;DR
Approval is the step everybody wants to skip and the only thing standing between "I worked nine hours" and an invoice. Done monthly it is a day of work and a fortnight of memory loss. Done weekly it is twenty minutes. This is how the mechanism is built, and how to run it so it is not you that the month waits for.
Why the step exists at all
One sentence: the hours that reach a customer were agreed by somebody other than the person who reported them.
That is the entire value. It is why approval is a separate permission rather than a checkbox, and why a field worker does not hold it. When an invoice is questioned in June for work done in March, the useful answer is not "the system recorded nine hours". It is "nine hours were reported, and Karin approved them on the 14th, and here is the entry she approved".
Everything below is in service of making that sentence survive contact with a real month.
A week at a time, in one action
Approval takes a list of entry ids and signs them off together, in a single transaction. Only entries that are actually in the submitted state move — an already-approved entry in the list is left alone rather than re-approved, which keeps a careless second click from restamping who agreed to what and when.
The practical shape is a supervisor selecting a person's week, or a team's week, and approving it once.
The rate is frozen at approval
This is the detail that saves the most arguments and gets noticed the least.
When an entry is approved, the person's rate is copied onto the entry. Not referenced. Copied.
If the rate were read from the employee record at invoice time, then a pay rise in June would silently rewrite what March cost. Every historic report, every margin calculation and every invoice basis for work already done would shift under you, and nothing would record that it had.
Freezing it at approval means an approved hour has a price attached to it forever, and that price is the one that was true on the day somebody agreed to it.
Rejecting is how an approved entry gets corrected
An entry can be edited while it is open, submitted or rejected. Once approved, it cannot — it is somebody else's decision, and it may already be on an invoice basis.
Correcting one therefore means rejecting it first. Rejection requires a reason, the reason stays on the row, and the entry goes back to the person who reported it. The approval timestamp is cleared, so the row cannot look approved and rejected at once.
This is slower than editing in place, on purpose. Every correction leaves a trace of who asked for it and why, which is the thing you want in your hand the day the correction is questioned.
What the basis does with unapproved hours
It does not drop them. It says so.
When a job's invoice basis is built, the approved hours become billable lines and the reported-but-unapproved hours come back as a named warning with the total minutes and the number of entries behind them.
The reasoning: an invoice short by a day is a conversation with the customer, and the office should have that conversation before sending the invoice rather than after. A basis that quietly omits unapproved time looks complete and is not.
Three more warnings worth knowing about, because each names a problem you can only fix upstream:
Hours billed at nothing. An employee's rate is optional. With no catalogue price to override it, a person nobody gave a rate prices their whole day at zero — and the arithmetic is perfectly consistent about it, so the basis, the totals and the export all agree on a labour column reading 0,00. The office invoices the materials and finds the rest a quarter later, if at all. So it is reported instead, with the names attached, because the fix is a rate on an employee and somebody has to be told which one. The zero is not quietly corrected: this code cannot know what the hour should have cost, and a guess on an invoice is worse than a blank.
Hours billed at cost. Labour is billed at a billing rate kept apart from what the hour costs you. People who were set up before the two were split start with the billing rate equal to the cost, so the basis warns about hours billed at cost — a margin of zero should be a decision, not a leftover.
Approved but not billable. The morning in the workshop, the drive somebody waived. These are carried as zero-value lines with the reason attached rather than deleted, so the hours on the basis still add up to the hours on the timesheet. That reconciliation is what makes the document arguable in front of a customer.
The report you run on Monday
Time is reported per person with approved hours, billable hours, non-billable hours, hours awaiting approval, rejected hours and open entries.
Submitted time is shown beside approved time rather than folded into it. They are different facts — one is what somebody says they did, the other is what the company agreed to — and the gap between them is precisely what a supervisor is meant to act on before the month closes.
There is a utilisation report too, with one property worth understanding before you use it in a conversation about somebody's performance: for a person with no working-hours rules, the utilisation percentage is null, not zero and not a hundred. There is no denominator, and inventing one is how a report becomes a rumour that somebody staffs against.
Absences are deliberately not subtracted from available hours. Holiday is time the company paid for and did not sell; hiding it in the denominator would make a fortnight off look like a productive fortnight.
A weekly rhythm that works
Monday morning, twenty minutes.
- Open last week, exceptions first. Rejected entries, open entries nobody closed, and anybody whose submitted hours differ noticeably from their contracted hours.
- Deal with the open entries first. An entry still running from Thursday is somebody who forgot to clock out, and the longer you leave it the less anybody remembers.
- Approve the rest as a block. If the exceptions are handled, the remainder is ordinary work and reading each row individually is theatre.
- Then look at the invoice basis list, and work through the warnings until it is empty.
What not to do. Do not approve everything unread — the approval is worth exactly as much as the attention behind it, and a team learns within a fortnight which kind yours is. Do not batch a month; nobody remembers the second Tuesday. Do not let approval sit with one person who also drives; make it two people with the permission, and the week stops waiting for whoever is on a roof.
The bottleneck is almost never the approving
If approval takes more than half an hour a week for a team of twenty, the problem is upstream of approval. Usually one of three things:
- Hours arriving without a job attached, so somebody has to work out which customer they belong to. Fix it by having the crew clock in from the job rather than from the home screen.
- Entries with no rate, so the basis warns on nearly every job. Fix it by putting a billing rate on every employee once.
- Reporting that happens on Sunday, so approval is an act of archaeology. Fix it with the field app and one tap, which is the subject of time reporting people actually use.