1 Request
2 Match
3 Accept
4 En Route
5 Complete
Poster
Request On-Demand Service
9:41
Need help NOW? We'll find someone fast.
What do you need?
Emergency Plumbing
Lockout
Electrical
HVAC
General Repair
Your Location Auto-detected
1847 Highland Ave Akron, OH 44301
Describe the issue
Burst pipe under kitchen sink. Water is spraying and I've shut off the main valve.
Photos (optional)
Budget Willingness
Flexible
Up to $150
Up to $250

OnDemandRequestScreen — Category chips use flexWrap, location auto-detected via expo-location

useQuery(api.users.posters.me) • useMutation(api.tracking.ondemand.requestAppointment)

Poster
Matching & Waiting
9:42
Finding available contractors near you… Estimated wait: 2–5 minutes

MJ
Mike Johnson Plumbing
4.8
2.3 mi ~8 min $95/hr
RP
Rodriguez Pipe & Drain
5.0
4.1 mi ~14 min $110/hr
Searching for more contractors…

MatchingScreen — Convex real-time subscription pushes contractor matches as they come in

useQuery(api.tracking.ondemandQueries.getNearbyContractors) • live subscription via Convex

Poster
Request Accepted
9:44
Accepted Just now
MJ
Mike Johnson Mike Johnson Plumbing
4.8 (127 reviews)
8 minETA
2.3 miAway
Live route tracking
Job Details
Emergency Plumbing
1847 Highland Ave, Akron, OH
Burst pipe under kitchen sink
Safety Tips Contractor is licensed & insured. Background check verified. Payment protected by 3Bids escrow.
Cancel Request

RequestDetailScreen — Real-time ETA countdown, map route placeholder, call/message CTAs

useQuery(api.tracking.ondemandQueries.getAppointmentRequest) • useMutation(api.tracking.ondemand.cancelAppointmentRequest)


Contractor
Incoming Request
9:42
New On-Demand Request!
EMERGENCY

Emergency Plumbing
2.3 miles
~8 min drive

SL
Sarah L.
5.0
Estimated Payout $95–$150
Based on $95/hr, typical 1–1.5hr job
Accept Within 1:47

AppointmentRequestCard — 2-minute countdown timer, payout estimate based on hourly rate

Convex real-time push • useMutation(api.tracking.ondemand.acceptAppointment)

Contractor
Active On-Demand Job
9:45
En Route to Customer
6 min
Customer Location
1847 Highland Ave Akron, OH 44301
Job Details
Emergency Plumbing
Burst pipe under kitchen sink. Water is spraying and main valve is shut off.
Sarah L. — 5.0
Arrival Checklist
Pipe wrench & fittings
Plumber's tape & sealant
Bucket & towels for cleanup
Safety Notes Verify main water valve is off before starting. Wear gloves for standing water.
Arriving will start your time clock

ActiveOnDemandScreen — GPS location tracking, arrival triggers clock-in prompt

useMutation(api.tracking.ondemand.arriveAtJob) • expo-location watchPositionAsync

Contractor
On-Demand Dashboard
10:30
Online & Visible Location updated just now
Service Radius 25 miles
5 mi50 mi
Today's Earnings
$285.00 +$95 last job
3Jobs Today
47sAvg Response
92%Accept Rate
Recent On-Demand Jobs
Emergency Plumbing 9:44 AM — 11:15 AM
$142.50
Electrical Outlet Repair 7:30 AM — 8:45 AM
$95.00
Lockout Service Declined — too far

ContractorOnDemandScreenOnlineStatusToggle, radius filter, real-time earnings feed

useQuery(api.tracking.ondemandQueries.getMyOnlineStatus) • useMutation(api.tracking.ondemand.goOnline)


Both
Job Complete
11:20
Service Complete! Emergency plumbing — Feb 24, 2026
Service Summary
Replaced burst copper pipe section, soldered new fittings
Time Spent 1 hr 31 min
Photos Taken 4 photos

Total Amount $142.50
Add a Tip
$10
$20
$30
Custom
Rate Your Experience
Write a review (optional)…

JobCompleteScreen — Tip selector (poster), star rating, review textarea for both roles

useMutation(api.tracking.ondemand.completeAppointment) • useMutation(api.jobs.reviews.create)

