Gross to net calculator
A gross salary of 50,000 with a 22% tax rate and 1,500 of fixed deductions leaves 37,500 to take home, after 11,000 of tax. Compare two job offers by what actually reaches your account, not by the headline figure. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Gross salary
- 50,000
- Tax rate
- 22
- Fixed deductions
- 1,500
- Tax amount
- 11,000
- Net pay
- 37,500
Gross salary is the figure on an offer letter and the first line of a payslip; net take-home is the amount that actually arrives in a bank account after tax and other withholdings.
How gross salary, a tax rate, and fixed deductions become net take-home pay
Gross-to-net pay is the payroll identity people search for when they type gross to net calculator: what remains after a single tax rate and a lump of fixed deductions come off the gross. Subtracting tax first and then the lump is the take-home figure. A fifty-thousand gross, a twenty-two percent tax rate, and one-thousand-five-hundred of fixed deductions print a tax of eleven thousand and a net of thirty-seven thousand five hundred.
Zero tax and zero deductions are legitimate and not errors: they print a net equal to the gross. When deductions exceed the after-tax gross the net is negative, which this calculator reports as a shortfall instead of clamping to zero. A negative gross salary is rejected: that is not a take-home question.
This calculator does not apply progressive brackets, credits, pretax versus post-tax ordering, employer matches, or jurisdiction tables. It does not convert currencies or annualize an hourly wage. You supply three finite numbers that already share one period and one currency; the calculator multiplies, subtracts, and rounds the money fields half-up to two decimal places so goldens compare byte-for-byte across runtimes.
Where a gross to net calculator earns its keep
Candidates comparing two offers use a gross to net calculator to turn headline salaries into take-home before they argue about title or start date. A sixty-thousand offer in a high-tax locale and a fifty-four-thousand offer with a lower rate are not ranked by gross; they are ranked by what hits the account after tax and after the pension and insurance that each employer already quoted.
Payroll operators pin the same three fields next to a payslip so a one-rate model can be checked against the live run without opening a full payroll engine. Budget coaches drop monthly gross, an effective rate, and a lump of rent-related or benefit deductions into one net so a household plan is built on spendable cash rather than on the offer letter. Failed validation does not consume balance.
What you can do with it
Check a payslip against a one-rate model
Pin gross, a blended withholding rate, and the period lump of other deductions next to the live run without opening a full payroll engine.
Build a household plan on spendable cash
Drop monthly gross, an effective rate, and a lump of insurance or pension deductions into one net so the budget starts from money that actually arrives.
FAQ
How is net take-home pay calculated?
Money fields round half-up to two decimal places.
Why is a negative gross salary rejected?
A paycheck that starts below zero is not a take-home question this calculator answers. Zero gross is allowed.
What happens if a field is missing or not a number?
NaN, Infinity, empty strings, and missing fields are rejected and are not billed.
Does it apply tax brackets or credits?
No. It uses one flat rate on the whole gross, with no progressive brackets, credits, employer matches or country tables. If your tax is progressive, enter the effective rate from your payslip or tax return to get a realistic net.
What should I include in fixed deductions?
Any fixed amount that comes off your pay for the same period after tax: pension contribution, health insurance, union dues, wage garnishments or a commute benefit. Add them into one lump before entering it.
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/gross-to-net \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"gross_salary":50000,"tax_rate":22,"fixed_deductions":1500}'const res = await fetch("https://api.kit.forhosting.com/fin/gross-to-net", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"gross_salary": 50000,
"tax_rate": 22,
"fixed_deductions": 1500
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/gross-to-net",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"gross_salary": 50000,
"tax_rate": 22,
"fixed_deductions": 1500
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/gross-to-net", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"gross_salary":50000,"tax_rate":22,"fixed_deductions":1500}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"gross_salary":50000,"tax_rate":22,"fixed_deductions":1500}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/gross-to-net", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"gross_salary": 50000,
"tax_rate": 22,
"fixed_deductions": 1500
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.gross_to_net",
"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
This gross to net calculator takes three finite numbers in one currency — gross_salary, a tax_rate in percent points, and a lump of fixed_deductions — and returns net_pay from the identity net_pay equals gross_salary minus tax_amount minus fixed_deductions, where tax_amount is gross_salary times tax_rate over one hundred. A negative gross salary fails with invalid_input and is not billed, because a paycheck that starts below zero is not a take-home question this tool answers.
How gross salary, a tax rate, and fixed deductions become net take-home pay
The identity this calculator uses is tax_amount equals gross_salary times tax_rate divided by one hundred, and net_pay equals gross_salary minus tax_amount minus fixed_deductions. gross_salary is the period pay in one currency — monthly, biweekly, weekly, or annual — before income tax and before the other amounts that never reach the bank. It is not an hourly rate, not a bonus pool, and not a year-to-date running total unless you have already rolled those into one number for the same period. tax_rate is a percent-point figure, not a decimal fraction: twenty-two means twenty-two percent, not twenty-two hundredths of a percent. That convention matches how people type a withholding rate from a payroll table or a simplified effective rate they already computed. fixed_deductions is a currency lump for the same period: pension contribution, health insurance premium, union dues, garnishments, commute benefit, or any other amount that comes off after tax is computed in this simplified model.
Input contract, response shape, and error behaviour
Zero tax and zero deductions are allowed and print a net equal to the gross. Example: fifty thousand of gross, twenty-two percent tax, and one thousand five hundred of deductions yield a tax of eleven thousand and a net of thirty-seven thousand five hundred. Example: forty-eight thousand seven hundred fifty point seventy-five of gross at eighteen point five percent with eight hundred forty-two point thirty-three of deductions yields a rounded tax and a rounded net from the same identity. POST a JSON body with three required finite numbers that share one period and one currency. gross_salary is the period top line and must be greater than or equal to zero; aliases gross, salary, gross_pay, and pay map to the same field so a worksheet can keep its column names. tax_rate is the withholding rate in percent points from zero through one hundred; aliases rate, tax_percent, percent, and tax are accepted. fixed_deductions is the period lump of other withholdings; aliases deductions, deduction, other_deductions, and fixed are accepted. Each numeric field may arrive as a JSON number or a numeric string. Missing fields, empty strings, and non-finite values — NaN, Infinity, or text that does not parse as a number — fail with invalid_input naming the field. Those failures are not billed. Negative gross salary also fails with invalid_input, because a paycheck that starts below zero is not a take-home figure anyone is asking this calculator to produce. Negative tax_rate and tax_rate above one hundred percent fail the same way. Negative fixed_deductions fail because a credit is not a deduction in this contract. On success the body echoes gross_salary, tax_rate, and fixed_deductions, then reports tax_amount as gross times rate over one hundred rounded half-up to two decimal places, net_pay as gross minus that tax minus the lump rounded half-up to two decimal places, plus a formula string restating the identity. Pair the JSON with your own rule for which tax rate matches the period you send — statutory withholding, a blended effective rate, or a modelling assumption — because this endpoint multiplies the rate you send; it does not look up brackets. Pricing is a flat $0.002 per successful request.
Where a gross to net calculator earns its keep
Keep gross_salary non-negative, keep tax_rate inside zero to one hundred, keep the lump non-negative, pin the rounded tax_amount and net_pay in tests, and you get a reproducible take-home figure for teasers, LMS plugins, and edge workers without standing up a payroll engine of your own.
Integration use cases
Compare two job offers on take-home
Turn each offer's gross salary, a local effective tax rate, and quoted benefit deductions into one net_pay before you rank the headlines.
Technical questions
Is tax_rate a percent or a decimal fraction?
Percent points: 22 means 22%, not 0.22. Rates below 0 or above 100 fail with invalid_input. Zero is allowed and prints a net of gross minus deductions.
What does the gross to net calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.