Determine your ideal hourly and day rate based on lifestyle and business costs.
How much you want to take home after business costs.
Software (Adobe CC), hardware, rent, insurance.
Self-employment tax and income tax.
Total days per year you won't be working.
Actual hours spent designing (usually 4-6).
Extra buffer for business growth/savings.
Recommended Hourly Rate
$0.00
Recommended Day Rate
$0.00
How to Calculate Your Graphic Design Freelance Rate
Setting your freelance rate is one of the most critical decisions you'll make as a graphic designer. Many beginners make the mistake of simply matching what their last employer paid them per hour. However, as a freelancer, you are a business owner. You must account for overhead, taxes, and non-billable time.
The Formula for Freelance Success
To calculate a sustainable rate, we use a "bottom-up" approach. Instead of guessing, we look at your required output and work backward:
Total Cost of Living: Your target net salary.
Business Overhead: Subscriptions (Adobe, Canva, Figma), hardware upgrades, high-speed internet, and marketing.
The Tax Gap: Unlike employees, freelancers pay the full share of self-employment taxes.
Billable vs. Non-Billable Hours: In an 8-hour day, you likely only spend 5-6 hours on actual client design. The rest is spent on admin, invoicing, and finding new clients.
Real-World Example
If you want to earn a net salary of $50,000, have $5,000 in expenses, and want to account for 25% tax:
Total Gross Needed: Approx $73,333.
Working Days: 260 potential days – 20 days off = 240 days.
Billable Hours: 240 days × 5 hours = 1,200 hours per year.
Resulting Rate: ~$61.11 per hour.
Why the "Day Rate" Matters
Many senior graphic designers prefer a day rate over an hourly rate. It simplifies billing and protects you from "the efficiency trap"—where you get punished (paid less) for being faster than a junior designer. A day rate is typically calculated as your hourly rate multiplied by a standard 8-hour work day.
function calculateFreelanceRate() {
// Get inputs
var targetSalary = parseFloat(document.getElementById('targetSalary').value) || 0;
var annualExpenses = parseFloat(document.getElementById('annualExpenses').value) || 0;
var taxRate = (parseFloat(document.getElementById('taxRate').value) || 0) / 100;
var timeOffDays = parseFloat(document.getElementById('timeOff').value) || 0;
var billableHoursPerDay = parseFloat(document.getElementById('billableHours').value) || 0;
var profitMargin = (parseFloat(document.getElementById('profitMargin').value) || 0) / 100;
// Business Logic
// 1. Calculate Gross Revenue Needed to hit Net target after expenses and taxes
// Formula: (Target Salary + Expenses) / (1 – Tax Rate)
var totalRequiredBeforeTax = (targetSalary + annualExpenses) / (1 – taxRate);
// 2. Add Profit Margin (Business growth/savings buffer)
var totalGrossRevenueNeeded = totalRequiredBeforeTax * (1 + profitMargin);
// 3. Calculate Billable Time
// Standard year has 260 weekdays (52 weeks * 5 days)
var totalWorkingDays = 260 – timeOffDays;
var totalAnnualBillableHours = totalWorkingDays * billableHoursPerDay;
// 4. Calculate Final Rates
var hourlyRate = 0;
if (totalAnnualBillableHours > 0) {
hourlyRate = totalGrossRevenueNeeded / totalAnnualBillableHours;
}
var dayRate = hourlyRate * 8; // standard 8-hour day for billing purposes
// Display Results
document.getElementById('rateResult').style.display = 'block';
document.getElementById('hourlyResult').innerText = '$' + hourlyRate.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('dayResult').innerText = '$' + dayRate.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('revenueBreakdown').innerHTML = 'To reach your goals, your business needs to generate $' + Math.round(totalGrossRevenueNeeded).toLocaleString() + ' in total annual revenue. This accounts for your salary, $' + Math.round(annualExpenses).toLocaleString() + ' in overhead, and taxes.';
// Scroll to result
document.getElementById('rateResult').scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}