1 Scheduling Hub
2 Calendar Views
3 Availability Settings
4 Onboarding Call
Hub — Active State
9:41
Scheduling
3
Today
12
This Week
2
Pending
Calendar
View appointments
Availability
Set working hours
Appointments
Manage bookings
Upcoming Appointments
Sarah Thompson
Kitchen Remodel — In-Home Review
Today, 2:00 PM – 3:00 PM
482 W Market St, Akron, OH
Confirmed
Mike Denson
Deck Repair — Site Visit
Tomorrow, 10:00 AM – 11:00 AM
1127 Portage Trail, Cuyahoga Falls, OH
Pending
Pending Invitations

No pending invitations

Appointment requests from homeowners will appear here

SchedulingHome — contractor scheduling hub

useRouter, useThemedStyles(createStyles)

Hub — Empty State
9:41
Scheduling
0
Today
0
This Week
0
Pending
Calendar
View appointments
Availability
Set working hours
Appointments
Manage bookings
Upcoming Appointments

No upcoming appointments

Your scheduled appointments will appear here

Pending Invitations

No pending invitations

Appointment requests from homeowners will appear here

SchedulingHome — empty / new contractor state

Empty component renders for both sections


Calendar — Month View
9:41
Calendar
Last synced 3 min ago
Sync Now
Month
Week
Day
Agenda
Filters
February 2026
Today
SunMonTueWedThuFriSat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Wednesday, Feb 25
2 appointments
Janet Kowalski
Bathroom Tile — Estimate
10:00 AM – 11:00 AM
Confirmed
David Patterson
Roof Inspection — Site Visit
2:30 PM – 3:30 PM
Pending

ContractorCalendar — MonthView sub-component

useQuery(api.contractor.scheduling.listAppointments), viewMode: 'month'

Calendar — Week View
9:41
Calendar
Last synced 1 min ago
Sync Now
Month
Week
Day
Agenda
Feb 22 – Feb 28
Today
Sun22
Mon23
Tue24
Wed25
Thu26
Fri27
Sat28
8 AM
9 AM
9 AM Plumbing
10 AM
Tile Estimate
Estimate
11 AM
12 PM
1 PM
Consult
2 PM
Kitchen Review
Site Visit
3 PM

WeekView — time-grid with positioned blocks

weekAppointments, getAppointmentPosition(), scrollViewRef

Calendar — Day View
9:41
Calendar
Last synced just now
Sync Now
Month
Week
Day
Agenda
Tuesday, Feb 24
Today • 2 appointments
8 AM
9 AM
Tom Harris
Plumbing Repair — In-Home Review
9:00 AM – 10:00 AM
305 E Tallmadge Ave, Akron, OH
Confirmed
10 AM
11 AM
12 PM
1 PM
2 PM
Sarah Thompson
Kitchen Remodel — Site Visit
2:00 PM – 3:00 PM
482 W Market St, Akron, OH
Pending
3 PM
4 PM
5 PM

DayView — single-day timeline with current time indicator

selectedDayAppointments, navigateDay(), currentTimePosition

Calendar — Agenda View
9:41
Calendar
Last synced 2 min ago
Sync Now
Month
Week
Day
Agenda
Filters
Pending
Today — Tuesday, Feb 24
Sarah Thompson
Kitchen Remodel — Site Visit
2:00 PM – 3:00 PM
482 W Market St, Akron, OH
Pending
Tomorrow — Wednesday, Feb 25
David Patterson
Roof Inspection — Site Visit
2:30 PM – 3:30 PM
2210 Merriman Rd, Akron, OH
Pending
Friday, Feb 27
Linda Garcia
HVAC Maintenance — Consultation
11:00 AM – 12:00 PM
891 Sand Run Rd, Akron, OH
Pending
Monday, Mar 2
James Mitchell
Basement Waterproofing — Estimate
9:00 AM – 10:30 AM
55 Howe Ave, Cuyahoga Falls, OH
Pending

AgendaView — grouped by date, filterable list

groupedAppointments, upcomingAppointments, statusFilter: 'pending'


