← Back to blog

15 August 2026 · 6 min read

How Payroll Should Be Calculated From Attendance: Present, Late, Half-Day, Absent Explained

A lot of payroll disputes come down to one thing: payroll and attendance being tracked in two separate systems that don't agree with each other by the time salaries are calculated. The fix isn't more spreadsheet reconciliation — it's making payroll read directly from attendance records instead of a manually re-entered summary.

Present vs. late — decided by arrival time

This one's straightforward in principle: compare the check-in timestamp to the shift's configured start time, plus a grace period (commonly 10–15 minutes) to absorb minor delays without penalizing them. Arrive within the grace window and it's present; arrive after it and it's late.

The important detail is where this decision happens. If it's calculated on the employee's phone and trusted as-is, a manipulated device clock can turn a late arrival into an on-time one. Recomputing it server-side, from the shift configuration stored in the company's own settings, closes that gap — the client's guess is provisional, the server's number is what actually lands on the payslip.

Half-day — decided by how long they actually stayed

Arrival time alone misses a real scenario: an employee checks in on time, then leaves after two hours. Left unhandled, that day still reads as a full present day in payroll — which is how a lot of attendance systems end up quietly overpaying for partial days.

The fix is a second check at checkout: calculate the actual worked duration (checkout time minus check-in time) and compare it against a configurable half-day threshold — 4 hours is a common default for an 8–9 hour shift. Fall under it, and the day gets reclassified from present or late to half-day, which payroll should treat as 0.5 of a working day rather than a full one.

Absent — the day nobody punched at all

A day with zero attendance record isn't automatically "absent" — it might be a holiday, a non-working day, or a day covered by approved leave, each of which needs to be excluded before anything gets marked absent. Once those are ruled out, a scheduled sweep (commonly run once daily, after a configurable cutoff time) marks any employee with no punch that day as absent for that working day.

This sweep needs to run automatically, on a schedule, rather than depending on someone to notice and mark it manually — a missed no-show that never gets flagged is the single easiest way for attendance and payroll to quietly drift out of sync over a few months.

Why this should feed payroll directly

Once present/late/half-day/absent/on-leave counts exist as real, server-validated records for the month, payroll becomes a calculation over that data — days employed × per-day rate, minus loss-of-pay for unapproved absences, minus any half-day deductions — rather than a manually retyped summary someone has to keep matching against a separate attendance register by hand. Fewer manual steps between attendance and payslip means fewer numbers that can quietly stop matching each other.

See it running on your own team

First month free, unlimited employees. No credit card required.

See pricing →