The amount of money you want to take home after taxes and expenses.
Adobe CC, fonts, stock photos, internet, hardware, marketing, etc.
Include income tax and self-employment tax (usually 25-35%).
Hours actually spent designing for clients (exclude admin, email, marketing).
Vacation, sick days, and holidays.
Minimum Hourly Rate$0.00
Total Billable Hours / Year0
Annual Overhead (Expenses)$0.00
Gross Revenue Needed (Pre-Tax)$0.00
How to Calculate Your Graphic Design Hourly Rate
Determine the correct pricing strategy for your freelance graphic design business is crucial for sustainability. Many new designers make the mistake of picking a random number or simply copying what others charge. However, a sustainable rate must be calculated backward from your financial goals and operational realities.
The Freelance Rate Formula
This calculator uses a "bottom-up" approach to pricing. Instead of guessing, we look at your life expenses and business costs to determine exactly what you need to charge to remain profitable.
The core logic follows these steps:
Determine Net Income: How much do you need to pay your personal bills, save for retirement, and enjoy life?
Add Business Overhead: Graphic design requires subscriptions (Adobe Creative Cloud), high-end hardware (MacBook Pro/iMac), font licenses, hosting, and marketing costs. These are pre-tax business deductions.
Factor in Taxes: As a freelancer, you are responsible for the full tax burden, including self-employment tax. This is often calculated on your profit (Revenue minus Expenses).
Calculate Billable Capacity: This is the most overlooked factor. You cannot bill 40 hours a week. You need time for invoicing, emailing, portfolio updates, and finding new clients. A realistic billable load for a solo freelancer is often 20–25 hours per week.
Billable vs. Non-Billable Hours
One of the most critical inputs in this calculator is "Billable Hours Per Week." If you work a standard 40-hour week, you likely only spend 50-60% of that time on paid client work.
Non-Billable Tasks: Bookkeeping, updating your website, cold emailing, networking, learning new software tools.
If you divide your desired income by 40 hours/week, you will undercharge and fail to meet your income goals because you aren't getting paid for the administrative time.
Why Overhead Matters for Designers
Unlike some consulting roles, graphic design is software-heavy. Your rate needs to cover:
Inputting these accurately into the "Monthly Business Expenses" field ensures your client work covers these tools, rather than them eating into your personal salary.
function calculateDesignRate() {
// 1. Get Input Values
var desiredNet = parseFloat(document.getElementById('desiredNetIncome').value);
var monthlyExp = parseFloat(document.getElementById('monthlyExpenses').value);
var taxRatePercent = parseFloat(document.getElementById('taxRate').value);
var billableHoursWeek = parseFloat(document.getElementById('billableHours').value);
var vacationWeeks = parseFloat(document.getElementById('vacationWeeks').value);
// 2. Validate Inputs
if (isNaN(desiredNet) || isNaN(monthlyExp) || isNaN(taxRatePercent) || isNaN(billableHoursWeek) || isNaN(vacationWeeks)) {
alert("Please fill in all fields with valid numbers.");
return;
}
// 3. Perform Calculations
// Calculate total working weeks
var workingWeeks = 52 – vacationWeeks;
if (workingWeeks = 1) taxDecimal = 0.99;
var requiredTaxableIncome = desiredNet / (1 – taxDecimal);
var grossRevenueNeeded = requiredTaxableIncome + annualExpenses;
// Calculate Hourly Rate
var hourlyRate = 0;
if (totalBillableHours > 0) {
hourlyRate = grossRevenueNeeded / totalBillableHours;
}
// 4. Update DOM with Results
document.getElementById('hourlyRateResult').innerText = '$' + hourlyRate.toFixed(2);
document.getElementById('totalHoursResult').innerText = totalBillableHours.toLocaleString();
document.getElementById('annualExpensesResult').innerText = '$' + annualExpenses.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('grossRevenueResult').innerText = '$' + grossRevenueNeeded.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
// Show results area
document.getElementById('resultsArea').style.display = 'block';
}