AI-Powered Freelance Pricing

Stop Guessing.
Start Charging
What You're Worth.

Get your AI-calculated rate in 2 minutes. Then manage your entire freelance business from one hub.

Step 1 of 4
What kind of freelancer are you?
๐ŸŽจ Graphic Designer
๐Ÿ’ป Web Developer
โœ๏ธ Copywriter
๐Ÿ“ท Photographer
๐ŸŽฌ Video Editor
๐Ÿ“ฑ Social Media Manager
๐Ÿ—‚๏ธ Virtual Assistant
๐Ÿ–ฅ๏ธ UX/UI Designer
๐Ÿ” SEO Specialist
โšก Other
Step 2 of 4
Tell us about your experience
Step 3 of 4
What are you pricing?
Analysing market rates...
12,400+
Rates Calculated
87%
Were Undercharging
$31/hr
Avg Rate Increase
4.9โ˜…
Average Rating
How It Works
Your rate in 2 minutes.
Your business, managed.
Answer a few questions, get an AI-calculated rate report, then use our full hub to run your freelance business.
01

Answer 4 quick questions

Tell us your freelancer type, experience, location, and what you're pricing. Takes under 2 minutes.

02

Get your AI rate report

We calculate your budget, recommended, and premium rates โ€” plus market insights and a negotiation tip.

03

Manage your business

Use the full hub to track jobs, create invoices, manage clients and set income goals โ€” all in one place.

Free vs Pro
See the difference
Start free and upgrade when you're ready. Pro gives you the full freelance command centre.
Free

Get Started

Free
  • โœ… AI rate calculator (all 4 steps)
  • โœ… Budget, mid & premium rate breakdown
  • โœ… 2 market insights
  • โœ… 1 negotiation tip
  • ๐Ÿ”’ Negotiation emails
  • ๐Ÿ”’ Pushback scripts
  • ๐Ÿ”’ Rate increase email
  • ๐Ÿ”’ Proposal template
  • ๐Ÿ”’ Rate tracker & job history
  • ๐Ÿ”’ Invoice generator
  • ๐Ÿ”’ Client tracker
  • ๐Ÿ”’ Income goals & dashboard
What you see
Budget$45/hr
Recommended$75/hr
Premium$120/hr
+ 2 insights + 1 tip. That's it.
Pro โ€” $9/month

Full Hub Access

$9/mo
  • โœ… Everything in Free
  • โœ… Full AI toolkit (emails, scripts, templates)
  • โœ… Rate tracker โ€” log every job
  • โœ… Invoice generator โ€” download PDFs
  • โœ… Client tracker โ€” manage all clients
  • โœ… Income goals & progress tracking
  • โœ… Earnings dashboard & charts
  • โœ… 7-day free trial, cancel anytime
Your dashboard
Total Earned
$14,200
Avg Rate
$85/hr
Clients
12
Goal Progress
73%
Monthly Goal
$7,300 of $10,000
No charge for 7 days. Cancel anytime.
Reviews
Freelancers love it
โ˜…โ˜…โ˜…โ˜…โ˜…

"I was charging $45/hr for web dev work. RateRight told me I should be at $90. I sent the negotiation email to my main client and they didn't even push back. Life-changing."

MK
Marcus K.
Web Developer, Canada
โ˜…โ˜…โ˜…โ˜…โ˜…

"The invoice generator alone is worth it. I used to spend 20 mins making invoices in Word. Now it's 60 seconds and they look way more professional than anything I had before."

SP
Sophia P.
Graphic Designer, Australia
โ˜…โ˜…โ˜…โ˜…โ˜…

"The client tracker and goals dashboard finally make me feel like I'm running a real business. I can see exactly how much I've made, who owes me, and how far I am from my monthly target."

JR
James R.
Copywriter, UK

Your rates.
Your business.
Under control.

Start free in 2 minutes. Upgrade to Pro for the full freelance hub โ€” rate tracker, invoices, clients, goals and more.

