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.
Start Your Free Trial
7 days free, then $9/month. Cancel anytime. Full hub access from day one.
๐ Secured by Stripe ยท No charge for 7 days
// โโ 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 = `