GPS geofencing, overtime rules, break policies, clock-in/out, timesheet review, payroll export, and workforce analytics — inspired by TSheets, ClockShark, and BusyBusy.
TimeclockSettings — overview hub for all timeclock config
useQuery(api.timeclock.settings.get), useMutation(api.timeclock.settings.update)
GeofenceConfig — per-job or global geofence settings
useQuery(api.timeclock.geofence.get), expo-location, MapView
OvertimeRulesConfig — FLSA + state-specific OT rules
useMutation(api.timeclock.overtime.update), Ohio R.C. 4111.03
BreakPolicyConfig — company break rules and auto-deduction
useMutation(api.timeclock.breakPolicy.update), push notification triggers
TimeclockInterface — primary clock-in/out with GPS verification
useMutation(api.timeclock.clockIn), useMutation(api.timeclock.clockOut), expo-location
| Name | Mon | Tue | Wed | Thu | Fri | Sat | Total | |
|---|---|---|---|---|---|---|---|---|
MR Marcus |
8.0 | 8.5 | 8.0 | 9.0 | 8.0 | 4.0 | 45.5 | |
JW James |
8.0 | 8.0 | 7.5 | 8.0 | 7.0 | - | 38.5 | |
AK Amy |
8.0 | 8.0 | 8.0 | 8.0 | 8.0 | - | 40.0 | |
DP Derek |
8.0 | 8.0 | 8.5 | 8.5 | 8.0 | 5.0 | 46.0 | |
LS Lisa |
6.0 | 7.5 | 7.0 | 6.0 | 6.0 | - | 32.5 |
TimesheetReview — weekly grid with approve/reject per row
useQuery(api.timeclock.timesheets.listForWeek), useMutation(api.timeclock.timesheets.batchApprove)
| Name | Reg | OT | DT | Total |
|---|---|---|---|---|
| Marcus R. | 72.0 | 11.5 | - | $3,412 |
| James W. | 76.0 | - | - | $2,736 |
| Amy K. | 80.0 | 4.0 | - | $3,120 |
| Derek P. | 68.0 | 8.0 | 4.5 | $3,465 |
| Lisa S. | 64.5 | 4.5 | - | $2,105 |
PayrollExport — multi-format payroll export with preview
useMutation(api.timeclock.payroll.export), ADP/Gusto/QB/CSV formatters
TimeclockAnalytics — workforce metrics and labor cost insights
useQuery(api.timeclock.analytics.dashboard), Recharts bar/line components
timeclockSettings {
contractorId: Id<contractorUsers>
gpsEnabled: boolean
geofenceEnabled: boolean
geofenceRadiusFt: number (50-500)
autoClockOutMinutes: number (default 720)
verificationFreqMin: 5 | 15 | 30
autoPauseOnExit: boolean
trackBetweenJobs: boolean
}
overtimeRules {
contractorId: Id<contractorUsers>
weeklyOtEnabled: boolean
weeklyOtThreshold: number (hours)
weeklyOtMultiplier: 1.5 | 2.0
dailyOtEnabled: boolean
dailyOtThreshold: number (hours)
doubleTimeEnabled: boolean
doubleTimeThreshold: number (hours)
holidayMultiplier: number
holidays: string[] (ISO dates)
autoCalculate: boolean
stateCompliance: "OH" | "CA" | "federal"
}
breakPolicy {
contractorId: Id<contractorUsers>
breakType: "paid" | "unpaid" | "mixed"
breakDurationMin: 15 | 30 | 60 | custom
autoDeduct: boolean
autoDeductAfterHours: number
breakReminders: boolean
managerAlerts: boolean
}
timeEntries {
contractorId: Id<contractorUsers>
employeeId: Id<contractorUsers>
jobId: Id<jobs>
clockInAt: number (timestamp)
clockOutAt: number?
clockInLocation: {lat, lng, accuracy}
gpsSnapshots: [{lat, lng, ts}]
breakMinutes: number
overtimeMinutes: number
status: active | completed | adjusted
}
settings.update(fields)
→ updated timeclockSettings
overtime.update(rules)
→ updated overtimeRules
breakPolicy.update(policy)
→ updated breakPolicy
clockIn(jobId, lat, lng)
→ {entryId, geofenceStatus}
clockOut(entryId, lat, lng)
→ {duration, otMinutes}
startBreak(entryId, type)
→ {breakId, startedAt}
timesheets.batchApprove(
timesheetIds[])
→ {approved, rejected}
payroll.export(
format, dateRange)
→ {fileUrl, summary}
settings.get()
→ timeclockSettings
geofence.get(jobId?)
→ {center, radius, status}
activeEntry.get()
→ current clock-in or null
timesheets.listForWeek(
weekStart)
→ [{employee, daily, total, ot}]
payroll.preview(
format, dateRange)
→ {employees, regH, otH, totPay}
analytics.dashboard(
dateRange)
→ {avgHours, otRate, onTime%,
gpsCompliance%, otTrend[],
laborByJob[]}
Hooks:
useTimeclock() — clock state
useGeofence() — location check
usePayrollExport() — formatter
expo-location
GPS, background location
Geofencing API (enter/exit)
react-native-maps
MapView + Circle overlay
Job site pin markers
Payroll Exporters
ADP Workforce Now (CSV)
Gusto (CSV import format)
QuickBooks Time (IIF)
Generic CSV/PDF
Push Notifications
Break reminders
Geofence exit alerts
Auto clock-out warnings
Compliance Engine
OH R.C. 4111.03 (FLSA)
State-specific OT rules
Break law requirements
TSheets / QuickBooks Time
Geofence auto clock-in/out
QB payroll integration
Facial recognition + GPS
ClockShark
GPSFence (adaptive GPS)
Battery-aware frequency
Construction-first UI
BusyBusy
Dynamic geofences (resize)
Elevation-aware tracking
On-site verification gate
Homebase / Deputy
Break compliance engine
Multi-format payroll export
Scheduling integration
Clockify
Analytics dashboard UX
Timesheet approval flow
| Name | Mon | Tue | Wed | Thu | Fri | Sat | Total | |
|---|---|---|---|---|---|---|---|---|
MR Marcus | 8.0 | 8.5 | 8.0 | 9.0 | 8.0 | 4.0 | 45.5 | |
JW James | 8.0 | 8.0 | 7.5 | 8.0 | 7.0 | - | 38.5 | |
AK Amy | 8.0 | 8.0 | 8.0 | 8.0 | 8.0 | - | 40.0 | |
DP Derek | 8.0 | 8.0 | 8.5 | 8.5 | 8.0 | 5.0 | 46.0 | |
LS Lisa | 6.0 | 7.5 | 7.0 | 6.0 | 6.0 | - | 32.5 |
| Name | Mon | Tue | Wed | Thu | Fri | Sat | Total |
|---|---|---|---|---|---|---|---|
| Marcus R. | 8.0 | 8.5 | 8.0 | 9.0 | 8.0 | 4.0 | 45.5 |
| James W. | 8.0 | 8.0 | 7.5 | 8.0 | 7.0 | - | 38.5 |
| Amy K. | 8.0 | 8.0 | 8.0 | 8.0 | 8.0 | - | 40.0 |
| Derek P. | 8.0 | 8.0 | 8.5 | 8.5 | 8.0 | 5.0 | 46.0 |
| Lisa S. | 6.0 | 7.5 | 7.0 | 6.0 | 6.0 | - | 32.5 |