About this tool
The Job Offer Comparison Calculator puts two or three Cambodian job offers on the same footing, so the decision is made on net cash and hours rather than on the headline salary. For each offer you enter the gross pay and whether it is monthly or annual, the guaranteed and estimated bonuses, a recurring monthly allowance, the value you personally put on non-cash benefits, the recurring costs of taking the job, weekly hours and annual leave. The page converts everything to riel, runs Tax on Salary and employee NSSF through the same core as the payroll tools, and returns monthly net cash, annual net cash, annual net after work costs and net cash per working hour, plus the difference between every pair of offers. It is built for a candidate weighing a factory salary against an office salary, an NGO post with more leave against a private one with a bonus, or a job that pays more but costs two hours of commuting a day. It does not pick a winner, does not value a benefit for you, and does not know whether a bonus will actually be paid. It also does not model seniority indemnity, the 13th-month wage, pension entitlements or career risk. None of it is legal or tax advice.
How it works
The model is in `lib/finance/job-offer-comparison.ts` and runs in the browser. Gross pay is converted to KHR — USD offers are multiplied by the rate you type, and if any offer or the display currency is USD without a positive rate the page refuses to calculate rather than guessing a rate — then normalised to a month. Tax on Salary and employee NSSF come from `computePayslip`, so the brackets, dependent reduction and wage bands are the same as the payroll calculator. Monthly net cash is gross minus TOS minus NSSF; annual net cash adds the guaranteed bonus and twelve monthly allowances. Annual net after costs subtracts twelve months of recurring costs. Annual working hours are (52 − floor(leave days ÷ 7)) × hours per week, and net cash per working hour divides the after-costs figure by that number. Deltas are shown for every ordered pair. The user-valued benefit figure is reported on its own line and never added to any total, because only you can decide what it is worth.
Use cases
- A candidate comparing a 1,500,000 KHR factory salary against a 1,700,000 KHR office salary with longer hours
- An NGO worker weighing a post with 25 days of leave against a private-sector offer with a guaranteed bonus
- A couple deciding whether a job that pays more is worth two hours of commuting every day
- A finance graduate comparing a trainee offer in Phnom Penh with a provincial post that includes housing
- An employee checking whether a promotion that adds 200,000 KHR but removes an allowance is really a raise
- A returning expatriate comparing a USD offer with a riel offer at the rate they expect to convert at
- An HR manager modelling two offer structures side by side before presenting them to a candidate
Frequently asked questions
Does the tool tell me which offer is better?
No. It shows the differences and never labels a winner, because the decision depends on things a calculator cannot know: how secure each employer is, whether the estimated bonus has ever been paid, what the commute does to your family, and what you think the benefits are worth. The page deliberately keeps guaranteed cash, estimated cash and your own valuation in separate lines so you can weigh them yourself.
How is net cash per working hour calculated?
Annual net after recurring work costs divided by annual working hours. Annual working hours are (52 − floor(annual leave days ÷ 7)) × hours per week, so 18 leave days at 40 hours a week gives 50 × 40 = 2,000 hours. The leave days are converted to whole weeks, which means a few leftover days do not change the denominator — 18 and 20 leave days both remove two weeks.
Why do the workdays-per-week field and the bonus not change my result?
Workdays per week is collected on the form but does not enter any formula — the denominator uses weeks and hours only, so changing it leaves every figure unchanged. Guaranteed and estimated bonuses do change annual net cash, but the estimated bonus is never treated as certain. If you want a conservative comparison, set the estimated bonus to zero and look at the guaranteed column.
Which exchange rate should I enter for a USD offer?
The rate you actually expect to convert at, not the rate that makes an offer look better. The National Bank of Cambodia publishes a daily reference rate that the exchange rates page mirrors; money changers and banks in Phnom Penh usually trade within a narrow band around it. The tool applies your rate to every USD amount, so one unrealistic rate distorts the whole comparison.
Are the tax and NSSF figures in this comparison accurate?
They come from the same core as the payroll calculator: Sub-Decree №48 brackets and the NSSF wage bands, which give the published 31,200 KHR employer healthcare and 24,000 KHR employee pension maximums at the ceiling. One limit carries over: TOS is computed on salary alone, so a large allowance that is really taxable salary will be under-taxed here.
Is my salary information stored or sent anywhere?
No. Every offer, bonus, allowance and rate stays in the browser and is never submitted to a server or written to storage. The site’s event log records only the action names — compare, load sample, reset — and never a salary, an employer label, a benefit value, hours or tax details. Closing the tab discards everything, so use the share link if you want to keep a scenario.
What does the annual benefits value line actually do?
It holds your own valuation of things that are not cash: a company car, a phone allowance paid directly to a provider, subsidised meals, training, or the option to work from home. It is shown so you can see the number beside the cash figures, but it is never added to net cash, because a benefit is only worth what you would pay for it yourself and it cannot pay rent.
Does it model the 13th-month wage or seniority pay?
No. The 13th-month wage, seniority indemnity, severance, pension accrual and any long-service payment are outside the model. If an offer includes them, add the 13th month to the guaranteed bonus field, which is the closest available approximation, and treat seniority pay as a separate note — it depends on length of service and is paid on a different schedule.
Data and accuracy
No external data is fetched and no exchange rate is built in: every USD conversion uses the rate you enter. Tax on Salary comes from `lib/finance/tos.ts` (Sub-Decree №48 OrNKr.BK of 11 March 2024, Article 3, and GDT Prakas №575 MEF.PK.GDT of 19 September 2024) and NSSF from `lib/finance/nssf.ts` (Prakas №449 of 10 November 2017 for healthcare and Sub-Decree №32 of 4 March 2021 for pension), both last reviewed 2026-08-26. The working-hour rule is the tool’s own: (52 − floor(leave days ÷ 7)) × hours per week. The instruments are published on the GDT and NSSF indexes linked below; this page was checked against them on 21 October 2026.
Sources
- GDT — Sub-Decree index (Sub-Decree №48 OrNKr.BK, 11 March 2024, Article 3: monthly TOS brackets and dependent reduction) — General Department of Taxation, Ministry of Economy and Finance
- GDT — Prakas index (Prakas №575 MEF.PK.GDT, 19 September 2024) — General Department of Taxation, Ministry of Economy and Finance
- NSSF — Prakas index (Prakas №449, 10 November 2017, effective 1 January 2018: healthcare contribution) — National Social Security Fund (NSSF)
- Sub-Decree №32 (4 March 2021) — NSSF pension scheme — National Social Security Fund (NSSF)
Content last reviewed 21 October 2026