Weekly Availability
9:41
Availability
Set your weekly schedule so homeowners know when you are available for appointments.
Monday
8:00 AM – 5:00 PM
Tuesday
8:00 AM – 5:00 PM
Wednesday
8:00 AM – 5:00 PM
Thursday
8:00 AM – 5:00 PM
Friday
8:00 AM – 4:00 PM
Saturday
9:00 AM – 1:00 PM
Sunday
Not accepting appointments
Quick Templates
Mon–Fri 9–5
Mon–Sat 8–6
Every Day
Weekly Hours Summary
Mon
9h
Tue
9h
Wed
9h
Thu
9h
Fri
8h
Sat
4h
Sun
0h

Total Weekly Hours 48h

AvailabilitySettings — contractor weekly schedule

useMutation(api.contractor.scheduling.setAvailability), schedule state

Booking Settings
9:41
Booking Settings
Public Booking Page
Allow homeowners to book appointments online

3bids.com/book/ohio-plumbing-pro
Appointment Defaults
Default Duration
30 min
45 min
1 hour
1.5 hours
2 hours
Buffer Between Appointments
None
15m
30m
45m
Booking Rules
Minimum Notice
How far in advance must bookings be made
1 hr
2 hr
4 hr
24 hr
Maximum Advance
How far in the future can bookings be made
1 week
2 weeks
1 month
2 months
Behavior
Auto-Accept Bookings
Automatically confirm without manual approval
Email Notifications
Receive email when someone books
SMS Notifications
Receive text message when someone books

BookingPageSettings — public page config

useQuery(api.poster.availability.getBookingSettings), updateSettings mutation


Onboarding Call — Selection
9:41
Onboarding Call
Welcome to 3Bids
Schedule a quick 15-minute call to get verified and start winning jobs
Profile
Docs
Call
Live!
What to Expect
Identity Verification
Quick check of your license and credentials
Platform Walkthrough
How bidding, payments, and scheduling work
Q&A
Ask anything — we are here to help
Pick a Day
Wed 25 Feb
Thu 26 Feb
Fri 27 Feb
Mon 2 Mar
Tue 3 Mar
Pick a Time
9:00 AM
10:00 AM
11:00 AM
12:00 PM
1:00 PM
2:00 PM
3:00 PM
4:00 PM
Your Call
Fri, Feb 27 • 10:00 AM

OnboardingCallBookingScreen — date + time selection

useMutation(api.contractor.scheduling.scheduleOnboardingCall), selectedDate/Time state

Onboarding Call — Scheduled
9:41
Onboarding Call
You are All Set!
Your onboarding call has been scheduled
Profile
Docs
Call
Pending
Call Details
Friday, February 27
10:00 AM – 10:15 AM EST
Google Meet
Link sent to your email
3Bids Onboarding Team
Danny & the crew from Akron
Calendar invite sent
Check your email for the meeting link

OnboardingCallBookingScreen — isAlreadyScheduled state

profile?.user?.metadata?.onboardingCallScheduled === true


Data Architecture

Screens & Components

// Contractor scheduling
SchedulingHome → app/(contractor)/.../scheduling/index.tsx
ContractorCalendar → app/(contractor)/.../scheduling/calendar.tsx
  MonthView | WeekView | DayView | AgendaView
  AppointmentCard | AppointmentDetails
  QuickCreateForm | RescheduleForm
AvailabilitySettings → .../scheduling/availability.tsx
OnboardingCallBooking → .../scheduling/onboarding-call.tsx

// Poster scheduling (parallel)
PosterSchedulingHub → app/(poster)/scheduling/index.tsx
PosterAvailability → app/(poster)/scheduling/availability.tsx
BookingPageSettings → app/(poster)/scheduling/booking-page.tsx
PosterCalendarTab → app/(poster)/(tabs)/calendar.tsx

Convex Queries & Mutations

// Contractor queries
api.contractor.scheduling.listAppointments
  args: { limit: number }
  returns: { items: ConvexAppointment[] }