Both
On-Demand History
2:15
All
Completed
Cancelled
Completed Feb 24, 2026
MJ
Emergency Plumbing Mike Johnson Plumbing
$142.50
5.0
1 hr 31 min
Completed Feb 20, 2026
RP
Electrical Outlet Repair Rodriguez Pipe & Drain
$95.00
4.5
1 hr 15 min
Cancelled Feb 18, 2026
HVAC Emergency No contractor available
$0.00
Expired — no response

OnDemandHistoryScreen — Segmented filter, reorder button for poster, "Similar Jobs" for contractor

useQuery(api.tracking.ondemandQueries.getAppointmentHistory) • Pagination via cursor

Data Architecture

Schema

appointmentRequests
  posterId: v.id("posterUsers")
  contractorId: v.id("contractorUsers")
  categoryId: v.string()
  status: "pending"|"accepted"|"declined"|"expired"|"cancelled"|"completed"
  urgency: "emergency"|"same_day"|"flexible"
  latitude/longitude: v.number()
  address, city, state, zipCode
  description: v.optional(v.string())
  estimatedTravelMinutes: v.number()
  expiresAt: v.number()

contractorOnlineStatus
  contractorId: v.id("contractorUsers")
  isOnline: v.boolean()
  latitude/longitude: v.number()
  geohash: v.string()
  serviceCategories: v.array(v.string())
  autoAcceptEnabled: v.boolean()
  maxTravelMinutes: v.number()

Mutations

tracking/ondemand
  goOnline(latitude, longitude, serviceCategories)
  goOffline()
  updateOnlineLocation(latitude, longitude)
  requestAppointment(contractorId, categoryId, address...)
  acceptAppointment(requestId)
  declineAppointment(requestId)
  cancelAppointmentRequest(requestId)
  completeAppointment(requestId)

Queries

tracking/ondemandQueries
  getNearbyContractors(lat, lng, radiusMiles)
  getMyOnlineStatus()
  getActiveServiceCategories(lat, lng)
  getContractorAppointmentRequests(status)
  getPendingRequestCount()
  getAppointmentRequest(requestId)
  getAppointmentHistory(limit, cursor)

Components

components/tracking/ondemand/
  OnlineStatusToggle
  AppointmentRequestCard
  ContractorMapPin
  NearbyContractorCard
  CategoryFilter
  RadiusFilter
  PendingRequestsBadge
  ContractorDiscoveryPopup

Hooks & Real-Time

Real-time via Convex
  useQuery() auto-subscribes to live data
  Contractor location: 30s interval push
  Match results: instant subscription

expo-location
  watchPositionAsync for GPS tracking
  Accuracy.High, 50m distance interval
  Foreground permission required

Business Rules

Request expires in 5 minutes
  contractor must respond or auto-decline

Auto-accept
  if contractor.autoAcceptEnabled = true

Platform fee based on subscription tier
  deducted from contractor payout

Geohash matching
  prefix-based proximity search

One active request per poster
  prevents duplicate flooding

Escrow holds payment
  released after completion + rating
Dispatch & Map
9:41
Dispatch & Map
Dispatch Stats
5
Incoming
3
Active
12
Today
8m
Avg ETA
Incoming Requests
Emergency Plumbing
1234 Oak St · 0.8 mi
URGENT
AC Repair
567 Elm Ave · 2.1 mi
15m
Drain Cleaning
890 Pine Rd · 3.4 mi
30m
Service Area Map
Interactive service area map
Active Jobs & Tracking
9:41
Active Jobs & Tracking
Active Jobs
Water Heater Install — Smith
En route · ETA 12 min
Active
Faucet Replacement — Jones
On site · Started 1h ago
Working
Toilet Repair — Williams
Completed · Awaiting payment
Pending
Job Details
Customer
Sarah Smith
Service
Water Heater Install
Address
1234 Oak St, Akron, OH
Pricing
Show estimate to customer
Auto-invoice on completion
Accept tips
On-Demand Command Center
https://app.3bids.io/contractor/on-demand
3Bids
Dispatch ⌘1
Map View ⌘2
Active Jobs ⌘3
History ⌘4
Analytics ⌘5
Settings ⌘6
MK
Mike Kowalski
Contractor
Settings ⌘,

On-Demand Command Center

5
Incoming
3
Active
$4.2K
Today
97%
Accept
Live Feed
Emergency plumbing request
Just now
AC repair completed
12 minutes ago
Payment received — $340
30 minutes ago
Daily Volume