Remote vs on-location workers
A remote job at 90,000 against an office job at 100,000 with 18,000 a year of commuting saves you 16,000 over 2 years by working remotely. Compare the two offers in cash, commute included. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Remote salary
- 90,000
- On location salary
- 100,000
- Commute cost
- 18,000
- Period
- 2
- Remote total pay
- 180,000
- On location total pay
- 200,000
- Commute total
- 36,000
- On location net
- 164,000
Choosing between remote work and an on-location role is a cash problem as well as a lifestyle one. Many employers post a lower remote salary while office offers keep a higher headline wage that is then eaten by fuel, transit fares, parking, and tolls. This remote versus on-location workers calculator takes the annual remote salary, the annual on-location salary, the annual commute cost of the office role, and a comparison period in years. It scales both salaries and that commute over the period, then returns the net savings of working remotely: remote pay minus on-location pay plus the commute you no longer spend. A positive result means remote wins on cash; a negative result means the office wage still wins after commuting.
What remote versus on-location savings means and how both sides are formed
A remote versus on-location comparison asks one cash question: over a stated period, is it better to take the remote salary and skip commuting, or to take the office salary and pay the commute. Remote work contributes its annual salary multiplied by the period and assumes a zero commute. On-location work contributes its annual salary multiplied by the same period, then subtracts the annual commute cost multiplied by the period.
Commute cost is the money you actually spend to be in the office: fuel or a mileage allowance, transit fares, parking, tolls, and any other cash outlay you choose to put in that bucket. The net savings of working remotely is remote total pay minus on-location net pay, which algebraically equals the salary gap plus the commute you avoid, all multiplied by the period.
What you can do with it
Remote offer versus city wage plus commute
Paste the remote salary, the on-location salary, a realistic annual commute, and a planning horizon to see whether working remotely still saves money after a location-adjusted cut.
People operations remote and on-site bands
Show employees how published remote and office bands compare once commute cost is subtracted, using the same numbers they can re-run after the meeting.
FAQ
What happens if period is zero or negative?
A non-positive period is not a comparison horizon, so the calculator refuses to invent a zero-savings result and is not billed.
Can remote salary be lower than the office salary?
Yes. Location-adjusted remote pay is the usual case.
What should I count as commute cost?
The money you actually spend to be in the office each year: fuel or a mileage allowance, transit fares, parking, tolls and any other cash outlay you decide belongs in that bucket.
What does a negative result mean?
That the office salary still wins on cash even after paying for the commute. A positive result means remote work leaves you with more money, and zero means the two offers tie after rounding.
Does it count the value of my commute time or home-office costs?
No. It does not put a price on the hours you stop commuting, add furniture or broadband, apply income-tax tables or discount future years. It compares cash pay and cash commuting only.
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/remote-vs-on-location-workers \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"remote_salary":90000,"on_location_salary":100000,"commute_cost":18000,"period":2}'const res = await fetch("https://api.kit.forhosting.com/fin/remote-vs-on-location-workers", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"remote_salary": 90000,
"on_location_salary": 100000,
"commute_cost": 18000,
"period": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/remote-vs-on-location-workers",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"remote_salary": 90000,
"on_location_salary": 100000,
"commute_cost": 18000,
"period": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/remote-vs-on-location-workers", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"remote_salary":90000,"on_location_salary":100000,"commute_cost":18000,"period":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"remote_salary":90000,"on_location_salary":100000,"commute_cost":18000,"period":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/remote-vs-on-location-workers", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"remote_salary": 90000,
"on_location_salary": 100000,
"commute_cost": 18000,
"period": 2
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.remote_vs_on_location_workers",
"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
If the period is not a positive number the task fails with invalid_input instead of inventing a horizon.
What remote versus on-location savings means and how both sides are formed
A positive net_savings means remote is the better cash path; a negative figure means the office wage still wins after commuting; a zero is a tie after rounding to currency. This identity does not discount cash flows to present value, does not add home-office furniture or broadband, does not price recovered commute hours, and does not fetch income-tax tables. Those belong to a fuller total-rewards model. Pin net_savings and verdict in tests so a later change to rounding cannot silently flip which offer looks cheaper.
Input contract, response shape, and error behaviour
Magnitudes above one trillion are rejected so a single isolate cannot be asked to emit non-finite products. Rounding is half-up so goldens compare byte-for-byte across runtimes. POST a JSON body with four required finite numbers. remote_salary is the annual pay of the remote role in currency units per year; aliases remote_pay and wfh_salary are accepted. on_location_salary is the annual pay of the office role in the same currency; aliases office_salary, onsite_salary, and on_site_salary are accepted. commute_cost is the annual cash cost of commuting for the on-location role; aliases annual_commute, commute, and commuting_cost are accepted. period is the comparison horizon in years; aliases years, horizon, and period_years are accepted. Each field may arrive as a JSON number or as a numeric string. Missing fields, empty strings, and non-finite values fail with invalid_input naming the field. remote_salary, on_location_salary, and commute_cost may be zero: an unpaid trial, a volunteer role, or a walk-to-work commute are valid planning cases, not errors. The distinctive failure is a non-positive period: if period is zero or negative the task fails rather than returning a horizon of nothing that would always report zero savings. On success the body echoes the four inputs; remote_total_pay; on_location_total_pay; commute_total; on_location_net after subtracting commute; salary_difference over the period; annual_net_savings; net_savings as the primary figure; verdict as remote, on_location, or tie; and a formula string.
Where a remote versus on-location workers calculator earns its keep
People operations teams that publish remote and on-site bands can show employees the commute offset from the same module the employee can re-run after the meeting. Failed validation does not consume balance. Candidates weighing a location-adjusted remote offer against a city wage can paste both salaries, a realistic annual commute, and a two-to-five-year horizon, then store net_savings beside the decision log. Personal-finance coaches can call the free browser path for a first look and the API for a stored file, guaranteeing that the figure a client saw on the landing page matches the figure filed after signup. Relocation advisors comparing a move-plus-office package with a stay-and-work-from-home package can hold commute_cost as the variable and read verdict without rebuilding the arithmetic. Keep the four numbers finite, keep period strictly positive, pin net_savings in tests, and you get a reproducible remote-versus-office call for widgets, offer letters, and edge workers without standing up a full total-rewards stack of your own.
Integration use cases
Stay-put remote versus relocate-and-commute
Hold commute_cost as the variable when a candidate compares staying remote with moving for an office package, and store net_savings beside the decision.
Technical questions
How is net savings of working remotely calculated?
net_savings = (remote_salary − on_location_salary + commute_cost) × period. That is remote total pay minus on-location pay after subtracting the commute over the same horizon.
What belongs in commute_cost?
The annual cash cost of getting to the office: fuel or mileage, transit, parking, and tolls, in the same currency as the salaries. Do not put recovered hours or home-office kit in this field.
What does the remote versus on-location workers calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.