Determine your ideal hourly and daily billing rates based on income goals and overhead.
The actual money you want in your pocket after expenses/tax.
Software, hardware, insurance, office, marketing.
Subtract vacation and sick days (Standard: 48).
Hours spent on client work only (not admin/sales).
Include self-employment and income taxes.
Buffer for business growth or downtime.
Target Hourly Rate
$0.00
Target Day Rate
$0.00
Total Gross Revenue Required:0
Total Billable Hours per Year:0
How to Calculate Your Contractor Rate
Transitioning from a salaried employee to a contractor or freelancer requires a fundamental shift in how you value your time. You aren't just being paid for the hours you work; you are being paid to cover your own benefits, taxes, equipment, and unbillable business development time.
The Methodology
To find your "real" rate, we use a reverse-calculation method based on your financial needs:
Step 1: Determine Net Income Goal. This is the salary you want to pay yourself after all business costs.
Step 2: Add Operating Expenses. This includes everything from Zoom subscriptions to office rent and health insurance.
Step 3: Account for Taxes. As a contractor, you pay the full share of social security and income taxes. We calculate the gross revenue needed so that after tax, you are left with your goal amount.
Step 4: Factor in Billable Efficiency. You cannot bill 40 hours a week, 52 weeks a year. You must account for holidays, admin work, and sick leave. Most successful contractors aim for 20-30 billable hours per week.
Example Calculation
If you want to take home $70,000 a year, have $10,000 in expenses, and expect a 25% tax rate:
The most common mistake is simply dividing a former salary by 2,080 (the number of work hours in a standard year). This fails to account for the "Contractor Tax"—the fact that about 30-40% of your time will be spent on non-paid activities like invoicing, pitching, and learning new skills. Always add a profit margin buffer to ensure your business remains sustainable during quiet months.
function calculateContractorRate() {
var salary = parseFloat(document.getElementById('desiredSalary').value);
var expenses = parseFloat(document.getElementById('businessExpenses').value);
var weeks = parseFloat(document.getElementById('billableWeeks').value);
var hours = parseFloat(document.getElementById('billableHours').value);
var tax = parseFloat(document.getElementById('taxRate').value);
var profit = parseFloat(document.getElementById('profitMargin').value);
if (isNaN(salary) || isNaN(expenses) || isNaN(weeks) || isNaN(hours) || isNaN(tax) || isNaN(profit)) {
alert("Please fill in all fields with valid numbers.");
return;
}
if (tax >= 100) {
alert("Tax rate must be less than 100%.");
return;
}
if (weeks > 52) {
alert("Billable weeks cannot exceed 52.");
return;
}
// Calculation Logic
// 1. Calculate base annual need
var annualNeed = salary + expenses;
// 2. Adjust for Profit Margin
var withProfit = annualNeed * (1 + (profit / 100));
// 3. Gross up for Tax: Gross = Net / (1 – taxRate)
var grossRequired = withProfit / (1 – (tax / 100));
// 4. Calculate total billable hours
var totalAnnualHours = weeks * hours;
if (totalAnnualHours <= 0) {
alert("Billable hours and weeks must be greater than zero.");
return;
}
// 5. Final Rates
var hourlyRate = grossRequired / totalAnnualHours;
var dayRate = hourlyRate * 8; // Assuming an 8 hour standard day for day rate quotes
// Display Results
document.getElementById('hourlyResult').innerText = '$' + hourlyRate.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('dailyResult').innerText = '$' + dayRate.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('grossResult').innerText = '$' + grossRequired.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0});
document.getElementById('hoursResult').innerText = totalAnnualHours.toLocaleString() + ' hrs';
document.getElementById('resultsArea').style.display = 'block';
document.getElementById('resultsArea').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}