ContractorDashboard — useContractorProfile, useActiveJobs, getScheduleToday, getWeeklyEarnings
ContractorDashboard (empty) — useContractorProfile, useOnboardingProgress
ContractorJobsList — useContractorJobs, useJobStatusCounts
ContractorJobDetail — useJobDetail, useContractForJob, useEscrowStatus, useMilestones
ContractorJobComplete — useJobDetail, useJobReview, usePayoutSummary
ContractorEarnings — useEarningsSummary, usePendingPayouts, useEarningsByCategory
ContractorProfile — useContractorProfile, useProfileCompletion, useReviewStats
ServiceAreaEditor — useContractorProfile, updateServiceArea, updateServicesOffered
ContractorLeads — useAvailableLeads, useLeadNotifications, dismissLead
ContractorSettings — useContractorProfile, useContractorSubscription, useTeamMembers
contractorUsers {
clerkId, email, createdAt,
stripeAccountId, stripeCustomerId,
subscription, isActive,
hasPaymentMethod, metadata
}
contractorProfile {
contractorId, name, phone,
businessName, bio,
yearsExperience, servicesOffered,
serviceRadius, licenseNumber,
insuranceProvider, isVerified,
subscriptionTier, avatarUrl,
officeAddress, city, state, zipCode,
latitude, longitude,
averageRating, totalReviews,
bookingSlug, bookingSettings,
isBackgroundChecked
}
jobs {
posterId, contractorId, propertyId,
title, description, jobTypeId,
status, address, budget
}
jobBids {
jobId, contractorId, amount,
message, status, createdAt
}
useContractorProfile()
api.users.contractors.me
useContractorDashboard()
api.jobs.jobs.getContractorActive
api.jobs.jobs.getScheduleToday
useActiveJobs(filter)
api.jobs.jobs.listByContractor
useJobDetail(jobId)
api.jobs.jobs.getById
api.contracts.get.forJob
api.payments.escrow.getByJob
useEarnings(period)
api.payments.payouts.summary
api.payments.payouts.pending
api.payments.payouts.byCategory
useLeads()
api.jobs.jobs.getAvailableLeads
useProfileCompletion()
api.users.contractors.completion
useTeamMembers()
api.teams.members.list
updateProfile(fields)
api.users.contractors.update
updateServiceArea(data)
api.users.contractors.updateArea
updateAvailability(online)
api.users.contractors.setOnline
dismissLead(jobId)
api.jobs.jobs.dismissLead
submitBid(jobId, data)
api.jobs.bids.create
uploadJobPhoto(jobId, file)
api.jobs.photos.upload
respondToReview(reviewId, msg)
api.reviews.respond
addToPortfolio(jobId)
api.users.contractors.addPortfolio
Lead → View → Bid → Contract
→ Funding → Work → Complete
→ Payout (40/60 split)
Escrow States:
pending → hold_period
→ funded → first_payout_sent
→ released
Payout Calculation:
total - 8.5% fee = net
40% after 24h hold
60% after completion
Subscription Tiers:
basic | pro | pro_unlimited
Profile Completion:
avatar + bio + services
+ portfolio + certifications
+ background check