1 Clock In/Out
2 Timesheets
3 Team Time
Clock In — Ready
9:41
Ready to Work?

Select a job below and clock in to start tracking your hours.

Today's Status Not Clocked In
GPS Active — 742 Evergreen Terrace, Akron
Select a Job
Kitchen Remodel — Phase 2 1847 Highland Ave, Akron, OH
Bathroom Tile Install 563 Portage Path, Cuyahoga Falls

ContractorTimeClock — idle state

useQuery(getActiveEntry), useMutation(clockIn)

Clocked In — Active
9:41
02:34:15
Kitchen Remodel — Phase 2 1847 Highland Ave, Akron, OH
GPS Tracking Active

Activity
Clocked In7:06:45 AM — Within geofence
2.6hToday
24.3hThis Week
5Day Streak

ContractorTimeClock — active state + PulseRing

1-second interval timer, useMutation(clockOut)

Break Timer
12:15
Break Type
Lunch Break30 min standard
Short Break15 min
PersonalVariable
On Break
00:18:42
Lunch Break — Kitchen Remodel
Today's Breaks
48mTotal
2Breaks
30mLunch

Breaks do not count toward billable hours

BreakTimer — break type selection + running timer

useMutation(startBreak), useMutation(endBreak)


Daily Timesheet
5:30
Mon, Feb 24, 2026
Kitchen Remodel — Phase 2 7:06 AM – 11:45 AM 1847 Highland Ave, Akron
4h 39m
Lunch Break 11:45 AM – 12:15 PM
30m
Kitchen Remodel — Phase 2 12:15 PM – 3:30 PM
3h 15m
Bathroom Tile Install 4:00 PM – 5:15 PM
1h 15m
Daily Summary
9h 09mWorked
30mBreaks
100%GPS

DailyTimesheet — date-filtered entry list

useQuery(getEntriesForDateRange)

Weekly Timesheet
5:30
Week ofFeb 17 – 23, 2026
Draft

38.5Hours
14Entries
3Jobs
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Avg 6.4h/day 38.5h total
MondayFeb 17
Approved7.2h
TuesdayFeb 18
Approved8.1h
WednesdayFeb 19
Pending6.5h
ThursdayFeb 20
Flagged9.2h
FridayFeb 21
Approved7.5h

TimesheetDetail — weekly breakdown + submit

useQuery(getTimesheetForWeek), useMutation(submitTimesheet)

Timesheet — Flagged
5:30
Hours flagged for review — see details below
Kitchen Remodel — Phase 2Flagged
Clock In6:52 AM
Clock Out4:45 PM
Duration9h 53m

GPS mismatch — Location did not match job site at clock-in
Overtime — Entry exceeds 8h daily threshold
Admin Note

Please verify your location for the Thursday morning clock-in. GPS showed you at 2.3 miles from the job site.

Danny M. — Feb 21, 3:15 PM

TimesheetFlagged — flagged entry detail + admin note

useMutation(adjustEntry), GPS validation flow


Team Dashboard
2:15
5Clocked In
1On Break
2Off
Total Team Hours Today 34.7h
Team Members
MR
Marcus RodriguezKitchen Remodel
Working6.2h
JW
James WilsonBathroom Tile
Working5.8h
AK
Amy KowalskiDeck Build
Break7.1h
DP
Derek PatelRoof Repair
Working8.0h
TN
Tyler Nguyen
Off

TeamTimeDashboard — live team status

useQuery(getTeamStatus), contractor manager role

Team Member Timesheet
2:15
MR
Marcus Rodriguez Lead Installer
ActivePTO: 5 days
Week of Feb 17 – 23Pending
M
T
W
T
F
S
S
Total: 41.2h 3.2h OT
Monday, Feb 173 entries
7.8h
Tuesday, Feb 182 entries
8.5h
Wednesday, Feb 192 entries
7.1h
Thursday, Feb 203 entries
OT9.8h
Friday, Feb 212 entries
8.0h

TeamMemberTimesheet — individual review + approve

useQuery(adminGetTimesheet), useMutation(approveTimesheet)

Timesheet Approvals
2:15
Pending (3)
Approved
Rejected
3 timesheets awaiting review
MR
Marcus Rodriguez Feb 17 – 23 · 41.2h
OT: 3.2h
GPS OK
JW
James Wilson Feb 17 – 23 · 38.5h
GPS OK
AK
Amy Kowalski Feb 17 – 23 · 36.0h
GPS Issue
Recently Approved
DP
Derek PatelFeb 17 – 23 · 40.0h
Approved
LS
Lisa SimmonsFeb 17 – 23 · 37.5h
Approved

TimesheetApprovals — manager approval queue

useQuery(adminListSubmittedTimesheets), useMutation(approveTimesheet)

