True hourly wage calculator
Take home 800 for 40 hours, add a 5-hour commute and 50 in fares and parking, and 20 an hour becomes about 16.6667. See what each hour you give the job truly earns. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Net pay
- 800
- Work hours
- 40
- Commute hours
- 5
- Expenses
- 50
- Adjusted pay
- 750
- Total hours
- 45
- Apparent hourly
- 20
- True hourly wage
- 16.6667
Your paycheck hourly rate is often optimistic. It ignores the time you spend getting to the job and the cash that never reaches savings because of transit fares, fuel, parking, uniforms, tools, or mandatory meals. This true hourly wage calculator subtracts those work-related expenses from take-home pay and spreads the result over work hours plus commuting hours, so you see what each hour of life actually earns. Enter net pay for any period—week, biweek, month, or year—along with hours worked and optional commute hours and expenses in the same period. The pure parse engine returns the true rate, the apparent rate from pay and work hours alone, the hourly drag between them, and a clear formula string for audits.
What true hourly wage means and the core formula
True hourly wage answers a simple fairness question: after the money you must spend to hold the job and the unpaid time you spend getting there, what is each hour of your week actually worth? Start with take-home pay for a fixed period—net of taxes and mandatory withholdings—not gross salary, because only cash you keep can pay rent and groceries.
Subtract work-related expenses paid in that same period: bus or train passes, fuel and tolls, parking, dry cleaning of uniforms, tools the employer does not reimburse, and similar outlays that would vanish if the job vanished. Do not subtract rent or groceries that you would pay whether or not you worked; this tool measures job-specific drag, not a full household budget. Then divide the remainder by total time tied to the job: clocked work hours plus commuting hours for that period.
Hourly drag is apparent minus true: the combined penalty of longer days and thinner net cash. A weekly example with eight hundred dollars take-home, forty work hours, five commute hours, and fifty dollars of transit and parking yields adjusted pay of seven hundred fifty, total hours of forty-five, true hourly about sixteen dollars and sixty-seven cents, and apparent hourly of twenty dollars. That four-dollar-plus gap is the cost of pretending the commute and expenses do not exist.
What you can do with it
Compare job offers with different commutes
Enter each offer’s take-home pay, work hours, commute hours, and parking or transit costs for the same period to see which job pays more per hour of life.
FAQ
Which expenses should I include?
Include job-specific costs you would not pay without the job: transit, fuel, parking, tolls, uniforms, tools, mandatory work meals. Exclude general living costs such as rent and groceries.
Should I use gross salary or take-home pay?
Take-home pay, after taxes and mandatory withholdings, because only the cash you keep can pay your bills. Use the same period for pay, hours, commute and expenses, whether a week, a month or a year.
How do I work out my commute hours?
Take your one-way commute in minutes, double it for the round trip, multiply by the workdays in the period and convert the total to hours. Those hours are added to your work hours.
What is the hourly drag?
The gap between the rate you think you earn, pay divided by work hours, and your true rate. In the example it is about 3.3333 an hour: the combined cost of the longer day and the money spent to work.
Can the true hourly wage be negative?
Yes, when work expenses are larger than your take-home pay. That is a deliberate warning that the job costs you money after its costs, rather than a figure quietly set to zero.
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/finance/true-hourly-wage \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"net_pay":800,"work_hours":40}'const res = await fetch("https://api.kit.forhosting.com/finance/true-hourly-wage", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"net_pay": 800,
"work_hours": 40
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/true-hourly-wage",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"net_pay": 800,
"work_hours": 40
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/true-hourly-wage", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"net_pay":800,"work_hours":40}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"net_pay":800,"work_hours":40}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/true-hourly-wage", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"net_pay": 800,
"work_hours": 40
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.true_hourly_wage",
"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
What true hourly wage means and the core formula
In symbols, true_hourly_wage equals (net_pay minus expenses) divided by (work_hours plus commute_hours). Apparent hourly is net_pay divided by work_hours alone—the optimistic rate people quote when they ignore the commute.
Inputs, validation, outputs, and rounding
POST a JSON object with two required finite numbers and two optional ones. net_pay is take-home pay for the period and must be greater than or equal to zero. work_hours is hours worked in that same period and must be strictly greater than zero so division is defined. commute_hours defaults to zero and must be non-negative when supplied; sum one-way minutes, double for a round trip, multiply by workdays, and convert to hours. expenses defaults to zero and must be non-negative; keep the same currency unit as net_pay. Missing fields, empty strings, NaN, Infinity, or wrong types fail with invalid_input naming the field and are not billed. On success the response echoes the cleaned inputs, adjusted_pay (net_pay minus expenses), total_hours, apparent_hourly, true_hourly_wage, hourly_drag, expense_drag_per_hour (expenses spread over total time), commute_time_share (commute as a fraction of total hours), the formula string, and a currency note that no conversion is applied. Money amounts are rounded half-up to two decimal places; hours and rates use four decimals; commute_time_share uses six. Negative true rates can appear when expenses exceed net_pay—that is intentional signal that the job is cash-negative after costs, not a silent clamp to zero. Align periods carefully: mixing monthly pay with weekly commute hours will understate or overstate the true rate; convert everything to one horizon before you call the endpoint.
Where a true hourly wage calculator earns its keep
Job seekers compare two offers that look similar on paper until commute and parking erase the higher nominal rate. Remote and hybrid workers quantify how many hours of life a three-day office mandate costs when round-trip traffic is counted. City planners and labor researchers batch the JSON API over survey rows of net pay, hours, and commute to publish distributions of effective wages by neighborhood. Failed validation never consumes prepaid balance. Pair this tool with a salary-to-hourly converter when you only know gross annual pay: convert to an approximate net first, then feed net_pay and schedule here to reveal the commute-adjusted story that headline hourly rates hide.
Integration use cases
Coach clients on hidden work costs
Financial coaches use the free browser widget to show how fuel, uniforms, and long drives shrink an optimistic hourly rate into a true one.
Batch effective-wage research
Survey analysts call the JSON API with aligned net pay, hours, and commute fields to publish true-hourly distributions without custom spreadsheet macros.
Technical questions
How is true hourly wage calculated?
true_hourly_wage = (net_pay − expenses) / (work_hours + commute_hours). Use take-home pay and costs for the same period; commute_hours and expenses default to zero when omitted.
What is the difference between apparent_hourly and true_hourly_wage?
apparent_hourly is net_pay ÷ work_hours only. true_hourly_wage also subtracts expenses and adds commute time. hourly_drag is the difference between those two rates.
What if work_hours is zero or net_pay is missing?
The task fails with invalid_input. work_hours must be strictly positive and net_pay is required and non-negative. Failed validation is not billed.
What does the true hourly wage calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.