Calculate exactly what you need to charge to meet your income goals.
$
$
Hrs
Wks
%
You Needs to Charge At Least
$0.00 / hr
Total Annual Revenue Needed$0.00
Total Billable Hours/Year0
How to Calculate Your Freelance Hourly Rate
Determining the correct hourly rate is one of the biggest challenges for freelancers, consultants, and contractors. Unlike a salaried employee, your hourly rate must cover not just your take-home pay, but also your business overhead, taxes, and unbillable time (like marketing and admin work).
The formula used in this calculator follows a "Reverse Income" method:
Determine Net Income: Start with the amount of money you want to take home annually.
Add Overhead: Add your business expenses (software subscriptions, insurance, internet, etc.).
Account for Taxes: Freelancers pay self-employment tax. You need to earn enough gross revenue to pay these taxes and still hit your net income goal.
Calculate Capacity: You cannot bill 40 hours a week, 52 weeks a year. You must subtract vacation time, sick days, and non-billable administrative hours to find your true "Billable Capacity."
Example Calculation
Let's say you want to take home $80,000 a year.
Expenses: You spend $400/month on software and insurance ($4,800/year).
Taxes: You estimate a 30% tax rate.
Time Off: You want 4 weeks of vacation per year.
Workload: You can realistically bill 30 hours per week (leaving 10 hours for admin/sales).
To achieve this, you would need to generate approximately $121,142 in gross revenue. With 1,440 billable hours available (48 weeks × 30 hours), your minimum hourly rate must be roughly $84.13.
Why "Billable Hours" Matter
New freelancers often make the mistake of dividing their desired salary by 2,080 (the standard number of work hours in a year). This leads to undercharging because it assumes 100% efficiency and 0 weeks off. Realistically, most successful freelancers only bill 50-75% of their working time.
function calculateFreelanceRate() {
// 1. Get Input Values
var incomeGoal = document.getElementById("fl-income").value;
var monthlyExpenses = document.getElementById("fl-expenses").value;
var weeklyHours = document.getElementById("fl-hours").value;
var weeksOff = document.getElementById("fl-weeks-off").value;
var taxRate = document.getElementById("fl-tax").value;
// 2. Validate Inputs
if (incomeGoal === "" || weeklyHours === "") {
alert("Please enter at least your Income Goal and Billable Hours.");
return;
}
// Convert strings to floats, handle defaults if empty
var netIncome = parseFloat(incomeGoal);
var expenses = monthlyExpenses ? parseFloat(monthlyExpenses) : 0;
var hoursPerWeek = parseFloat(weeklyHours);
var weeksVacation = weeksOff ? parseFloat(weeksOff) : 0;
var taxPercent = taxRate ? parseFloat(taxRate) : 0;
// 3. Perform Calculations
// A. Annual Business Expenses
var annualExpenses = expenses * 12;
// B. Total Net Needed (Income + Expenses) before tax logic applied to the gross
// We need Gross Revenue (G).
// G – (G * TaxRate) = NetIncome + AnnualExpenses
// G * (1 – TaxRate) = NetIncome + AnnualExpenses
// G = (NetIncome + AnnualExpenses) / (1 – TaxRate)
var totalCashNeeds = netIncome + annualExpenses;
var taxDecimal = taxPercent / 100;
// Prevent division by zero or negative if tax is 100%
if (taxDecimal >= 1) {
alert("Tax rate cannot be 100% or more.");
return;
}
var grossRevenueNeeded = totalCashNeeds / (1 – taxDecimal);
// C. Calculate Total Billable Hours
var workingWeeks = 52 – weeksVacation;
if (workingWeeks <= 0) {
alert("You cannot take 52 or more weeks off!");
return;
}
var totalBillableHours = workingWeeks * hoursPerWeek;
if (totalBillableHours <= 0) {
alert("Billable hours must be greater than zero.");
return;
}
// D. Final Hourly Rate
var hourlyRate = grossRevenueNeeded / totalBillableHours;
// 4. Update the DOM with Results
// Formatting currency
var formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
});
document.getElementById("fl-hourly-display").innerHTML = formatter.format(hourlyRate) + " / hr";
document.getElementById("fl-gross-revenue").innerHTML = formatter.format(grossRevenueNeeded);
document.getElementById("fl-total-hours").innerHTML = totalBillableHours.toLocaleString();
// Show result box
document.getElementById("fl-result").style.display = "block";
}