Configure shifts once.
Workspace runs itself.
Shift CRUD. Per-employee overrides. Grace period for late marking. Auto-close cron at shift end. Late/early flag computation on every session.
5 fields. That's it.
Manage at /settings/hr/shifts.
"Day Shift", "Night Shift", "Weekend Crew" — labels you pick.
"09:00 → 18:00" in workspace timezone. Crosses midnight if needed.
Mon-Fri / Mon-Sat / custom (e.g., Tue-Sat for a media schedule).
Minutes after start before a clock-in counts as late. Default 15. Configurable per shift.
Allowed break per session. Used to validate session lengths + paid-hours math.
One shift per workspace can be the default. Used when no per-employee override is set.
Not everyone works 9-6.
Default shift covers 90% of your team. For the night-shift designer or the part-time content writer, override at /settings/team.
Workspace default
Set in the HR wizard. Applies to every employee unless overridden.
Per-employee
Override at /settings/team → click employee → assign shift. Takes effect on next clock-in.
Late/early flags
Computed on every session via lib/attendance/shift-resolver. Flag visible on personal calendar + HR overview.
For when people forget.
/api/cron/attendance-auto-close fires at shift end + grace period. Closes any still-open sessions. Marks them AUTO_CLOSED so the audit distinguishes a real clock-out from a system one. Idempotent — running twice in the same window doesn't double-close.