Step 1 — First Impression

Welcome / Splash
9:41

WelcomeScreen — Entry point. Logo uses wordmark asset.

useAuth().isSignedIn → skip to tabs

Carousel — Slide 1
9:41

OnboardingCarousel — 3 swipeable slides, horizontal pager.

PagerView with dot indicators

Carousel — Slide 2
9:41

OnboardingCarousel — Slide 2. Handshake icon.

Carousel — Slide 3
9:41

OnboardingCarousel — Slide 3. Final slide swaps "Next" for "Get Started".

onComplete() → navigate to Role Selection


Step 2 — Role Selection

Role Selection
9:41
I am a…
Choose how you’ll use 3Bids
Homeowner
Post your project, receive 3 competitive bids from vetted local contractors, and hire with confidence.
Exclusive leads Escrow protection Free to post
Contractor
Bid on local jobs in your service area, build your portfolio, and grow your business your way.
No lead sharing Fair 8.5% fee Your schedule

RoleSelectionScreen — Sets userRole in Clerk metadata.

useMutation(api.users.setRole) → route to role-specific signup

Role — Contractor Selected
9:41
I am a…
Choose how you’ll use 3Bids
Homeowner
Post your project, receive 3 competitive bids from vetted local contractors, and hire with confidence.
Exclusive leads Escrow protection Free to post
Contractor
Bid on local jobs in your service area, build your portfolio, and grow your business your way.
No lead sharing Fair 8.5% fee Your schedule

RoleSelectionScreen — Alternate state with contractor selected.

CTA text & color change on selection


Step 3 — Account Creation

Sign Up — Email
9:41
Create Account
Marcus
Last name
marcus@example.com
••••••••
Strong password
I agree to the Terms of Service and Privacy Policy
or

SignUpScreen — Clerk signUp.create() with email strategy.

useSignUp() from @clerk/clerk-expo

Sign Up — Phone
9:41
Verify Phone
+1 (330) 555-0142
or enter code
Enter 6-digit code
Sent to (330) 555-0142
4
8
2
Resend code in 0:42
Use email instead

PhoneVerificationScreen — Clerk phone_code strategy.

signUp.prepareVerification({ strategy: "phone_code" })


Step 4 — Sign In & Recovery

Sign In
9:41

SignInScreen — Clerk signIn.create() with email or phone.

useSignIn() → setActive({ session })

Forgot Password
9:41
Reset Password
Forgot Your Password?
Enter your email and we’ll send you a link to reset your password.
marcus@example.com

ForgotPasswordScreen — Clerk password_reset flow.

signIn.create({ strategy: "reset_password_email_code" })

Reset — Success State
9:41
Reset Password
Check Your Email
We sent a password reset link to
Didn’t receive it? Resend

ForgotPasswordScreen — Success state after email sent.

Linking.openURL("mailto:") for "Open Email App"


Step 5 — Email Verification

Email Verification
9:41
Verify Your Email
We sent a verification link to
Didn’t receive it? Resend in 0:58
Change email address

EmailVerificationScreen — Shown after email signup.

signUp.prepareVerification({ strategy: "email_code" })

Email — Verified
9:41
Email Verified!
Your email has been confirmed. Let’s set up your profile to get started.

EmailVerificationScreen — Deep link callback confirms email.

signUp.attemptVerification() → setActive() → profile setup


Step 6 — Poster Profile Setup

Poster Setup — Step 1
9:41
Profile Setup
Step 1 of 3 — Property Details
Add profile photo
1247 Maple Ave, Akron
1247 Maple Ave, Akron, OH 44301
1247 Maple Dr, Cuyahoga Falls, OH 44221
Single Family Condo Townhouse Multi-Family Commercial
Select one

PosterProfileSetup — Google Places autocomplete for address.

useMutation(api.users.posters.updateProfile) + api.users.posterProperties.create


Step 7 — Contractor Profile Setup

Contractor Setup — Step 1
9:41
Business Setup
Step 1 of 3 — Business Details
Add business photo
Summit City Roofing LLC
e.g. OHC-123456
12 years
Roofing Siding Plumbing Electrical HVAC Painting Landscaping General
44301 44302 44303 Add more...

ContractorProfileSetup — Multi-select chips for service categories.

useMutation(api.users.contractors.updateProfile) + serviceArea array


Step 8 — Enhanced Auth & Acquisition

Sign In — Google OAuth
9:41

SignInScreen — Google OAuth via Clerk. Falls back to email/password. Deep-linked from magic link invitations.

useSignIn() → oauth_google strategy → setActive({ session })

Acquisition Source Picker
9:41
How did you hear about us?
Google Search
Social Media
Friend/Family
Contractor Referral
Door Hanger
Mailer
Yard Sign
Event/Trade Show
Radio/TV
Online Ad
Other

AcquisitionSourcePicker — Tracks acquisition source for growth analytics. 11 options mapped to marketing channels.

