Bill rate calculator
With 80,000 of yearly costs, 1,200 billable hours and a 25% margin, you need to charge 88.89 an hour, while 66.67 would only break even. Price your rate card from your real numbers, not a gut feeling. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Annual costs
- 80,000
- Billable hours
- 1,200
- Profit margin
- 25
- Required revenue
- 106,666.67
- Profit amount
- 26,666.67
- Break even rate
- 66.67
- Hourly rate
- 88.89
Freelancers, consultants, and professional-services firms cannot quote an hourly rate from a gut feeling. The number that keeps the lights on is the bill rate: annual costs spread across the hours you can actually invoice, then lifted by the profit margin you intend to keep. This bill rate calculator takes those three inputs — annual costs, billable hours, and desired profit margin as a percent — and returns the rate per hour you must charge so the year covers the book and the margin.
How the hourly bill rate is computed from costs, hours, and margin
A bill rate is not a converted salary and it is not a markup sticker. It is the hourly price that recovers a year of costs and still leaves a chosen profit margin on the revenue those hours will produce. A solo consultant who works two thousand hours a year often invoices only twelve hundred to sixteen hundred of them after sales, admin, holidays, and slack.
Twenty-five means twenty-five percent of what you must bill, so the complement is seventy-five percent: required revenue equals annual costs divided by one minus the margin fraction. The hourly rate is that required revenue divided by billable hours. Equivalently, first form the break-even rate as annual costs over billable hours, then divide that break-even rate by the same complement.
When the margin is zero the two rates coincide and you are pricing only to recover the book. When the margin is twenty-five percent on eighty thousand of costs and twelve hundred billable hours, required revenue is one hundred six thousand six hundred sixty-six and two-thirds, the break-even rate is about sixty-six sixty-seven, and the bill rate is about eighty-eight eighty-nine in the same currency unit.
A margin of one hundred percent or more is rejected because the complement would be zero or negative and the required revenue would be undefined. The arithmetic is a handful of finite operations; there is no utilization forecast, no tax engine, and no currency conversion.
What you can do with it
Freelance and consultant rate cards
Turn a year of costs, an honest billable-hour forecast, and a target profit margin into the hourly rate you must print on the rate card.
FAQ
What happens if billable hours are zero or negative?
Zero or negative hours cannot set an hourly rate, and those failures are not billed.
How is this different from converting a salary to an hourly wage?
Salary-to-hourly divides annual pay by scheduled hours. A bill rate recovers a cost stack, lifts it by a profit margin on revenue, and divides by invoiceable hours. The two answers are not interchangeable.
Is the profit margin the same as a markup?
No. Here the margin is a share of the revenue you must bill, not a markup on cost. A 25% margin means costs must be three quarters of what you bill, so the costs are divided by that share instead of having a quarter added on top.
What should I include in annual costs?
Everything you must recover from client work: your salary or owner draw, payroll taxes, benefits, rent, software, insurance, contractors and any other operating expense. Leaving a line out lowers the rate without lowering what you actually spend.
How many billable hours should I assume in a year?
Only the hours you can put on an invoice, not the hours at your desk. A solo consultant who works two thousand hours a year often bills twelve hundred to sixteen hundred of them after sales, admin, holidays and slack.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/bill-rate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"annual_costs":80000,"billable_hours":1200,"profit_margin":25}'const res = await fetch("https://api.kit.forhosting.com/fin/bill-rate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"annual_costs": 80000,
"billable_hours": 1200,
"profit_margin": 25
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/bill-rate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"annual_costs": 80000,
"billable_hours": 1200,
"profit_margin": 25
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/bill-rate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"annual_costs":80000,"billable_hours":1200,"profit_margin":25}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"annual_costs":80000,"billable_hours":1200,"profit_margin":25}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/bill-rate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"annual_costs": 80000,
"billable_hours": 1200,
"profit_margin": 25
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.bill_rate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Zero or negative billable hours make the rate undefined, so the task fails with invalid_input and is not billed.
How the hourly bill rate is computed from costs, hours, and margin
Start with annual_costs: salary or owner draw, payroll taxes, benefits, rent, software, insurance, contractors, and every other operating line you must recover from client work. Pair that total with billable_hours — the hours you can actually put on an invoice, not the hours you sit at a desk. The third input is profit_margin, a percent of required revenue, not a fraction and not a markup on cost.
Input contract, response shape, and error behaviour
Example: eighty thousand of annual costs, twelve hundred billable hours, and a twenty-five percent margin yield a required revenue of one hundred six thousand six hundred sixty-six point six seven, a profit amount of twenty-six thousand six hundred sixty-six point six seven, a break-even rate of sixty-six point six seven, and an hourly bill rate of eighty-eight point eight nine. POST a JSON body with three required finite numbers. annual_costs is the yearly cost stack to recover, in one currency unit; aliases costs, annual_cost, and overhead map to the same field. billable_hours is the count of hours you can invoice in that same year; aliases hours and billable are accepted so a utilization sheet can keep its column names. profit_margin is the desired profit margin as a percent of required revenue — twenty-five means twenty-five percent, not zero point two five — and aliases margin and margin_percent are accepted. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values fail with invalid_input naming the field. If annual_costs is negative the request fails. If profit_margin is negative or is greater than or equal to one hundred the request fails, because a one-hundred-percent margin would divide by zero. Those failures are not billed. On success the body echoes annual_costs, billable_hours, and profit_margin, then reports required_revenue, profit_amount, break_even_rate, and hourly_rate, all money figures rounded half-up to cents. Pair the JSON with your own utilization model if you need to derive billable hours from a roster; this endpoint prices a given hour count, it does not forecast utilization.
Where a bill rate calculator earns its keep
Independent consultants use a bill rate calculator at the start of a year to turn a cost stack and an honest billable-hour forecast into a floor they can quote without underpricing the calendar. Agencies and studios re-run the same three fields when utilization slips or overhead jumps, then publish a new shop rate before proposals go out below cost. Failed validation does not consume balance. Finance partners drop annual_costs from the budget, billable_hours from the staffing plan, and profit_margin from the target, and they pin hourly_rate in a pricing sheet so every estimator shares one number. This is a different search and a different job from converting a salary into an equivalent wage: salary-to-hourly divides pay by scheduled hours, while a bill rate lifts costs by a profit margin and divides by invoiceable hours. Keep billable_hours strictly positive, keep profit_margin below one hundred, pin the rounded currency fields in tests, and you get a reproducible hourly bill rate for rate cards, LMS plugins, and edge workers without standing up a professional-services engine of your own.
Integration use cases
Agency shop-rate refresh
Re-price the studio when utilization or overhead changes: same calculator, new annual_costs or billable_hours, one shared hourly_rate.
Proposal and estimator fixtures
Pin required_revenue and hourly_rate in proposal tools and CI so every quote uses the same cost-plus-margin floor.
Technical questions
How is the hourly bill rate calculated?
Required revenue is annual_costs divided by one minus profit_margin/100. The hourly rate is that required revenue divided by billable_hours. Equivalently, divide the break-even rate (annual_costs / billable_hours) by the same complement. profit_margin is a percent of revenue, not a markup on cost.
Is profit_margin a percent or a fraction?
A percent of required revenue. Enter 25 for a twenty-five percent margin, not 0.25. Values below zero or greater than or equal to 100 are rejected because a 100 percent margin would divide by zero.
What does the bill rate calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.