// Contractor mutations
api.scheduling.appointments.confirm
api.scheduling.appointments.complete
api.scheduling.appointments.cancel
api.scheduling.appointments.markNoShow
api.scheduling.googleCalendar.syncAppointment
api.contractor.scheduling.scheduleOnboardingCall

// Poster queries
api.poster.availability.getMyAvailability
api.poster.availability.getBookingSettings
api.poster.appointments.getAppointmentCounts
api.poster.appointments.getUpcomingAppointments

// Poster mutations
api.poster.availability.setBulkAvailability
api.poster.availability.updateBookingSettings

Key Types

ViewMode = 'month' | 'week' | 'day' | 'agenda'

AppointmentType =
  'in_home' | 'site_visit' | 'estimate'
  | 'job_work' | 'consultation'

AppointmentStatus =
  'pending' | 'confirmed' | 'completed'
  | 'cancelled' | 'no_show'

DaySchedule {
  isWorking: boolean
  startTime: string // "08:00"
  endTime: string // "17:00"
  breaks: Break[]
}

BookingSettings {
  bookingSlug: string
  bookingPageEnabled: boolean
  defaultDuration: number // minutes
  bufferBefore/After: number
  minNotice: number // hours
  maxAdvance: number // days
  autoAccept: boolean
}

Appointment Type Colors

// Contractor palette (terracotta accent)
in_hometerracotta (In-Home Review)
site_visitinfo/blue (Site Visit)
estimatesuccess/green (Estimate)
job_workadminPrimary/purple (Job Work)
consultationwarning/orange (Consultation)

// Status badge mapping
pendingwarning
confirmedsuccess
completeddefault
cancellederror
no_showerror

// Google Calendar sync
syncToGoogleMutation
  shows warning toast if not connected
  links to Settings → Integrations → Google
Hub & Calendar
9:41
Scheduling & Calendar
Today’s Schedule
5
Jobs Today
3
Confirmed
Upcoming
Roof Repair — Johnson
9:00 AM – 12:00 PM
Confirmed
Gutter Install — Garcia
1:00 PM – 3:00 PM
Pending
Siding Estimate — Lee
3:30 PM – 4:30 PM
Confirmed
Month View
Sun
Mon
Tue
Wed
Thu
Fri
Sat
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
This Week
12
Total
9
Confirmed
3
Pending
Availability & Booking
9:41
Availability & Booking
Weekly Hours
Monday
8:00 AM – 5:00 PM
Tuesday
8:00 AM – 5:00 PM
Wednesday
8:00 AM – 5:00 PM
Thursday
8:00 AM – 5:00 PM
Friday
8:00 AM – 3:00 PM
Sat – Sun
Unavailable
Booking Settings
Auto-Accept Bookings
Buffer Between Jobs
30 min
Max Jobs Per Day
6
Onboarding Call
Call Scheduled
Mar 15, 2026 at 2:00 PM
Scheduling Center
https://app.3bids.io/contractor/schedule
3Bids
Hub ⌘1
Calendar ⌘2
Week View ⌘3
Availability ⌘4
Booking Settings ⌘5
Onboarding ⌘6
MK
Mike Kowalski
Contractor
Settings ⌘,

Scheduling Center

5
Today
18
This Week
92%
Utilization
2
Pending
Today’s Jobs
Roof Repair — Johnson
9:00 AM – 12:00 PM • Confirmed
Gutter Install — Garcia
1:00 PM – 3:00 PM • Pending
Siding Estimate — Lee
3:30 PM – 4:30 PM • Confirmed
Weekly Overview
Settings & Availability
https://app.3bids.io/contractor/schedule/settings
3Bids
Hub ⌘1
Calendar ⌘2
Week View ⌘3
Availability ⌘4
Booking Settings ⌘5
Onboarding ⌘6
MK
Mike Kowalski
Contractor
Settings ⌘,

Settings & Availability

Weekly Availability
Monday – Thursday
8:00 AM – 5:00 PM
Friday
8:00 AM – 3:00 PM
Saturday – Sunday
Off
Booking Rules
Auto-Accept
Buffer Time
30 min
Max Daily Jobs
6
Advance Notice
24 hours