useMutation(api.users.updateAcquisitionSource) → acquisitionSource field

Role-Aware Tab Selector
9:41

SignUpScreen — Role-aware tab selector replaces separate sign-up flows. Tab choice sets intendedSetupRole for post-auth routing.

useSignUp() → unsafeMetadata.intendedSetupRole = “poster” | “contractor”


Data Architecture

Authentication (Clerk)

  • useSignUp() — Handles email/phone registration with Clerk
  • useSignIn() — Email or phone login, social OAuth (Google, Apple)
  • useAuth() — Session state, isSignedIn, userId
  • useUser() — Current user profile from Clerk
  • Strategies: email_code, phone_code, oauth_google, oauth_applereset_password_email_code
  • Deep linking: exp:// scheme for email verification callbacks

User Creation Flow

  • Role selection sets publicMetadata.role in Clerk via users.setRole mutation
  • Poster path: creates posterUsers + posterProfile + posterProperties records
  • Contractor path: creates contractorUsers + contractorProfile records
  • Both paths trigger welcome email via transactionalEmail.ts (SendGrid)
  • Slack alert to #growth_feed on every new signup

Onboarding Progress

  • onboardingProgress schema: { userId, role, step, completedSteps[], createdAt }
  • 3 steps per role: poster (property, preferences, photo) / contractor (business, services, verification)
  • useOnboarding() hook returns current step + navigation helpers
  • Skip allowed — incomplete profiles get reminder notifications after 24h

Schema Tables

  • posterUsers — Core poster identity (clerkId, email, name, phone)
  • posterProfile — Extended poster data (avatar, preferences, referralSource)
  • posterProperties — Address, propertyType, lat/lng, zipCode
  • contractorUsers — Core contractor identity (clerkId, email, name, phone)
  • contractorProfile — Business info (businessName, licenseNumber, serviceCategories, serviceArea, yearsExperience, avatar)

Hooks

  • useAuth() — Clerk session state, isSignedInisLoaded
  • useOnboarding() — Steps completed, current step, next() / back()
  • useWarmup() — Preloads user data after auth for instant navigation
  • useDeepLinking() — Handles email verification callback URLs

Navigation

  • (auth)/welcome(auth)/onboarding(auth)/role-select
  • (auth)/sign-up(auth)/verify-email(auth)/profile-setup
  • (auth)/sign-in(auth)/forgot-password
  • After setup: (poster)/ or (contractor)/ tab navigator
  • Guard: isSignedIn ? tabs : auth via Expo Router layout
Welcome & Carousel
9:41

Welcome / Splash & Feature Carousel

Welcome / Splash
Splash Screen
Brand 3Bids logo + tagline
Headline Home services, done right.
CTA Get Started
Animation Fade-in brand reveal
Feature Carousel
3-Slide Carousel
Slide 1 Post Your Job — Simple form, photos, budget
Slide 2 Get 3 Bids — Compare verified contractor bids
Slide 3 Hire & Pay Safely — Escrow + contract protection
Role Selection
Homeowner I need work done on my home
Contractor I want to find jobs and grow my business
Visual Two-card selection with role icons

Sign Up & Sign In
9:41

Sign Up & Sign In & Recovery

Sign Up
Email Sign Up
Fields Name, email, password, confirm
Social Google, Apple sign-in
Terms Agree to Terms & Privacy Policy
CTA Create Account
Phone Verification
Input Phone number + SMS code
6-digit Verification code entry
Resend 30s cooldown
Skip Optional — limits features
Sign In & Recovery
Sign In
Email/Password Standard login form
Social Sign In Google / Apple
Remember Me Stay signed in option
Biometric Face ID / Touch ID
Password Recovery
Forgot Password Email reset link
Reset Form New password + confirm
Success Password updated — auto sign in

Profile Setup
9:41

Poster Setup & Contractor Setup

Poster Setup
Homeowner Profile
Photo Upload profile photo
Name First & last name
Phone Contact number
Property Address, type, year built
Email Verification
Status Verification email sent
Code 6-digit entry
Verified Green checkmark success
Contractor Setup
Contractor Profile
Business Company name + license #
Trade Primary service category
Coverage Service area + radius
About Business description
Enhanced Auth
Google OAuth One-tap sign in
Apple Sign In Privacy-first auth
MFA Optional 2FA setup
Onboarding Flow
https://app.3bids.io/welcome

Welcome to 3Bids

New Account
Overview
Dashboard
Complete welcome to 3bids with real-time data, analytics, and management tools.
Quick Actions
Full desktop layout combines all mobile screens into a dense, actionable dashboard with sidebar navigation, data tables, charts, and management controls.
Web DashboardThis web view consolidates all mobile screens into a single responsive dashboard. Sidebar navigation replaces tab-based mobile flow, with data density optimized for desktop viewport.