Skip to content

Option A: Individual-Only Free Plan - Business Model Implementation

Date: November 4, 2025 Version: 20251104.17:30 Status: ✅ COMPLETE - Production Ready


Table of Contents

  1. Overview
  2. Business Model Structure
  3. Implementation Summary
  4. Technical Architecture
  5. User Experience Flow
  6. Testing Guide
  7. Revenue Impact Analysis
  8. 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

plan VARCHAR(20) DEFAULT 'free'  -- 'free', 'team', 'enterprise'

Existing: team_members table tracks membership

team_id UUID
user_id UUID
role VARCHAR(20)  -- 'owner', 'admin', 'member'

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:

{
  "plan": "free",
  "limit": 1,
  "current": 1,
  "remaining": 0,
  "canAddMore": false
}


User Experience Flow

Free User Journey

  1. User signs up → Lands on dashboard
  2. Navigates to Settings → Members → Clicks "Invite Member"
  3. Sees yellow badge: "Free Plan (Individual Use Only) - 1/1 members used"
  4. Invite button is DISABLED (grayed out)
  5. Sees "Upgrade Plan" button → Links to /pricing
  6. Views pricing page → Team plan clearly highlights "Team collaboration (up to 5 members)"
  7. Upgrades to Team plan → €99/month via Stripe
  8. Returns to Members page → Sees blue badge "Team Plan - ⅕ members used"
  9. Invite button now ENABLED → Can add up to 4 more members

Team User Journey (5 members max)

  1. User on Team plan → ⅗ members currently
  2. Navigates to Settings → Members → Clicks "Invite Member"
  3. Sees blue badge: "Team Plan - ⅗ members used"
  4. Invites 2 more members → Now 5/5 members
  5. Badge turns yellow: "Team Plan - 5/5 members used"
  6. Invite button DISABLED
  7. Sees upgrade prompt: "Upgrade to Enterprise plan (€299/month) for unlimited members"

Enterprise User Journey (unlimited)

  1. User on Enterprise plan → 12 members currently
  2. Navigates to Settings → Members → Clicks "Invite Member"
  3. Sees blue badge: "Enterprise Plan - 12 members (unlimited)"
  4. Invite button always ENABLED
  5. 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

  1. Conversion Rate: % of free users upgrading to Team
  2. Target: 20-35%
  3. Track: Stripe dashboard (new subscriptions)

  4. Upgrade Trigger: When users hit "Invite Member" on free plan

  5. Track: PostHog event "member_limit_reached"
  6. Track: Clicks on "Upgrade Plan" button

  7. Churn Rate: % of free users leaving after seeing limit

  8. Track: Account deletions after member limit hit
  9. Target: <15%

  10. Time to Upgrade: Days from signup to upgrade

  11. Track: Days between account creation → Stripe subscription
  12. 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)



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.