Building a production-grade, 4-tier progressive profile system with world-class co-founder matching.
- Created
complete_user_profile_schema.sqlwith all tiers - Auto-calculation trigger for profile completion percentage
- Indexes for performance
- ACTION REQUIRED: Run SQL in Supabase Dashboard
PUT /api/users/:id/profile
- Save ANY profile field (auto-save friendly)
- Returns updated profile_completion_percentage
GET /api/users/:id/profile
- Get complete user profile
- Include completion status per tier
POST /api/users/:id/profile/validate-tier
- Check if specific tier is complete
- Used for feature gatingGET /api/matches?userId=X
- Returns potential matches with match scores
- Filters: minScore, location, skills, etc.
- Smart algorithm (see below)
POST /api/matches
- Send connection request
- Creates entry in cofounder_matches table
GET /api/matches/requests?userId=X
- Get incoming & sent requests
POST /api/matches/:id/respond
- Accept/reject connection requestcalculateMatchScore(user1, user2) {
let score = 0;
// 1. Complementary Skills (25 points)
if (user1.looking_for === user2.primary_skill) score += 15;
if (user2.looking_for === user1.primary_skill) score += 10;
// 2. Industry Alignment (15 points)
const commonInterests = intersection(user1.industry_interests, user2.industry_interests);
score += Math.min(commonInterests.length * 5, 15);
// 3. Commitment Level Match (20 points)
if (user1.can_commit_20hrs_week === user2.can_commit_20hrs_week) score += 10;
if (user1.can_go_fulltime === user2.can_go_fulltime) score += 10;
// 4. Location/Remote Preference (15 points)
if (user1.city === user2.city) score += 10;
if (user1.remote_preference === 'Fully Remote' || user2.remote_preference === 'Fully Remote') score += 5;
// 5. Stage Alignment (10 points)
if (user1.stage === user2.stage) score += 10;
// 6. Values Alignment (10 points)
const commonValues = intersection(user1.core_values, user2.core_values);
score += Math.min(commonValues.length * 3, 10);
// 7. Profile Completion Bonus (5 points)
if (user1.tier_3_complete && user2.tier_3_complete) score += 5;
return Math.min(score, 100);
}Component: EnhancedProfileSetup.jsx
- Just show "Welcome! Let's set up your profile"
- Professional Status
- Location (City, Country, Timezone)
- LinkedIn URL
- Skills (tag input)
- Bio (textarea, 100-300 chars)
- Current Stage
- Can you commit 20+ hrs/week?
- Can you go full-time? (Now / 3mo / 6mo / 1yr)
- Okay with 0 salary?
- How long without pay?
- Looking for (Technical / Business / etc.)
- Must-have skills (freetext)
- Deal breakers (multi-select)
- Remote preference
- Primary skill
- If technical: Tech stack (multi-select UI)
- Proof of work (GitHub, Portfolio links)
- Do you have an idea?
- Idea stage
- Industry interests (multi-select chips)
- Open to pivot?
- Expected equity
- Okay with vesting?
- Willing to invest money?
- Investment range
- Decision-making style
- Conflict handling
- Work style
- Core values (select top 3)
- Personality type
- Work time preference
- Have you built before?
- Previous failure reason
- What would make you quit?
- Comfortable with uncertainty?
- Trial project willingness
- Hackathon experience
- Founder references (dynamic form)
- Why 10/10 co-founder
- Intro video URL
- Legal clearances
Features:
- Auto-save on every field change
- "Save & Continue Later" button on each step
- Progress bar at top
- "Skip for now" on Tier 4 questions
- Navigation: Back/Next buttons
- Field validation with helpful errors
Header Component:
{user.profile_completion_percentage < 80 && (
<div className="profile-progress-banner">
<ProgressBar percentage={user.profile_completion_percentage} />
<span>{user.profile_completion_percentage}% Complete</span>
<button onClick={openProfileSetup}>Complete Profile →</button>
</div>
)}const features = {
ideas: { requiredTier: 2, completionNeeded: 30 },
validation: { requiredTier: 2, completionNeeded: 30 },
cofounderMatches: { requiredTier: 3, completionNeeded: 80 },
messaging: { requiredTier: 3, completionNeeded: 80 },
resources: { requiredTier: 1, completionNeeded: 0 }, // Always accessible
copilot: { requiredTier: 1, completionNeeded: 0 }
};
const canAccessFeature = (feature) => {
return user.profile_completion_percentage >= features[feature].completionNeeded;
};{!canAccessFeature('cofounderMatches') && (
<LockedFeatureCard
title="Co-Founder Matches"
icon="users"
percentageNeeded={80}
currentPercentage={user.profile_completion_percentage}
actionText="Complete Profile to Unlock"
/>
)}Layout:
┌─────────────────────────────────────┐
│ Co-Founder Matches [Filter]│
│ ─────────────────────────────────── │
│ Pending Requests (3) Sent (2)│
│ ─────────────────────────────────── │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ User Card │ │ User Card │ │
│ │ 85% Match ⭐ │ │ 78% Match │ │
│ │ [Connect] │ │ [Connect] │ │
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────┘
<MatchCard>
<Avatar />
<Name + Badge (if tier 4 complete) />
<MatchScore percentage={85} />
<MutualInterests tags={['AI', 'SaaS']} />
<KeyStats>
- Professional Status
- Location
- Commitment Level
</KeyStats>
<Actions>
<button>View Full Profile</button>
<button className="primary">Connect</button>
</Actions>
</MatchCard>- Location
- Skills
- Industry
- Min Match Score (slider)
- Commitment Level
- Profile Completion (Only show 80%+)
- New match request (bell icon badge)
- Match request accepted
- High-score match found (85%+)
- Profile 50% complete → Reminder email after 24h
- New match request → Immediate email
- Match request accepted → Immediate email
- Ideal match found (90%+) → Weekly digest
- React (existing)
- Multi-step form library (or custom)
- Auto-save with debouncing
- Progress bar component
- Tag/chip input components
- Express.js (existing)
- Supabase PostgreSQL (existing)
- Matching algorithm (custom JS)
- Email service (optional: SendGrid/Resend)
- PostgreSQL with JSONB for flexible fields
- GIN indexes for array searches
- Triggers for auto-calculations
- RLS policies for security
-
Profile Completion Rate
- Target: 60% reach Tier 3 (80% completion)
- Target: 20% reach Tier 4 (100% completion)
-
Match Quality
- Average match score: 70+
- Connection acceptance rate: 30%+
-
Engagement
- Time to complete Tier 3: < 20 minutes
- Return rate to complete profile: 40%+
- ✅ Run
complete_user_profile_schema.sqlin Supabase - ⬜ Build backend API endpoints
- ⬜ Create multi-step profile wizard
- ⬜ Implement matching algorithm
- ⬜ Build matches dashboard
- ⬜ Add progress tracking & feature gating
- ⬜ Test end-to-end
- ⬜ Deploy to production
Ready to build the best co-founder matching platform! 🎉