After years of underquoting, I built this calculator to stop guessing. It's not a Google Sheet — it's a JavaScript snippet you can copy and run in 30 seconds. No account needed.
Why Most Developers Underquote
The root cause isn't lack of confidence. It's lack of math.
When you're freelancing, you need to account for:
- Base salary you'd accept as an employee
- Taxes (25-30% on top)
- Health insurance ($300-800/month in the US)
- Vacation days (22 days/year = ~9% unpaid)
- Sick days, holidays, benefits
- Admin work, meetings, emails (20-30% of your time)
- Tools and subscriptions
- Getting fired / slow months
Most developers take their desired monthly salary and divide by 160 hours. That gives you a day rate that's probably 40% too low.
The Calculator
Here are two ways to use it — pick whichever is faster for you.
Option 1: Browser Console (30 seconds)
Open your browser's developer console (F12 → Console), paste this, and press Enter:
// Freelance Rate Calculator
const baseSalary = 85000; // Your target annual gross
const workHoursPerYear = 1600; // 40hrs × 50 weeks
const taxRate = 0.28;
const benefitsCost = 9600;
const overheadMultiplier = 1.35;
const billableRate = (baseSalary / workHoursPerYear) / (1 - taxRate) * overheadMultiplier + (benefitsCost / workHoursPerYear);
console.log(`Your minimum day rate: $${Math.round(billableRate * 8)}`);
console.log(`Your minimum hour rate: $${Math.round(billableRate * 100) / 100}`);
Option 2: Standalone HTML File
Save this as rate-calculator.html and open in any browser:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Freelance Rate Calculator</title>
<style>
body { font-family: system-ui; max-width: 480px; margin: 2rem auto; padding: 1rem; }
label { display: block; margin-top: 0.75rem; font-weight: 600; }
input { width: 100%; padding: 0.5rem; margin-top: 0.25rem; box-sizing: border-box; }
button { margin-top: 1rem; padding: 0.75rem 1.5rem; background: #2d2d2d; color: white; border: none; cursor: pointer; }
.result { margin-top: 1.5rem; padding: 1rem; background: #f5f5f5; border-radius: 6px; }
</style>
</head>
<body>
<h1>Freelance Rate Calculator</h1>
<label>Target annual gross salary ($)</label>
<input type="number" id="salary" value="85000">
<label>Work hours per year</label>
<input type="number" id="hours" value="1600">
<label>Benefits cost per year ($)</label>
<input type="number" id="benefits" value="9600">
<button onclick="calculate()">Calculate</button>
<div class="result" id="result"></div>
<script>
function calculate() {
const salary = parseFloat(document.getElementById("salary").value) || 85000;
const hours = parseFloat(document.getElementById("hours").value) || 1600;
const benefits = parseFloat(document.getElementById("benefits").value) || 9600;
const taxRate = 0.28;
const overhead = 1.35;
const rate = (salary / hours) / (1 - taxRate) * overhead + (benefits / hours);
const dayRate = Math.round(rate * 8);
document.getElementById("result").innerHTML = `
<p><strong>Minimum hour rate:</strong> $${Math.round(rate * 100) / 100}</p>
<p><strong>Minimum day rate (8hrs):</strong> $${dayRate}</p>
<p><strong>Minimum month rate (20 days):</strong> $${Math.round(dayRate * 20)}</p>
<p style="margin-top:0.75rem;font-size:0.875rem;">Based on 28% tax, 35% overhead for vacation/sick/admin.</p>
`;
}
</script>
</body>
</html>
What This Calculator Gets Right
Most rate formulas fail because they ignore the invisible costs:
| Factor | What it means |
|---|---|
| Tax buffer | Freelancers pay both employer + employee FICA. Set aside ~28%. |
| Benefits gap | Health insurance, 401k match, paid leave — adds $8-15k/year |
| Time overhead | Meetings, emails, invoicing, hunting for work — 35% on top |
| Slow months | Q4 holidays, summer slumps, between-contracts gaps |
What to Do With This Number
- Never go below it — even for quick projects
- Add margin for complexity — difficult clients, tight deadlines = +20-40%
- Track it in proposals — show clients how you calculated it
I also published an article on the 5 biggest pricing mistakes developers make. Read it here.
If this saved you from one underquoting mistake, you can buy me a coffee: paypal.me/cheapuno
Continue learning: If you are trying to turn this into a paid freelance offer, I wrote a complete scope estimation framework here: The Freelance Scope Estimation Framework I Use Instead of Hourly Rates
Top comments (0)