Option A: Individual-Only Free Plan - Business Model Implementation¶
Date: November 4, 2025 Version: 20251104.17:30 Status: ✅ COMPLETE - Production Ready
Table of Contents¶
- Overview
- Business Model Structure
- Implementation Summary
- Technical Architecture
- User Experience Flow
- Testing Guide
- Revenue Impact Analysis
- Migration Path
Overview¶
Strategic Decision¶
CodeSlick has implemented Option A: Individual-Only Free Plan, a B2B-first business model that drives clear upgrade paths from free individual use to paid team collaboration.
Why Option A?¶
Problem: Previous model allowed unlimited team members on free plan, undermining Team plan value proposition (€99/month).
Solution: Restrict free plan to individual use only (1 user), making team collaboration a paid feature starting at Team plan.
Key Changes¶
| Plan | Old Model | New Model (Option A) |
|---|---|---|
| Free | Unlimited members (🚨 Problem) | 1 user only (Individual) |
| Team | 5 members, unlimited analyses | 5 members, unlimited analyses |
| Enterprise | Unlimited members, custom features | Unlimited members, custom features |
Business Model Structure¶
Free Plan - Individual Use Only¶
Price: €0/month (Forever free)
Limits: - 1 user (no team collaboration) - 20 PR analyses per month - 1 repository - 79+ security checks - OWASP Top 10 reporting - Basic GitHub integration - Community support
Target Audience: Individual developers, hobbyists, students
Upgrade Trigger: Need to add team members → must upgrade to Team
Team Plan - Collaboration Starts Here¶
Price: €99/month
Limits: - Up to 5 team members (clear value prop) - Unlimited PR analyses - 5 repositories - AI-powered auto-fix - Advanced GitHub integration - Team dashboard & analytics - Member invitations - Priority email support
Target Audience: Small development teams (2-5 people), startups
Upgrade Trigger: Need >5 members or unlimited repos → must upgrade to Enterprise
Enterprise Plan - Unlimited Everything¶
Price: €299/month
Limits: - Unlimited team members - Unlimited repositories - Unlimited PR analyses - Custom security rules - Compliance reporting (PCI-DSS, SOC 2) - Dedicated account manager - 24/7 priority support - SLA guarantee (99.9% uptime)
Target Audience: Large engineering teams (6+ people), enterprises
Implementation Summary¶
Files Created/Modified¶
1. Backend Enforcement¶
File: src/lib/analytics/usage-tracker.ts
- Added MEMBER_LIMITS constant (free: 1, team: 5, enterprise: null)
- Added getTeamMemberCount(teamId) - Get current member count
- Added canAddTeamMember(teamId) - Check if team can add members
- Added getTeamMemberLimit(teamId) - Get full limit info
File: src/app/api/teams/[id]/members/route.ts
- Added member limit check before adding member
- Returns 403 error with upgrade prompt when limit reached
- Error includes current plan, limit info, and upgrade message
File: src/app/api/teams/[id]/members/limit/route.ts (NEW)
- New API endpoint: GET /api/teams/[id]/members/limit
- Returns member limit info for UI display
2. UI Updates¶
File: src/components/settings/InviteMemberModal.tsx
- Added member limit badge (blue when available, yellow when limit reached)
- Disabled invite button when limit reached
- Added "Upgrade Plan" button linking to /pricing
- Real-time member count display
File: src/app/pricing/page.tsx
- Updated Free plan: "Individual use only (1 user)" - highlighted at top
- Updated Team plan: "Team collaboration (up to 5 members)" - emphasized
- Added "Member invitations" feature to Team plan
- Clear upgrade path messaging
3. Documentation¶
File: CLAUDE.md
- Updated Monetization section with Option A details
- Clear member limits documented
File: BETA_TESTING_GUIDE.md
- Updated Scenario 4 with comprehensive member limit testing
- Added upgrade flow testing
- Added limit enforcement verification steps
File: OPTION_A_BUSINESS_MODEL.md (THIS FILE)
- Complete business model documentation
Technical Architecture¶
Database Schema¶
Existing: teams table already has plan column
Existing: team_members table tracks membership
Enforcement Logic¶
// Define limits
const MEMBER_LIMITS = {
free: 1, // Individual use only
team: 5, // Up to 5 members
enterprise: null // Unlimited
};
// Check if team can add members
async function canAddTeamMember(teamId: string): Promise<boolean> {
const team = await getTeam(teamId);
const limit = MEMBER_LIMITS[team.plan];
if (limit === null) return true; // Unlimited
const currentCount = await getTeamMemberCount(teamId);
return currentCount < limit;
}
API Flow¶
POST /api/teams/[id]/members (Add member):
1. Authenticate user (owner/admin only)
2. Check member limit: canAddTeamMember(teamId)
3. If limit reached:
- Return 403 error
- Include upgrade message
- Frontend shows upgrade prompt
4. If limit OK:
- Create team member
- Send invitation
- Update member count
GET /api/teams/[id]/members/limit:
User Experience Flow¶
Free User Journey¶
- User signs up → Lands on dashboard
- Navigates to Settings → Members → Clicks "Invite Member"
- Sees yellow badge: "Free Plan (Individual Use Only) - 1/1 members used"
- Invite button is DISABLED (grayed out)
- Sees "Upgrade Plan" button → Links to
/pricing - Views pricing page → Team plan clearly highlights "Team collaboration (up to 5 members)"
- Upgrades to Team plan → €99/month via Stripe
- Returns to Members page → Sees blue badge "Team Plan - ⅕ members used"
- Invite button now ENABLED → Can add up to 4 more members
Team User Journey (5 members max)¶
- User on Team plan → ⅗ members currently
- Navigates to Settings → Members → Clicks "Invite Member"
- Sees blue badge: "Team Plan - ⅗ members used"
- Invites 2 more members → Now 5/5 members
- Badge turns yellow: "Team Plan - 5/5 members used"
- Invite button DISABLED
- Sees upgrade prompt: "Upgrade to Enterprise plan (€299/month) for unlimited members"
Enterprise User Journey (unlimited)¶
- User on Enterprise plan → 12 members currently
- Navigates to Settings → Members → Clicks "Invite Member"
- Sees blue badge: "Enterprise Plan - 12 members (unlimited)"
- Invite button always ENABLED
- No upgrade prompts (already on highest tier)
Testing Guide¶
Manual Testing Checklist¶
Test 1: Free Plan Limit Enforcement¶
- Create new free account
- Navigate to Settings → Members
- Verify badge shows "1/1 members used"
- Verify invite button is disabled
- Verify "Upgrade Plan" button shown
- Click "Upgrade Plan" → Redirects to
/pricing
Test 2: Team Plan Upgrade¶
- Complete Stripe checkout (€99/month)
- Return to Settings → Members
- Verify badge shows "⅕ members used"
- Verify invite button is enabled
- Invite 1 member → Badge updates to "⅖"
Test 3: Team Plan Limit Enforcement¶
- Invite members until 5/5 reached
- Verify badge shows "5/5 members used" (yellow)
- Verify invite button is disabled
- Verify upgrade prompt: "Upgrade to Enterprise..."
Test 4: API Enforcement¶
- Attempt to add member via API when limit reached
- Verify 403 error returned
- Verify error includes upgrade message
- Verify database not modified
Test 5: Enterprise Plan¶
- Upgrade to Enterprise (€299/month)
- Verify badge shows "X members (unlimited)"
- Add 10+ members → All succeed
- Verify no limit enforcement
Automated Testing¶
File: src/lib/analytics/__tests__/usage-tracker.test.ts (to be created)
describe('Member Limit Enforcement', () => {
it('should enforce 1-member limit for free plan', async () => {
const team = await createTeam({ plan: 'free' });
const canAdd = await canAddTeamMember(team.id);
expect(canAdd).toBe(false); // Already has owner
});
it('should allow up to 5 members for team plan', async () => {
const team = await createTeam({ plan: 'team' });
// Add 4 members (5 total with owner)
for (let i = 0; i < 4; i++) {
const canAdd = await canAddTeamMember(team.id);
expect(canAdd).toBe(true);
await addTeamMember(team.id, `user${i}@test.com`);
}
// Try to add 6th member
const canAdd = await canAddTeamMember(team.id);
expect(canAdd).toBe(false);
});
it('should allow unlimited members for enterprise plan', async () => {
const team = await createTeam({ plan: 'enterprise' });
// Add 100 members
for (let i = 0; i < 100; i++) {
const canAdd = await canAddTeamMember(team.id);
expect(canAdd).toBe(true);
await addTeamMember(team.id, `user${i}@test.com`);
}
});
});
Revenue Impact Analysis¶
Conversion Funnel¶
Before Option A (Problem):
100 Free Users
├─ 100 users get unlimited team features for free 🚨
└─ 5 users upgrade to Team (€99) = €495/month
After Option A (Solution):
100 Free Users (Individual)
├─ 30 users need collaboration → blocked by 1-member limit
│ ├─ 20 users upgrade to Team (€99) = €1,980/month
│ └─ 10 users churn (can't afford)
└─ 70 users stay on free (individuals, no team needs)
Revenue Projection¶
Conservative Estimate (20% conversion from free → team): - 1,000 free users - 200 upgrade to Team (€99/month) = €19,800/month - €237,600/year
Optimistic Estimate (35% conversion): - 1,000 free users - 350 upgrade to Team (€99/month) = €34,650/month - €415,800/year
Key Metrics to Track¶
- Conversion Rate: % of free users upgrading to Team
- Target: 20-35%
-
Track: Stripe dashboard (new subscriptions)
-
Upgrade Trigger: When users hit "Invite Member" on free plan
- Track: PostHog event "member_limit_reached"
-
Track: Clicks on "Upgrade Plan" button
-
Churn Rate: % of free users leaving after seeing limit
- Track: Account deletions after member limit hit
-
Target: <15%
-
Time to Upgrade: Days from signup to upgrade
- Track: Days between account creation → Stripe subscription
- Target: <14 days
Migration Path¶
Existing Free Plan Users (with >1 member)¶
Scenario: User on free plan already has 3 team members (grandfathered before Option A).
Migration Strategy:
Option 1: Grace Period (Recommended)
1. Email all affected users (30 days notice):
"Starting [DATE], free plans will be limited to 1 user.
Your team currently has 3 members. You have 30 days to:
- Upgrade to Team plan (€99/month) to keep all members
- OR reduce to 1 member (remove 2 members)"
2. After 30 days:
- FREE teams with >1 member: Cannot add more members
- Existing members remain (soft enforcement)
- Show banner: "Your team exceeds free plan limit. Upgrade to add members."
3. After 60 days:
- Hard enforcement: Remove all members except owner
- Send notification email
Option 2: Immediate Enforcement (Aggressive)
1. Immediately enforce 1-member limit
2. Existing members remain (soft enforcement)
3. Cannot add new members until upgraded or reduced to 1
Recommended: Option 1 (Grace Period) - Better UX, less churn
Database Migration¶
No migration needed! Existing schema already supports:
- teams.plan column (free, team, enterprise)
- team_members table (tracks all members)
Only changes are in application logic (enforcement).
Success Metrics¶
Week 1 KPIs¶
- 0 critical bugs related to member limits
- >80% of free users see upgrade prompt when inviting
- <10% of users encounter UI/UX issues with limits
Month 1 KPIs¶
- 10-20% of free users upgrade to Team
- <15% churn rate (free users leaving)
- €1,000-5,000 MRR from upgrades
Month 3 KPIs¶
- 20-35% conversion rate (free → team)
- €5,000-15,000 MRR
- 50-150 paying teams
Month 6 KPIs¶
- €15,000-30,000 MRR
- 150-300 paying teams
- 5-10% of teams upgrade to Enterprise
Rollback Plan¶
If Option A fails (high churn, low conversions):
Phase 1: Assess (Week 1-2) - Monitor churn rate daily - If churn >30%, prepare rollback - Collect user feedback via surveys
Phase 2: Rollback (Week 3)
1. Update MEMBER_LIMITS:
free: 3, // Allow small teams on free
team: 10, // Increase team limit
enterprise: null
2. Update pricing page messaging
3. Email all users:
"We heard your feedback. Free plans now support up to 3 members!"
4. Monitor for 30 days
Phase 3: Re-evaluate (Week 4-6) - If still not working, consider Option B (2-member free plan) - Or introduce "Starter" plan: €29/month for 3 members
FAQ¶
Why not allow 2-3 members on free plan?¶
Answer: Need clear separation between individual (free) and team (paid). Even 2 members = collaboration = team feature = should pay.
What if users create multiple free accounts to bypass limit?¶
Answer: - Track via email domains (flag multiple accounts from same company domain) - Require GitHub OAuth (harder to create fake accounts) - Monitor usage patterns (flag accounts with same repo names)
What about open source projects?¶
Answer: Consider "Open Source" plan: - Free for verified OSS projects (public repos only) - Unlimited members - Requires GitHub verification (repo must be public with OSS license)
Related Documentation¶
- CLAUDE.md - Main project documentation
- BETA_TESTING_GUIDE.md - Scenario 4 covers member limit testing
- PRODUCTION_STRIPE_SETUP_GUIDE.md - Stripe configuration
- PHASE_5_WEEK_1_KICKOFF.md - Beta launch planning
Changelog¶
| Date | Version | Change |
|---|---|---|
| 2025-11-04 | 1.0 | Initial implementation of Option A model |
Next Steps: Monitor beta testing feedback, track conversion rates, iterate based on user behavior.