Hourly Rate Calculator

Professional Hourly Rate Calculator

Percentage of hours spent on client work vs. admin/marketing.

Your Target Hourly Rate

Understanding Your Hourly Rate Calculation

Setting the correct hourly rate is one of the most critical steps for any freelancer or consultant. Many professionals make the mistake of simply dividing their desired salary by 2,080 hours (40 hours x 52 weeks). However, this "employee math" fails to account for the hidden costs of running a business.

The Components of a Sustainable Rate

  • Desired Annual Income: This is your "take-home" pay before personal taxes. It should reflect your experience, the value you provide, and your cost of living.
  • Business Expenses: Unlike an employee, you must pay for your own health insurance, software licenses, computer hardware, office space, and marketing.
  • Billable vs. Non-Billable Time: Not every hour you work can be charged to a client. You will spend significant time on invoicing, pitching new clients, and professional development. A typical freelancer is only 60% to 80% "billable."
  • Time Off: You need to factor in unpaid holidays, sick days, and vacations to ensure your annual income goals are met while still taking time to rest.

Example Calculation

If you want to earn $90,000 a year and have $10,000 in annual business expenses, you need to generate $100,000 in total revenue. If you work 40 hours a week but take 4 weeks off, you have 48 working weeks. If only 75% of those hours are billable, your math looks like this:

Total Revenue Needed: $100,000
Total Working Hours: 48 weeks × 40 hours = 1,920 hours
Billable Hours: 1,920 hours × 0.75 = 1,440 hours
Hourly Rate: $100,000 ÷ 1,440 = $69.44 per hour

Pro Tips for Raising Your Rate

If the calculated rate seems high for your market, consider these strategies:

  1. Value-Based Pricing: Instead of charging for time, charge based on the value or ROI the project provides to the client.
  2. Niche Down: Specialists can almost always command higher rates than generalists because they solve specific, high-value problems.
  3. Reduce Overheads: Audit your business expenses annually to ensure you aren't paying for unused subscriptions.
  4. Increase Efficiency: Use tools to automate admin tasks, thereby increasing your billable percentage.
function calculateHourlyRate() { var desiredIncome = parseFloat(document.getElementById('desiredIncome').value); var annualExpenses = parseFloat(document.getElementById('annualExpenses').value); var workHours = parseFloat(document.getElementById('workHours').value); var weeksOff = parseFloat(document.getElementById('weeksOff').value); var billablePercent = parseFloat(document.getElementById('billablePercent').value); // Validation if (isNaN(desiredIncome) || desiredIncome <= 0) { alert("Please enter a valid desired income."); return; } if (isNaN(annualExpenses)) { annualExpenses = 0; } if (isNaN(workHours) || workHours 168) { alert("Please enter valid work hours per week."); return; } if (isNaN(weeksOff) || weeksOff = 52) { alert("Please enter valid weeks off (0-51)."); return; } if (isNaN(billablePercent) || billablePercent 100) { alert("Please enter a valid billable percentage (1-100)."); return; } // Calculations var totalRevenueRequired = desiredIncome + annualExpenses; var weeksWorking = 52 – weeksOff; var totalAvailableHours = weeksWorking * workHours; var actualBillableHours = totalAvailableHours * (billablePercent / 100); var hourlyRate = totalRevenueRequired / actualBillableHours; // Display var resultDisplay = document.getElementById('resultDisplay'); var rateValue = document.getElementById('rateValue'); var breakdownText = document.getElementById('breakdownText'); rateValue.innerHTML = "$" + hourlyRate.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); breakdownText.innerHTML = "To reach your goal, you need to earn $" + totalRevenueRequired.toLocaleString() + " total revenue across " + Math.round(actualBillableHours) + " billable hours per year."; resultDisplay.style.display = "block"; resultDisplay.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }

Leave a Comment