Web-only at onboarding.3bids.io — 12 sections, 30+ screens, 3 complexity tiers, multi-person wizard with AI extraction and shadow accounts
Hi Mike,
You’ve been invited to set up your contractor account on 3Bids. Click the button below to create your account and complete your business profile.
Get Started →This link expires in 7 days. If you didn’t request this, you can safely ignore this email.
intakeMagicLinkTokens — SHA-256 hashed token, 7-day expiry. Admin generates via POST /v1/admin/intake/magic-link
Set up your login to start building your 3Bids business profile.
SetupPage — web/contractor/intake/app/setup/page.tsx. Validates token → Clerk signup → linkContractorAccount → redirect to wizard
We’ll tailor the setup experience to match your business size and needs.
WelcomeSection — wizardComplexity: “solo” | “growing” | “enterprise”. Determines visible sections via getSectionsForComplexity()
Basic info about the business owner. This helps us personalize your experience.
ProfileSection — firstName, lastName, phone, yearsExperience, bio. Manual save via “Save & Continue” → contractorBusinessProfile
Showcase your best work to attract more customers. Add projects with photos, descriptions, and categories.
Add your best completed projects to build trust with homeowners. Include before/after photos for maximum impact.
PortfolioSection — Project cards with ImageUploader (up to 10 photos), before/after, category select, description. Empty state shown → "Add Your First Project" triggers modal form
Tell us about your business so we can set up your 3Bids presence.
CompanySection — 3 sub-steps: Basic Info → Contact & Location → Branding. businessName, legalName, einNumber, businessModelTypes, typicalJobRange
What services do you offer, where do you work, and when are you available?
ServicesSection — 3 sub-steps. servicesOffered[], serviceAreas[], serviceRadius, businessHours, blockedDates
Upload verification documents and business materials. Our AI will extract structured data automatically.
DocumentsSection — contractorBusinessDocuments + contractorIntakeDocuments. intakeAiExtractionJobs runs Gemini on each upload → extractedServices, extractedProcedures, extractedTeamInfo
Everything looks good. Review your configuration summary and submit for setup.
ReviewSection — 2-step: Summary → Submit. Dry-run validation, then marks contractorIntakeStatus.status = “complete”
12 contractors in pipeline · 3 awaiting review
AdminIntakePipeline — GET /v1/admin/intake/list with filters. contractorIntakeStatus tracks not_started → link_sent → in_progress → complete → approved
contractorBusinessProfile — Master profile (50+ fields)contractorBusinessDocuments — SOPs, handbooks + AI analysiscontractorIntakeDocuments — Pricebooks, team lists, avatarscontractorJargon — Terminology dictionarycontractorIntakeStatus — Progress tracking + status FSMintakeMagicLinkTokens — SHA-256 hashed, 7-day expiryintakeAiExtractionJobs — Gemini document analysisintakeQaReviews — Validation before go-livePOST /v1/admin/intake/magic-link — Generate inviteGET /v1/admin/intake/list — Pipeline CRM viewPATCH /v1/admin/intake/{id} — Update status / approvevalidateSetupToken — Token hash + expiry checklinkContractorAccount — Shadow → real clerkIdgetIntakeOpsSnapshot — Full canonical snapshotgetIntakeProgress — Section-by-section status253 tools across intakeData (5), onboardingWizard (22), extendedOnboarding (23), complexPricing (56), enterpriseCommissions (47), + service types, regions, roles.
not_started → link_sent → in_progress → complete → approved
Add the business owner’s headshot before the team delegation flow begins.
Take a quick headshot now. On phones, this can use the front camera instead of making you dig through uploads.
ProfilePhoto — MediaUpload circle variant. Drag-and-drop or click to browse. onUpload → convex intake/uploads.generateUploadUrl
Plan delegation, create roles, and map your internal roster.
TeamSection — teamSize picker + importMode selector. Complexity gating: roster tab only for growing/enterprise
Define the roles in your business and their permissions.
TeamSection.roles — roleName, count, canSell, canFulfill, canQuote, earnsCommission. Dynamic add/remove with permission chips
Map your team members to their roles.
| First Name | Last Name | Role | ||
|---|---|---|---|---|
| Carlos | Martinez | carlos@mjplumbing.com | Lead Technician | |
| Sarah | Kim | sarah@mjplumbing.com | Sales Rep | |
| Dave | Thompson | dave@mjplumbing.com | Lead Technician |
TeamSection.members — firstName, lastName, email, roleId. Growing/enterprise only. Supports bulk CSV paste.
Invite role owners to complete their parts of setup. Each person gets their own magic link.
Send magic links to your team members so they can complete their own profile setup. Each person fills out their section independently.
EmployeesSection.invite — Magic link generation per role group. Growing/enterprise only. Links sent via transactional email.
Review and approve employee submissions before they’re added to the roster.
EmployeesSection.submissions — Approve/reject employee profiles. Auto-approve toggle available on previous step.
Set up how your team earns commissions. Define structure, rates, and bonus rules.
CommissionSection.basics — hasCommissions toggle, commissionStructure selector, optional doc upload. Growing/enterprise only.
Define the base commission rate for each role and job type.
Set the default percentage or flat rate earned per job by role.
CommissionSection.rates — CommissionRuleBuilder. Per-role rates with job-type variants. Supports percentage or flat amount.
Define bonus rules that reward performance beyond base rates.
Reward top performers with additional bonuses beyond base commissions.
CommissionSection.bonuses — BonusRuleCard component. Types: first_job, review, volume, multi-service. Flat amount or percentage.
Review your complete commission structure before moving on.
CommissionSection.review — Summary stats + example $1,000 job calculation. Status indicator: ready to apply vs incomplete.
Set your default pricing model and optionally import an existing pricebook.
PricebookSection.model — hasPricebook toggle, file upload, pricingModel selector. AI extraction for uploaded pricebooks.
Set the base price and pricing type for each of your selected services.
Set the base price for each service you offer. Prices shown to homeowners during bidding.
| Service | Base Price | Pricing Type |
|---|---|---|
| Plumbing | $150.00 |
Flat Rate |
| Water Damage | $3.50 |
Per Sq Ft |
| General Handyman | $85.00 |
Hourly |
PricebookSection.pricing — Per-service basePrice and pricingType. Grid populated from servicesOffered selection.
Add modifiers that adjust your base pricing — surcharges, discounts, and bundles.
Add markups, discounts, or surcharges that adjust base pricing.
PricebookSection.modifiers — Type (markup/discount/surcharge), name, amount, amountType (% or flat). Also supports service bundles at enterprise tier.
Upload optional business documents to speed up onboarding.
Upload any additional documents that help us understand your operations. These are optional but speed up onboarding.
DocumentsSection.business — Optional doc grid: SOP, handbook, org chart, safety manual. 2-column grid with upload/uploaded states.
Review data extracted by AI from your uploaded documents. Approve or reject each item.
DocumentsSection.extraction — AI-extracted fields with confidence badges. Approve/reject per item. Enterprise tier. Powered by Gemini extraction.
Final validation passed. Submit your intake for team review.
Your intake will be reviewed by our team. You’ll receive an email once your account is activated.
ReviewSection.apply — Validation results, preview cards, submit button. Download summary available post-submission.