RateLock - Salary and Rate Negotiation Simulator for Freelancers Who Freeze on the Call
Every freelancer has accepted a lowball offer because they panicked when the client pushed back. RateLock runs realistic negotiation role-plays via text using actual counterargument scripts, coaches you on your specific rate for your specific market, and tells you exactly what to say when they say 'that's above our budget'.
Difficulty
beginner
Category
Finance
Market Demand
High
Revenue Score
7/10
Platform
Web App
Vibe Code Friendly
⚡ YesHackathon Score
🏆 7/10
What is it?
Freelancers systematically undercharge because negotiation is a perishable skill that atrophies without practice — and there's no safe space to rehearse the exact moment a client says 'can you do $80 instead of $120?' without real money on the line. RateLock lets a freelancer enter their niche, years of experience, target rate, and location, then simulates a realistic client negotiation via a chat interface with 8 pre-scripted client personas (the Cheapskate, the Scope Creeper, the Slow Payer) powered by Claude. After each simulation, it scores their responses on confidence, specificity, and market alignment, and suggests exact alternative phrases. This is genuinely specific AI wrapper territory — the mechanic is persona-based adversarial role-play with a scoring rubric, not generic chat. Buildable in 10 days using Claude API with structured personas and a scoring prompt chain.
Why now?
The April 2026 freelance market has become hyper-competitive as vibe-coding commoditizes entry-level dev work, forcing freelancers to compete on positioning and negotiation rather than just skills — negotiation practice has never been more urgently needed and Claude's role-play capability has never been cheaper to build on.
- ▸8 pre-scripted client negotiation personas with distinct objection styles (Implementation: Claude system prompt with persona definition and objection script, user message is freelancer's response).
- ▸Post-round scoring that rates freelancer response on confidence, specificity, and market positioning with alternative phrasing suggestions (Implementation: second Claude call with scoring rubric JSON schema).
- ▸Market rate context injector that shows median rates for the freelancer's niche and location before each simulation (Implementation: static JSON rate database seeded from publicly available survey data).
- ▸Session history showing score progression across simulations so freelancers can track improvement over time (Implementation: Supabase SimulationSession table with scores per round).
Target Audience
Freelancers in design, development, writing, and consulting earning $30k-$150k/year who self-identify as bad negotiators — estimated 5M+ such freelancers in English-speaking markets.
Example Use Case
Marcus, a freelance developer quoting $150/hour, runs a simulation against The Budget Hawk persona. The persona pushes back with 'we had $95 in mind.' Marcus types his response, gets scored 6/10 for confidence, and sees the exact phrasing he should have used — he runs it 3 more times until his score hits 9/10 before his real client call next Tuesday.
User Stories
- ▸As a freelance developer who undercharges, I want to practice negotiating my $120/hour rate against realistic client pushbacks, so that I stop caving to lowball offers on real calls.
- ▸As a freelance designer, I want my negotiation responses scored on confidence and specificity after each simulation round, so that I can see concrete improvement before my next client pitch.
- ▸As a freelancer entering a new market, I want to see median rates for my niche and location before the simulation starts, so that I know whether my target rate is defensible.
Done When
- ✓Simulation: done when user selects a persona, enters their rate, and receives a realistic client objection within 3 seconds of their first message.
- ✓Scoring: done when after each freelancer response, a score card appears showing three numeric scores and one alternative phrasing suggestion.
- ✓Rate Context: done when user sees a median rate range for their niche and location displayed on the simulation setup screen before starting.
- ✓Billing: done when free user hits 3-simulation limit, sees upgrade modal, completes Stripe checkout, and immediately gains access to all personas without page reload.
Is it worth building?
$12/month x 200 freelancers = $2,400 MRR at month 3. $12/month x 800 freelancers = $9,600 MRR at month 8. Math assumes 4% conversion from r/freelance and r/webdev communities with 20k+ monthly active members.
Unit Economics
CAC: $5 via Reddit organic posts (time cost only, high volume). LTV: $144 (12 months at $12/month). Payback: 2 weeks. Gross margin: 87%.
Business Model
SaaS subscription
Monetization Path
Free: 3 simulations lifetime. $12/month: unlimited simulations, all 8 personas, score history. $29/month: adds market rate benchmarking from Glassdoor/Levels.fyi comparison.
Revenue Timeline
First dollar: week 2 via demo-to-paid conversion. $1k MRR: month 2. $5k MRR: month 7.
Estimated Monthly Cost
Claude API: $35 (at 1,000 simulations/month), Vercel: $20, Supabase: $25, Stripe fees: ~$8. Total: ~$88/month at launch.
Profit Potential
Lifestyle business viable at $3k-$8k MRR. High organic viral potential in freelance communities.
Scalability
Medium — add industry-specific persona packs (agency clients, startup founders, enterprise procurement), group workshop mode for freelance communities, and Slack bot version.
Success Metrics
Week 1: 200 signups from Reddit post. Month 1: 50 paid upgrades. Month 3: 200 paying, under 15% monthly churn.
Launch & Validation Plan
Post in r/freelance: 'What do you say when a client pushes back on your rate?' — if 30+ replies show negotiation anxiety, launch landing page with free trial offer and measure signups.
Customer Acquisition Strategy
First customer: post a free simulation demo (no sign-up required) in r/freelance and r/webdev and capture email at end of simulation — target 500 demo completions before asking for payment. Ongoing: Twitter freelance communities, ProductHunt launch, YouTube tutorial creators in freelance space.
What's the competition?
Competition Level
Low
Similar Products
Levels.fyi (salary data only, no practice), Glassdoor (market data, no negotiation coaching), ChatGPT (generic, no personas or scoring) — none combine adversarial persona role-play with market rate context and structured scoring.
Competitive Advantage
No negotiation coach costs $12/month. Generic AI chatbots don't have adversarial client personas with market rate context. The scoring rubric creates a measurable improvement loop that generic chat tools can't replicate.
Regulatory Risks
Low regulatory risk. Rate data is sourced from public surveys — do not claim it is legally binding salary advice. Add a disclaimer that rate benchmarks are estimates.
What's the roadmap?
Feature Roadmap
V1 (launch): 3 personas, rate context, scoring, session history, Stripe billing. V2 (month 2-3): 5 more personas, score trend chart, session summary email. V3 (month 4+): industry-specific persona packs, group workshop mode, Slack bot version.
Milestone Plan
Phase 1 (Week 1): Claude persona + scoring engine, chat UI — done when 3-turn simulation runs end-to-end. Phase 2 (Week 2): Stripe billing, session history, landing page with live demo — done when first user pays. Phase 3 (Month 2): 5 additional personas, ProductHunt launch — done when 100 paying users active.
How do you build it?
Tech Stack
Next.js, Claude API, Supabase, Stripe, Resend — build with Lovable for UI, Cursor for Claude persona logic, v0 for chat component
Suggested Frameworks
Claude API with structured JSON output, Next.js App Router, Supabase Auth
Time to Ship
10 days
Required Skills
Claude API prompt engineering for persona role-play, structured JSON output for scoring, Supabase, Stripe billing.
Resources
Claude API docs, Supabase auth quickstart, Stripe Checkout docs, Next.js App Router tutorial.
MVP Scope
app/page.tsx (landing + demo persona preview), app/simulate/page.tsx (chat simulation interface), app/api/simulate/route.ts (Claude persona role-play handler), app/api/score/route.ts (Claude scoring handler), app/history/page.tsx (session score history), lib/personas.ts (8 persona definitions with objection scripts), lib/rates.ts (static rate database by niche and location), lib/db/schema.ts (User, SimulationSession, Round tables), .env.example, seed.ts (demo sessions with scores)
Core User Journey
Select persona -> enter niche and target rate -> run negotiation chat -> receive score and alternative phrases -> run again until score improves -> upgrade to paid for unlimited access.
Architecture Pattern
User selects persona and enters their target rate -> Claude API runs persona with objection script -> user responds via chat -> second Claude call scores response with JSON rubric -> score stored in Supabase -> round repeats up to 5 turns -> session summary email via Resend.
Data Model
User has many SimulationSessions. SimulationSession belongs to one Persona and has many Rounds. Round has one FreelancerResponse and one Score with confidence, specificity, market_alignment fields.
Integration Points
Claude API for persona role-play and scoring, Supabase for session and score storage, Stripe for subscription billing, Resend for session summary email, Vercel for hosting.
V1 Scope Boundaries
V1 excludes: voice simulation, video role-play, agency or enterprise client personas, group workshop mode, Slack bot, real-time market rate API integration.
Success Definition
A freelancer finds RateLock via a Reddit post, completes a full simulation without any founder help, gets a score they want to improve, pays to run unlimited simulations, and renews after month one.
Challenges
Retention is the core risk — once a freelancer has practiced 5-10 times and feels confident, they may churn. Counter this with monthly new persona packs and a 'rate increase challenge' feature that motivates re-engagement. Distribution is organic-first through freelance subreddits — don't spend money on ads until $2k MRR is proven.
Avoid These Pitfalls
Don't build all 8 personas before validating that 3 personas generate real engagement — launch with 3 and add more based on user requests. Don't let Claude improvise objections freely — constrain persona behavior with a strict system prompt to ensure consistent, teachable scenarios. Finding your first 200 paying freelancers will take longer than building — budget 3x more time for Reddit and community distribution than development.
Security Requirements
Supabase Auth with Google OAuth. RLS on SimulationSession and Round tables. Claude API key server-side only, never exposed to client. Rate limiting 30 simulation turns/hour per user to control API costs. No PII stored beyond email.
Infrastructure Plan
Vercel for Next.js, Supabase for database and auth, Claude API for simulation, Sentry for errors, GitHub Actions for CI — total ~$88/month at launch.
Performance Targets
500 DAU at launch, ~2,000 simulation turns/day. Claude API response under 2s per turn. Page load under 1.5s. No caching needed — each turn is stateless except for session context passed client-side.
Go-Live Checklist
- ☐Security audit complete.
- ☐Claude API key confirmed server-side only.
- ☐Payment flow tested end-to-end.
- ☐Sentry error tracking live.
- ☐Rate limiting per user verified.
- ☐Custom domain with SSL active.
- ☐Privacy policy and terms published.
- ☐10 beta freelancers confirmed scoring feels accurate.
- ☐Launch post drafted for r/freelance and r/webdev.
First Run Experience
On first run: app opens directly to a live simulation with The Cheapskate persona already loaded, no sign-up required, with a pre-filled niche of 'freelance web developer' and target rate of $120/hour. User can immediately type their first response and receive a real Claude-powered pushback and score. Sign-up is gated only at the 3-simulation lifetime limit.
How to build it, step by step
1. Define lib/db/schema.ts with User, SimulationSession, Round, Score tables using Drizzle ORM. 2. Write lib/personas.ts with 3 launch personas (Cheapskate, Scope Creeper, Budget Hawk) each with a Claude system prompt defining their objection style and 5 scripted pushbacks. 3. Build Claude role-play handler in app/api/simulate/route.ts: system prompt = persona definition + freelancer's rate context, user message = freelancer's response, Claude responds as client. 4. Build Claude scoring handler in app/api/score/route.ts: prompt asks Claude to rate the freelancer's last response 1-10 on confidence, specificity, and market alignment, output JSON schema. 5. Build chat UI in app/simulate/page.tsx with persona selector, rate/niche input, and turn-by-turn message thread using v0 for component scaffolding. 6. Store each Round in Supabase with freelancer response, Claude reply, and Score JSON. 7. Build app/history/page.tsx showing score progression chart across sessions using Recharts. 8. Add free tier (3 lifetime simulations) enforced in Supabase RLS, Stripe $12/month checkout for unlimited access. 9. Build landing page in app/page.tsx with a live embedded demo simulation (no sign-up) using one public persona. 10. Verify: run a complete 5-turn simulation end-to-end as a free user, hit the limit, upgrade via Stripe, run another simulation, and confirm score history updates correctly.
Generated
April 28, 2026
Model
claude-sonnet-4-6
Disclaimer: Ideas on this site are AI-generated and may contain inaccuracies. Revenue estimates, market demand figures, and financial projections are illustrative assumptions only — not financial advice. Do your own research before making any business or investment decisions. Technology availability, pricing, and market conditions change rapidly; always verify details independently.