Interest Rate Points Calculator

Freelance Rate & Profitability Calculator

Determine your ideal hourly rate based on income goals and business costs.

What you want to take home after taxes and expenses.
Software, hardware, office rent, insurance.
Income tax, self-employment tax, etc.
Time spent on client work (not admin/marketing).
Weeks you will NOT be working per year.

Your Results

Recommended Hourly Rate

$0.00

Annual Gross Revenue Needed

$0.00

Monthly Gross Target

$0.00

Total Annual Expenses

$0.00

How to Calculate Your Freelance Hourly Rate

Transitioning from a full-time employee to a freelancer requires a shift in how you view your income. You are no longer just an "employee"; you are a business. This means your hourly rate must cover not only your salary but also your overhead, taxes, and non-billable time.

The Math Behind the Calculator

To find your rate, we use the following steps:

  1. Calculate Total Costs: We add your desired net income to your annual business expenses (Monthly Expenses × 12).
  2. Adjust for Taxes: We divide the total costs by (1 – Tax Rate) to find the "Gross Revenue" needed before the government takes their share.
  3. Determine Billable Hours: We multiply your weekly billable hours by the number of weeks you actually work (52 weeks – Vacation weeks).
  4. Final Rate: We divide the Gross Revenue by the Total Billable Hours.

Example Calculation

If you want to take home $70,000 a year, have $400 in monthly expenses, pay 25% in taxes, and work 20 billable hours a week with 4 weeks of vacation:

  • Annual Expenses: $4,800
  • Gross Income Needed (to net $70k after tax): Approximately $99,733
  • Total Billable Hours: 20 hours × 48 weeks = 960 hours
  • Hourly Rate: $99,733 / 960 = $103.89 per hour

Why Billable Hours Matter

Most freelancers forget that they cannot bill 40 hours a week. You spend significant time on marketing, invoicing, client communication, and learning new skills. These are "non-billable" hours. If you want to survive as a freelancer, your billable hours must subsidize your administrative time.

function calculateFreelanceRate() { var targetIncome = parseFloat(document.getElementById('targetIncome').value); var monthlyExpenses = parseFloat(document.getElementById('monthlyExpenses').value); var taxRate = parseFloat(document.getElementById('taxRate').value) / 100; var billableHoursPerWeek = parseFloat(document.getElementById('billableHours').value); var vacationWeeks = parseFloat(document.getElementById('vacationWeeks').value); if (isNaN(targetIncome) || isNaN(monthlyExpenses) || isNaN(taxRate) || isNaN(billableHoursPerWeek) || isNaN(vacationWeeks)) { alert("Please enter valid numeric values in all fields."); return; } // 1. Calculate Annual Expenses var annualExpenses = monthlyExpenses * 12; // 2. Gross income needed before expenses and taxes // Formula: (Target + Expenses) / (1 – TaxRate) var grossRevenueNeeded = (targetIncome + annualExpenses) / (1 – taxRate); // 3. Total billable hours per year var workingWeeks = 52 – vacationWeeks; if (workingWeeks <= 0) { alert("Vacation weeks cannot exceed or equal 52 weeks!"); return; } var totalBillableHoursYearly = billableHoursPerWeek * workingWeeks; // 4. Calculate hourly rate var hourlyRate = grossRevenueNeeded / totalBillableHoursYearly; // Display results document.getElementById('freelanceResults').style.display = 'block'; document.getElementById('hourlyRateResult').innerHTML = '$' + hourlyRate.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); document.getElementById('grossRevenueResult').innerHTML = '$' + grossRevenueNeeded.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); document.getElementById('monthlyGrossResult').innerHTML = '$' + (grossRevenueNeeded / 12).toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); document.getElementById('annualExpenseResult').innerHTML = '$' + annualExpenses.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); // Scroll to results document.getElementById('freelanceResults').scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }

Leave a Comment