Staff and labor
Staff records, schedules, time clock, tip pools, and labor reporting.
Staff are User records with restaurant fields. There are screens for the staff list, the weekly schedule, the time clock, tip pools, and labor reporting.
Staff data
A user record can store:
- staff role: server, bartender, host, cook, manager, admin, busser, chef
- employee ID, hire date, and hourly rate
- phone number and photo
- a PIN field (write-only; no screen in the app uses it)
- extra staff permissions as JSON
- onboarding status
- emergency contact name and phone
- certifications
- active or inactive status
What a user can do is set by their Role, not by staffRole. Inactive users lose access.
Screens
| Route | What it does |
|---|---|
/dashboard/platform/users | Staff list with role filter, create and edit drawers |
/dashboard/platform/staff/schedule | Weekly roster ("Staff Roster"). Not in the sidebar |
/dashboard/platform/time-clock | Clock in and out, breaks, attest, corrections, approval, CSV export |
/dashboard/platform/staff/tips | Tip pools and ledger with CSV export. Not in the sidebar |
/dashboard/platform/reports/labor | Labor report |
Weekly schedule
Managers create and edit shifts with upsertShift: staff member, role (server, bartender, host, busser, cook, dishwasher, manager), start and end time, and hourly rate. updateShiftStatus takes start, complete, cancel, or no_show. Both need canManageStaff.
Time clock
Each employee runs their own clock with recordRestaurantAttendance:
clock_inlinks to the employee's scheduled shift if there is one, and marks it startedstart_breakandend_breakclock_outcloses the entry and completes the shiftattestlets the employee confirm a closed entryapprove_timemust come from a different user with staff management permission
Closed entries can only change through a correction. The employee asks with requestRestaurantTimeCorrection and a different manager approves with approveRestaurantTimeCorrection. restaurantAttendance lists entries for a date range.
Tip pools
Tip pools use cash and credit tip amounts for one business day. Types are:
- Individual: all tips to one staff member
- Pool by role: weighted by role
- House pool: split by hours worked
previewRestaurantTipPool shows the split before saving. createTipPoolLedger saves it with a source note. updateTipPoolStatus with distribute records the payout with a reference. Every tip-eligible time entry for that day must be closed, attested, and manager-approved first.
Labor report
The labor report combines approved attendance, completed-order sales, and calculated or distributed tip pools. It shows hours, payroll cost, labor percentage, sales per labor hour, tips, and role breakdowns. It can filter by role.
How teams use it
Create staff records
Add the user, their role, hourly rate, and contact details.
Build the schedule
Assign shifts for the week.
Run the time clock
Staff clock in and out. They attest closed entries and a manager approves them.
Pool tips and review labor
Preview and save the day's tip pool, mark it distributed, then review the labor report.
Current limitations
- There is no PIN login or shared-terminal clock-in. Staff clock in under their own signed-in session.
- There is no payroll integration. Time and tips export as CSV only.
staffRoleis a label. Permissions come only from the linkedRole.
Approvals for time, time corrections, and refunds or voids must come from a different user than the requester.