// โ”€โ”€ STATE โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ const state = { type: '', years: 3, country: 'Australia', skillLevel: 'intermediate', projectType: '', currentRate: '', extra: '' }; const loadingMsgs = ['Analysing market rates...', 'Comparing global freelancers...', 'Calculating your worth...', 'Building your report...']; let isPro = false; // โ”€โ”€ QUIZ NAV โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ function scrollToQuiz() { document.getElementById('quizCard').scrollIntoView({ behavior: 'smooth', block: 'center' }); } function selectType(el) { document.querySelectorAll('#typeGrid .pill').forEach(p => p.classList.remove('selected')); el.classList.add('selected'); state.type = el.getAttribute('data-value'); } function nextStep1() { if (!state.type) { alert('Please select your freelancer type first!'); return; } goTo(2); } function goTo(n) { document.querySelectorAll('.form-step').forEach(s => s.classList.remove('active')); document.getElementById('step' + n).classList.add('active'); } function updateYears(v) { state.years = v; document.getElementById('yearsDisplay').textContent = v == 0 ? 'Less than 1 year' : v == 1 ? '1 year' : v + ' years'; } async function getResults() { state.country = document.getElementById('country').value; state.skillLevel = document.getElementById('skillLevel').value; state.projectType = document.getElementById('projectType').value || 'general projects'; state.currentRate = document.getElementById('currentRate').value; state.extra = document.getElementById('extraContext').value; document.getElementById('errorBox').classList.remove('visible'); document.querySelectorAll('.form-step').forEach(s => s.classList.remove('active')); document.getElementById('stepLoading').classList.add('active'); let mi = 0; const interval = setInterval(() => { document.getElementById('loadingMsg').textContent = loadingMsgs[++mi % loadingMsgs.length]; }, 1800); try { const prompt = `Freelancer details: - Type: ${state.type} - Experience: ${state.years} years - Country: ${state.country} - Skill level: ${state.skillLevel} - Pricing for: ${state.projectType} ${state.currentRate ? '- Current rate: ' + state.currentRate : ''} ${state.extra ? '- Additional context: ' + state.extra : ''} Return ONLY a JSON object with these exact keys. Keep all string values SHORT (max 2 sentences each) to avoid JSON errors. Use \\n for line breaks in emails: budgetRate, midRate, premiumRate, rateType, verdict, insight1Title, insight1Body, insight2Title, insight2Body, freeNegTip, negotiationEmail, pushback1, pushback2, pushback3, rateIncreaseEmail, proposalTemplate`; const res = await fetch('/.netlify/functions/get-rate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt }) }); clearInterval(interval); if (!res.ok) { const e = await res.json(); throw new Error(e.error || 'Server error ' + res.status); } const data = await res.json(); if (!data.ok || !data.result) throw new Error(data.error || 'No result returned'); renderResults(data.result); } catch (e) { clearInterval(interval); document.querySelectorAll('.form-step').forEach(s => s.classList.remove('active')); document.getElementById('step3').classList.add('active'); const eb = document.getElementById('errorBox'); eb.textContent = 'Error: ' + e.message; eb.classList.add('visible'); } } function renderResults(r) { const str = v => (v === null || v === undefined) ? '' : String(v); const clean = v => str(v).replace(/\/hr|\/hour|\/project/gi, '').trim(); const rt = str(r.rateType).toLowerCase().includes('project') ? 'per project' : 'per hour'; const fmt = t => str(t).replace(/\\n/g, '
').replace(/\n/g, '
'); const esc = t => str(t).replace(/`/g, "'"); document.getElementById('resultsContent').innerHTML = `

Your Rate Report

${state.type} ยท ${state.country} ยท ${state.years} yrs exp

Budget
${clean(r.budgetRate)}
${rt}
Premium
${clean(r.premiumRate)}
${rt}
๐Ÿ’ก ${r.verdict || ''}
${r.insight1Title || 'Market Insight'}

