Short answer: Saudi payroll is not one obligation but three, and they are enforced by three different bodies. You have to contribute correctly to GOSI, you have to pay salaries through the wage protection system so that what you transfer matches the contract registered in Qiwa, and you have to accrue end of service properly so it is not a surprise the day someone leaves. Odoo can carry all three, but only the first and third come from configuration alone. This page covers what the rules say in 2026 and where each one lands inside the system.
Obligation one: GOSI
Since the Social Insurance Law took effect, Saudi Arabia runs two parallel contribution systems at the same time, and which one applies depends on when the employee first registered with GOSI. Getting an employee into the wrong bucket is the most common payroll configuration error we see.
The rates
| Category | Employer | Employee | Combined |
|---|---|---|---|
| Saudi national, existing system (first registered before 3 July 2024) | 11.75 percent | 9.75 percent | 21.5 percent |
| Saudi national, new system, from July 2026 | 12.75 percent | 10.75 percent | 23.5 percent |
| Non Saudi employee | 2 percent | None | 2 percent |
The existing system stays fixed. The new system rises by half a percentage point on each side every July, reaching 11 percent per side on the pension branch by 2028. If you are budgeting headcount over three years, build that escalation in now rather than discovering it each summer.
The components matter as much as the total. The employer figure is pension plus 2 percent occupational hazards plus the unemployment branch. The 2 percent occupational hazards element is the only branch that applies to expatriate employees, and the employee side for them is nil.
The contribution base, which is where the errors are
This is the single point worth checking in your system today:
- The base is basic salary plus housing allowance only. Not gross pay. Not every allowance.
- The base is capped at SAR 45,000 per month.
- Occupational hazards and the unemployment branch are calculated separately, not folded into the pension rate.
Transport allowance, phone allowance, commission and overtime do not belong in the base. If your salary structure computes contributions on gross pay, you are overpaying every month and your reconciliation against the GOSI portal will never balance.
How this maps onto Odoo
In Odoo terms this is a salary structure problem, not a module problem. You need:
- Separate salary rules for basic and housing, with a computed contribution base that sums only those two and applies the SAR 45,000 ceiling
- A field on the employee marking which GOSI system they fall under, driving the rate selection
- Separate rules for pension, occupational hazards and the unemployment branch rather than one blended percentage, so your reports break down the way the portal does
- Employer contributions posted as company cost, not as an employee deduction
Configured that way, the monthly contribution summary reconciles against the portal in minutes instead of being rebuilt by hand in a spreadsheet.
Obligation two: wage protection
The wage protection system is administered by the Ministry of Human Resources and Social Development, with Mudad as the platform most establishments use in practice to build the wage file, send it to the bank and sync with Qiwa.
Two things about scope surprise people:
- It applies to private sector establishments with one employee or more. If you have just registered a company and hired your first person, you are in scope from day one.
- Compliance is scored, and the score feeds into your establishment classification. That in turn touches your ability to sponsor visas and complete other transactions. This is not a filing you can quietly skip for a month.
What the file has to contain
The wage file follows the standard Saudi Information File layout used by the banks, containing for each employee the identity or residency number, contract reference, basic salary, allowances, deductions and the net amount actually transferred.
The rule that catches most establishments: the salary in the wage file has to match the contract registered in Qiwa. A meaningful variance between the two is flagged automatically, and unexplained variances are recorded as violations. If a deduction, unpaid leave or a mid month joiner causes a difference, document the reason in the system rather than leaving it to be interpreted.
Where Odoo fits, honestly
Odoo computes the payslips and posts the accounting entries. It does not, out of the box, produce a bank ready wage file for your specific bank. What you need is an export that maps your payslip results onto the required file layout, which is either a localisation module or a small piece of implementation work, and it depends on which bank you use.
Be sceptical of any vendor who lists wage protection as a tick on a feature grid without asking which bank you are with. That question always comes first.
Obligation three: end of service
End of service is an accrued liability from the first month of employment. Treating it as a cost that appears on the day someone resigns is how a small company ends up with a cash problem it could see coming for years.
The standard calculation under the Labour Law works on the final wage, with two different pictures depending on how the relationship ends:
- Employer ends the contract or the term expires: half a month per year for the first five years, and a full month per year for each year beyond five, with part years counted proportionally.
- Employee resigns: the entitlement is scaled by length of service, with no entitlement below two years, a third of the award between two and five years, two thirds between five and ten years, and the full award at ten years or more.
There are specific exceptions in the law, including for female employees in defined circumstances and for termination for cause. Where a case is not routine, get it checked rather than relying on a formula.
In Odoo this belongs in the monthly close as a provision, not in the payroll run. A recurring entry that accrues the movement in the liability each month keeps the balance sheet honest and makes the eventual payment a non event.
A practical checklist
- Split every employee into existing system, new system or non Saudi, and confirm the rate table applied to each.
- Open one payslip and confirm the contribution base is basic plus housing only, and that the SAR 45,000 ceiling is applied where relevant.
- Confirm occupational hazards and the unemployment branch are separate rules, not blended into the pension percentage.
- Reconcile the Qiwa contract salary against the payroll salary for every employee before you build the wage file, not after it is rejected.
- Fix a monthly date for the wage file that sits comfortably ahead of the payment date.
- Check your compliance percentage on a schedule rather than waiting for a violation notice.
- Post an end of service provision every month and reconcile it to a per employee schedule at year end.
Frequently asked questions
Do expatriate employees have anything deducted for GOSI?
No. For non Saudi employees the employer pays 2 percent for occupational hazards on the contribution base, and nothing is deducted from the employee.
Which GOSI rate applies to a Saudi employee who worked before 2024, left, and rejoined?
Prior contribution history is what determines the system, not the current hire date. Where the history is unclear, verify it against the GOSI record for that individual rather than assuming.
Is the wage protection system optional for very small establishments?
No. The obligation applies from one employee upward, with no size exemption for private sector commercial establishments.
Can Odoo generate the wage file directly?
Odoo produces the payroll data. Turning it into a bank ready file in the required layout is an implementation step that depends on your bank. Plan for it as part of the rollout rather than assuming it is included.
Does an accounting platform handle all of this?
Some accounting platforms include a payroll module that covers the common cases well. The gap tends to appear with mixed nationality workforces on two GOSI systems, non standard allowance structures and month by month end of service accrual. Our comparison of Odoo and Qoyod and our comparison of Odoo and Wafeq look at where that line usually falls.
Getting it configured
If your payroll is currently a spreadsheet feeding a bank portal, moving it into a properly configured system pays for itself in the first audit. We do this as part of a hosted Odoo rollout. The small business package covers the starting point, and the ZATCA requirements guide covers the other half of Saudi compliance.
This content is for general information and is not legal, tax or payroll advice. Rates, thresholds and platform requirements change, and phased increases are scheduled through 2028. Verify current figures against the General Organization for Social Insurance and the Ministry of Human Resources and Social Development before configuring payroll. Where an Arabic official text differs from an English summary, the Arabic text governs.