Most freelancers — developers included — set their rate by taking an old salary and dividing by 2,080 hours. That number is almost always too low, because it ignores overhead and the fact that nobody bills 40 hours a week, 52 weeks a year.
I built Consulting Rate Hub, a free calculator that turns income targets into hourly, daily and project rates, adjusted for consultant type, industry and US metro. Here's the model underneath, which you can reuse for your own pricing.
Step 1: Start from what you need, not what you earned
The base rate comes from three inputs: target income, overhead and billable hours.
interface RateInputs {
targetIncome: number; // what you want to take home before tax, per year
overheadPct: number; // software, insurance, hardware, accounting, benefits...
billableHours: number; // realistic billable hours per year
}
export function baseHourly({ targetIncome, overheadPct, billableHours }: RateInputs) {
const grossNeeded = targetIncome * (1 + overheadPct / 100);
return grossNeeded / billableHours;
}
The key variable is billableHours. After sales, admin, holidays, sick days and gaps between clients, 1,000–1,400 billable hours a year is common for independents. Using 1,200 instead of 2,080 changes the answer by more than 70%.
Step 2: Apply multipliers for market context
The same work is priced differently depending on where and for whom it's done. The calculator applies three multipliers:
interface Context {
locationCol: number; // cost-of-living index, e.g. 1.58 for San Francisco
industry: number; // finance and healthcare usually pay above non-profit
experience: number; // junior vs senior
}
export function marketHourly(inputs: RateInputs, ctx: Context) {
return baseHourly(inputs) * ctx.locationCol * ctx.industry * ctx.experience;
}
Keeping multipliers as separate, named factors (instead of one magic number) makes the result explainable — which matters when you have to defend a rate in a proposal.
Step 3: Derive day and project rates
Clients often prefer day or project pricing. These are straightforward once the hourly rate exists:
export function rates(hourly: number) {
return {
hourly: Math.round(hourly),
daily: Math.round(hourly * 8),
project30Day: Math.round(hourly * 8 * 30),
annualAt1200h: Math.round(hourly * 1200),
};
}
For example, $287/hr becomes a $2,296 day rate. Seeing the day rate often nudges people toward daily pricing, which removes the incentive to count minutes.
Step 4: Show where you sit in the market
A single number isn't enough; people want to know whether they're cheap or expensive. The result shows a benchmark bar with P25, P50 (median) and P75 for the chosen combination, plus your position on it. Directional benchmarks — not guarantees — are the honest framing.
Step 5: Programmatic pages for every combination
With 10 consultant types, 20 industries and 50 US metros, there are 10,000 base combinations (and more with experience levels). Each gets its own calculator page — "IT consultant in healthcare, Chicago" — pre-filled with the right multipliers, so people land directly on a relevant number from search.
// /rates/[type]/[industry]/[city]
export function generateStaticParams() {
return types.flatMap((t) =>
industries.flatMap((i) => cities.map((c) => ({ type: t, industry: i, city: c })))
);
}
Step 6: Use AI for words, not numbers
The optional "Rate Justifier" writes a short, plain-language explanation of why the rate makes sense for the chosen market, and a proposal generator turns the number into a client-ready paragraph. The rate itself is always computed by the formula above.
Takeaways for pricing your own freelance work
- Use realistic billable hours (usually well under 2,080).
- Add overhead explicitly — your tools and insurance aren't free.
- Adjust for location, industry and seniority with named multipliers.
- Quote day or project rates when you can.
Try it at consultingratehub.com. How do you set your own freelance rate?
Top comments (0)