Reports & Export
2:15
Date Range
From
Feb 1, 2026
To
Feb 23, 2026
Report Type
Individual
Team
Project
Hours by Employee
Marcus R.
164h
James W.
138h
Amy K.
131h
Derek P.
150h
Hours by Job
Kitchen
42%
Bathroom
26%
Deck
17%
Roof
15%
Export Format
PDF
CSV
QB

TimeclockReports — export + visualization

QuickBooks integration, PDF/CSV generation


Data Architecture

Schema

timeEntries {
  contractorId: Id<contractorUsers>
  jobId: Id<jobs>
  clockInAt: number
  clockOutAt: number?
  clockInLocation: {lat, lng, accuracy}
  clockOutLocation: {lat, lng, accuracy}
  entryType: manual | auto_geofence | auto_prompt
  durationMinutes: number?
  status: active | completed | adjusted | voided
  timesheetId: Id<timesheets>?
}

timesheets {
  contractorId: Id<contractorUsers>
  weekStartDate: string (YYYY-MM-DD)
  totalMinutes: number
  status: draft | submitted | approved | rejected
  approvedBy: Id<adminUsers>?
}

Queries

getActiveEntry()
  → active clock-in or null

getEntriesForDateRange(
  startDate, endDate, limit)
  → [{clockInAt, clockOutAt, job...}]

getTimesheetForWeek(
  weekStartDate)
  → {totalHours, jobBreakdown, daily...}

listTimesheets(status?, limit?)
  → [{weekStart, hours, status...}]

adminGetEntries(
  contractorId?, jobId?, status?)
  → admin view of all entries

adminListSubmittedTimesheets(
  status?, limit?)
  → pending approval queue

Mutations

clockIn(jobId, lat?, lng?,
  accuracy?, entryType)
  → {entryId, clockedInAt, distance}

clockOut(jobId, lat?, lng?,
  accuracy?, notes?)
  → {entryId, durationMinutes}

adjustEntry(entryId,
  clockInAt?, clockOutAt?, reason)
  → preserves originals, sets adjusted

submitTimesheet(weekStartDate,
  notes?)
  → {timesheetId, autoApproved}

approveTimesheet(timesheetId)
rejectTimesheet(timesheetId, reason)

Statuses & Hooks

Time Entry Statuses:
  active → clocked in, timer running
  completed → clocked out normally
  adjusted → times corrected
  voided → soft-deleted

Timesheet Statuses:
  draft → not yet submitted
  submitted → pending approval
  approved → manager approved
  rejected → sent back for edits

GPS: 100m geofence radius
Integration: QuickBooks payroll

Hooks & Frontend

useTimeclock()
  active entry, clock in/out actions
  1-second timer interval

useTimesheets()
  weekly data, submit, list

useTeamTime()
  team status, approval queue

Components:
  TimeEntryCard
  TimesheetSummary
  PulseRing (animated)
  WeeklyBars (chart)

Screens:
  timeclock/index.tsx
  timeclock/timesheets.tsx
  timeclock/timesheet/[weekStart]

Business Rules

One active clock-in
  per contractor at a time

Job must be workable
  in_progress or pending_completion

Auto-approval
  if settings.requiresApproval = false

Geofence: 100m radius
  flags entries outside job site

Date range cap: 31 days
  prevents large query DoS

Max entries: 500/query
  DoS protection on aggregation

Breaks
  non-billable, tracked separately
Clock & Timesheets
9:41
Timeclock & Attendance
Clock Status
4:32:15
Clocked in since 8:00 AM
Clock Out
Break
Weekly Timesheet
Monday
8h 15m
Tuesday
7h 45m
Wednesday
4h 32m
Week Total
20h 32m
Team Time & Approvals
9:41
Team Time & Approvals
Team Dashboard
Jake Martinez
Clocked in • 4h 32m
Sarah Kim
Clocked in • 3h 15m
Mike Torres
Not clocked in
Pending Approvals
Overtime — Jake Martinez
2.5h overtime on Monday
Review
Time Edit — Sarah Kim
Requested clock-in correction
Review
Weekly Summary
156h
Total Hours
8h
Overtime
95%
Attendance
Timeclock Center
https://app.3bids.io/contractor/timeclock
3Bids
Clock In/Out ⌘1
Timesheets ⌘2
Team Time ⌘3
Approvals ⌘4
Reports ⌘5
MK
Mike Kowalski
Contractor
Settings ⌘,

Timeclock Center

8
Clocked In
156h
This Week
2
Pending
95%
Attendance
Team Status
Jake Martinez
In since 8:00 AM • 4h 32m
Sarah Kim
In since 8:30 AM • 3h 15m
Mike Torres
Not clocked in
Hours This Week