Vertical packs
Staff Scheduling (Restaurants)
Indicative price, not an offer: €29/mo; shift scheduling, labor-cost analytics, shift-swap requests
Generated from docs/plan/paid/staff-scheduling/PLAN.md in the AstroBaaS repository. Nothing described below is implemented — it is the written plan for it.
Shift scheduling for restaurant staff with labor-cost tracking and overtime alerts. Define shift templates (opening, closing, server, kitchen). Assign staff to shifts by date and role. Track labor costs by day/role. Shift-swap requests let employees trade shifts. Analytics show turn-over, cost vs budget, understaffing alerts.
The problem
Manual shift scheduling is error-prone and leads to understaffing. Manager manually texts staff, tracks responses in spreadsheet. No visibility into labor costs, overtime, or understaffing until service starts. 7shifts costs €25/mo; Toast €65/mo built-in.
What it does
- Shift templates (opening, closing, server, kitchen roles)
- Assign staff to shifts (date, time, role)
- Shift-swap requests (employee requests swap, manager approves)
- Labor cost tracking (hourly rate * hours per shift)
- Overtime tracking (hours > 40/week flagged)
- Staff availability calendar (mark unavailable dates)
- Shift reminders (SMS/email: ‘Your shift is tomorrow 6pm’)
- Compliance tracking (max hours/day, break requirements)
- Analytics (labor cost by day, by role, understaffing alerts)
- Attendance board (track no-shows)
What it deliberately does NOT do
Each boundary carries its reason. A boundary without a reason gets crossed by the next person who reads this.
- Clock-in/clock-out timekeeping — separate POS/timekeeping system. Reason: different vendor.
- Payroll processing — jurisdiction-specific tax rules. Reason: third-party payroll vendor owns this.
- Automatic labor-law enforcement — varies by jurisdiction. Reason: manager must review + approve.
Data model
New tables: shifts (shiftId, date, startTime, endTime, role, assigned_staff_id, status (scheduled/completed/no_show)). staff_availability (staffId, unavailableDate). shift_swaps (swapId, shiftId, requested_by, proposed_for, status (pending/approved/declined), manager_id, created_at). Staff schema: add hourlyRate, maxHoursPerWeek. Audit: all shift assignments, swaps, no-shows. Migration: add tables + indexes on date + staff_id.
API
- GET /api/admin/schedule
- POST /api/admin/shifts
- PUT /api/admin/shifts/{shiftId}/assign
- POST /api/staff/{staffId}/availability
- POST /api/staff/{staffId}/shift-swap-request
- GET /api/admin/shift-swaps
- PUT /api/admin/shift-swaps/{swapId}/approve
- GET /api/admin/labor-report
- GET /api/admin/understaffing-alerts
Every route added here must also appear in src/pages/openapi.json.ts — a test
fails the build if it does not.
Admin
Scheduling calendar (drag-drop assign). Shift template manager. Bulk assignment (all servers Friday evening). Swap request queue. Labor-cost dashboard. Overtime alerts. Attendance board (call-outs).
The seam — why this is paid
Core owns: shift + staff schema, assignment logic, basic analytics. Paid pack owns: labor-cost tracking, overtime alerts, compliance rules (break tracking, max hours).
Support commitment: labor-law compliance, overtime tracking, scheduling SLA
Dependencies
- Staff/employee system
- Notification system (SMS/email)
- Audit log
Acceptance checks
Each of these must be able to fail. Before claiming this is done, break the code deliberately and watch each one go red.
- Admin creates Friday dinner shift: 6pm-11pm, server role, capacity 2
- Admin assigns Alice and Bob to shift
- Alice requests swap with Charlie; manager approves, Charlie assigned
- Labor report shows Friday: 2 staff * 5 hours * €15/hr = €150
- Overtime alert: Alice has 45 hours this week (threshold 40), flagged
- Alice marks herself unavailable Sept 1-3; shifts on those dates skip her
- Shift reminder SMS: ‘Hi Alice, you’re scheduled tomorrow 6pm-11pm’
- Understaffing alert: Friday evening has 1 server (need 2)
- Attendance board shows ‘No-show’ for Bob on Friday (scheduled but didn’t work)
- Schedule export to PDF: all shifts next 2 weeks, staff assignments, times
Risks
Overtime not tracked correctly (weekend hours missing, shows 35 instead of 45). Shift swap creates double-booking (both assigned same shift). SMS fails: staff thinks off, doesn’t show. Labor-cost uses deleted rate (old rate orphaned, calculation breaks). Compliance rule (6-hour break) not enforced.
Commercial context
| Suggested price | €29/mo; shift scheduling, labor-cost analytics, shift-swap requests |
| Rival anchor | Toast: €65/mo built-in; 7shifts: €25/mo; custom: €1500+ |
The anchor is what the nearest equivalent charges on Shopify or Magento today. It is context for a pricing decision, not the decision.
Generated from the commerce plan. See docs/COMMERCE-PLAN.md for the full
catalogue and ../../AI-GUIDE.md for how to work on this repository.