${r.insight1Body || ''}

${r.insight2Title || 'Pricing Tip'}

${r.insight2Body || ''}

๐Ÿ’ก Negotiation Tip

${r.freeNegTip || ''}

โญ Pro Toolkit
๐Ÿ“ง Negotiation Email
Copy and send when pitching
${fmt(r.negotiationEmail)}
๐Ÿ›ก๏ธ Pushback Scripts
When clients say "too expensive"
01
${r.pushback1 || ''}
02
${r.pushback2 || ''}
03
${r.pushback3 || ''}
๐Ÿ“ˆ Rate Increase Email
Send to existing clients
${fmt(r.rateIncreaseEmail)}
๐Ÿ“„ Proposal Template
Fill in and win the job
${fmt(r.proposalTemplate)}

๐Ÿ”’ Unlock Your Full Pro Toolkit

You're undercharging. Here's everything you need to fix it and never leave money on the table again.

No charge for 7 days. Cancel anytime.
`; document.querySelectorAll('.form-step').forEach(s => s.classList.remove('active')); document.getElementById('stepResults').classList.add('active'); if (isPro) unlockPro(); } function unlockPro() { const pw = document.getElementById('paywallBlock'); const pc = document.getElementById('proContent'); if (pw) pw.style.display = 'none'; if (pc) pc.style.display = 'block'; } function resetQuiz() { document.querySelectorAll('.form-step').forEach(s => s.classList.remove('active')); document.querySelectorAll('#typeGrid .pill').forEach(p => p.classList.remove('selected')); state.type = ''; document.getElementById('step1').classList.add('active'); } function copyText(btn, text) { navigator.clipboard.writeText(text).then(() => { const o = btn.textContent; btn.textContent = 'โœ“ Copied!'; setTimeout(() => btn.textContent = o, 2000); }); } // โ”€โ”€ STRIPE โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ let stripe, cardElement; window.addEventListener('load', () => { try { stripe = Stripe('pk_test_51T9nyUP5MyL3Pa2TIF1AO3CJQG3W7w4PSWUEwuReS7eXeTH9rlRNgez7VI4usG7IPlEVPwok5FNNISB03Quajxod00XASQQ5Lt'); const elements = stripe.elements(); cardElement = elements.create('card', { style: { base: { color: '#f2f2f2', fontFamily: 'DM Sans, sans-serif', fontSize: '15px', '::placeholder': { color: '#555' } }, invalid: { color: '#ff6b35' } } }); cardElement.mount('#card-element'); cardElement.on('change', e => { document.getElementById('card-errors').textContent = e.error ? e.error.message : ''; }); } catch (e) { console.error('Stripe init error', e); } }); function openPayModal() { document.getElementById('payModal').classList.add('visible'); } function closePayModal() { document.getElementById('payModal').classList.remove('visible'); } document.getElementById('payModal').addEventListener('click', e => { if (e.target === e.currentTarget) closePayModal(); }); async function handlePayment() { if (!stripe || !cardElement) { alert('Payment system not loaded. Please refresh.'); return; } const btn = document.getElementById('submitBtn'); btn.textContent = 'Processing...'; btn.disabled = true; const { paymentMethod, error } = await stripe.createPaymentMethod({ type: 'card', card: cardElement }); if (error) { document.getElementById('card-errors').textContent = error.message; btn.textContent = 'Start Free Trial โ†’'; btn.disabled = false; return; } try { const res = await fetch('/.netlify/functions/create-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ paymentMethodId: paymentMethod.id, priceId: 'price_1T9o1mP5MyL3Pa2TG3tJr1IE' }) }); const data = await res.json(); if (data.error) throw new Error(data.error); isPro = true; closePayModal(); unlockPro(); alert('๐ŸŽ‰ Welcome to Pro! Your 7-day free trial has started.'); } catch (e) { documen