Time tracking, breaks, handovers and payroll
Clock in and out from any device, log breaks, hand over to the next shift, reconcile against the schedule, and export a payroll-ready CSV.
Time tracking turns the schedule into actual hours worked. Staff clock in from the web app, the mobile app, or a dedicated tablet view that lives near the back of house and is shared by the team.
Clock in and out
At the start of a shift the staff member taps Clock in on the tablet and selects their name from a list. A four-digit PIN protects each identity. Breaks are logged the same way (Start break / End break).
Reconciliation
Each clocked entry is matched against the scheduled shift. A discrepancy of more than five minutes (configurable) requires a manager to approve the entry before it is included in payroll. The approval queue lives at the top of the manager dashboard so it does not get forgotten.
Hourly rates
Hourly rates are set per staff member and per role. A server who occasionally helps in the kitchen can have different rates for the two roles, and the payroll export will compute each correctly.
Payroll CSV export
From Reports → Payroll, pick a date range and download a CSV compatible with most German and EU payroll providers. The schema is stable across Onboard releases.
staff_id,name,role,hours,gross_pay_eur,tips_eur
emp_001,Sara Klein,server,72.5,1015.00,184.20
emp_002,Lukas Maier,host,40.0,560.00,0.00
emp_003,Mia Weber,kitchen,80.0,1280.00,0.00
emp_004,Jonas Roth,server,45.25,633.50,108.75
emp_005,Anna Bauer,manager,80.0,1760.00,0.00Breaks and shift handovers
Every clock-in cycle can host zero or more breaks and is paired with a thread of handover notes attached to its scheduled shift. Both feed into the same dashboard so a supervisor sees one connected view.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| time_entries.clock_in_at | timestamptz | — | — | Stamped on insert by the clock-in action. The dashboard "X h Y min" duration ticks live against this value. |
| time_entries.clock_in_source | 'tablet' | 'mobile' | 'web' | 'manager' | — | — | Where the row originated. Manager-issued retroactive entries always carry the manager source. |
| time_entries.approved_by / approved_at | uuid / timestamptz | — | — | Set when a manager approves an entry from the discrepancy queue. Required for the row to leave the audit list. |
| shift_breaks.kind | 'scheduled' | 'unscheduled' | 'meal' | — | — | Meal breaks are payroll-relevant (often unpaid by law); scheduled vs. unscheduled drives the late-back-from-break warning. |
| shift_handovers.priority | 'low' | 'normal' | 'high' | — | — | High-priority notes are surfaced before the next team starts. is_pinned overrides this for items that should stay on top. |
RPC helpers
Two read-only Postgres functions support the weekly planner before publish:
- validate_week_draft(restaurant, from, to) returns every conflict in the window — double-bookings as error and over-hours-vs-contract as warning. Publishing while errors are present is blocked.
- shift_labor_cost(restaurant, from, to) returns per-employee hours and cost in cents, using each contract's hourly_rate. Drives the budget preview on the schedule page.