تخطي للذهاب إلى المحتوى
Hashem.sa
  • الرئيسية
  • Services
  • Odoo Notes
  • About
  • تواصل معنا
  • 0
  • 0
  • ebraheem@brioche.me
  • الْعَرَبيّة English (US)
  • تسجيل الدخول
  • تواصل معنا
Hashem.sa
  • 0
  • 0
    • الرئيسية
    • Services
    • Odoo Notes
    • About
    • تواصل معنا
  • ebraheem@brioche.me
  • الْعَرَبيّة English (US)
  • تسجيل الدخول
  • تواصل معنا

How to Generate a Saudi WPS File from Odoo

Every bank wants the wage file slightly differently. That is by design.
  • كافة المدونات
  • Odoo Notes
  • How to Generate a Saudi WPS File from Odoo
  • 18 أغسطس 2026 بواسطة
    How to Generate a Saudi WPS File from Odoo
    Ebraheem Hashem

    You have run payroll. Now the bank wants the wage file, and the file it wants is not quite the file the ministry specification describes, and definitely not the one the other bank wanted last year. So somebody rebuilds it in Excel every month — retyping IBANs, splitting basic from housing, and hoping the control total matches.

    The reason there is no single correct WPS file is that the specification itself does not require one. The HRSD wage-file specification says establishments prepare their file based on the agreement between the bank and the establishment, with the minimum WPS fields present, and explicitly places no restriction on the filename format. That is why a template engine beats a hard-coded exporter — and it is what KSA WPS / Mudad Payroll Export is built around: the WPS salary split on the employee record, and a per-bank file template you can shape to match whatever your bank actually accepts.

    Employee recordbasic + housing+ other − deductionsIBAN, ID, companyBank templatedelimiter, encoding,column orderHRSD standard .txtLabelled CSV, UTF-8 BOMSame data, any layout your bank agreed — clone a preset and reorder the columns.
    The template engine is the product: one set of employee data, rendered into whatever layout your bank accepts.

    What WPS requires, factually

    The Wage Protection System is mandated by the Ministry of Human Resources and Social Development (MHRSD/HRSD), and establishments submit their employees' wage files through the Mudad platform. HRSD's own service page lists Mudad Business as the channel, the service as free, processing as immediate, and states that the uploaded file is processed against social-insurance data with the compliance rate updated instantly. The programme rolled out in phases from the largest establishments down; the final phase, covering establishments with 1 to 5 employees, was applied in 2020. In practice, essentially every private-sector establishment is in scope.

    The published HRSD file specification defines what the file has to carry. The header identifies the establishment: the bank's SARIE code (DEST-ID), the establishment ID (ESTB-ID), the establishment IBAN (BANK-ACC), currency (SAR), value date, the total amount, an optional debit date, a file reference and the MoL establishment ID. Each employee row carries the net amount (32B-AMT), the employee IBAN (59-ACC), name (59-NAME), their bank code (57-BANK), a payment description (70-DET), the identity number (MOL-ID), and the four salary components that give the system its purpose: MOL-BAS basic, MOL-HAL housing, MOL-OEA other earnings, MOL-DED deductions — with net = basic + housing + other − deductions.

    One honest caveat. The published specification document is old — its bank table still lists institutions that have since merged — and the operative template your bank uses today may differ from it in detail. Treat it as the reference field set, confirm the exact layout with your bank, and check current obligations and deadlines on hrsd.gov.sa rather than on any blog, including this one. This post is not legal or compliance advice.

    Why the obvious workarounds fail

    Excel, every month. It works and it is what most establishments do. It is also manual retyping of IBANs and salary splits into a file that moves money, with no validation that the control total agrees, and it takes as long the twelfth time as the first.

    Odoo's own Saudi WPS export. Odoo 19 does ship a Saudi WPS format in the Saudi payroll localisation — and if you are already on Enterprise with the Payroll app, contracts, work entries and payslips fully configured, use it. The catch is the dependency chain: it needs hr_payroll, which is Enterprise-only, plus its own supporting modules. A great many Saudi companies run Odoo for sales, inventory and accounting, keep salaries elsewhere, and simply need the file. For them the native route means adopting a payroll implementation to produce a text file. It also produces the format it produces, with no per-bank configuration.

    A full Arabic HR suite. There is one on the store at roughly $2,500 covering nine modules, with WPS as a single bullet — and, as marketed, a fixed Excel export rather than configurable per-bank templates. If you want the suite, buy the suite. It is a large purchase to solve a file-format problem.

    A hard-coded exporter for your bank. Fine until you change bank, add a second establishment, or the bank revises its layout. Then it is a developer ticket rather than a settings change.

    What the module does

    It adds the WPS salary split to the employee. A Payroll/WPS page on the employee record holds four amounts — basic salary, housing allowance, other earnings and deductions — with net computed from them. Field labels are bilingual Arabic and English, because the people entering them are.

    It holds the establishment settings on the company. Establishment bank code, establishment ID, establishment IBAN and MoL establishment ID, filled once.

    It generates the file from a wizard. The menus are bilingual, Arabic first — HR → حماية الأجور WPS → توليد ملف WPS Generate file: choose the bank template and the value date, optionally a debit date, select the employees, and get the file. When the company's establishment bank code matches a template's bank code, that template is selected automatically.

    The per-bank template is the real product. A template controls the delimiter (tab, comma, semicolon or pipe), the decimal separator, the date format, the encoding — including UTF-8 with BOM and Windows-1256 for banks that still want it — the line endings, whether a header row is written, the end marker, the filename pattern, and the exact column order for both the header row and the employee rows. Columns can also be fixed text or deliberately blank, for the placeholder columns banks ask for and never explain.

    Two presets ship in the box. HRSD Standard — the ministry's tab-delimited .txt, the default. Simple CSV (labelled) — a comma-separated file with a column-title header row and a UTF-8 BOM, for the banks and portals that work from spreadsheets. To support a new bank, duplicate the closest preset, set its bank code, and adjust the columns. No code, no developer.

    The arithmetic is computed, never re-keyed. Net is derived on every row as basic plus housing plus other minus deductions, and the header control total is the sum of those nets, both calculated at generation time. That is the point: the two figures a bank rejects files over cannot drift apart, because neither is typed by a human. The wizard does refuse to produce a file when the company's establishment settings are incomplete, when an employee has no IBAN or no identity number, or when no eligible employee is selected.

    It depends only on hr. No payroll module, no accounting module, no localisation dependency. It works on Odoo 19 Community and Enterprise alike, and it does not touch ZATCA or the Saudi e-invoicing localisation.

    What it does not do

    It is not a payroll engine. It does not calculate salaries, prorate joiners and leavers, compute GOSI contributions, or handle end-of-service. You hold four amounts per employee — entered directly, imported, or maintained by whatever process you already run — and it formats them.

    It does not submit anything. There is no Mudad API integration, no bank connection, and no credential handling. You get a file and upload it yourself, which keeps the module out of the way of your bank's security and your own approval chain.

    It does not validate IBANs against the bank, and it cannot know whether your bank changed its layout last week. It also does not include a bank template for every Saudi bank, because the layouts are agreed bank by bank — it includes the engine to build one in a few minutes, and the two presets to start from.

    Three specifics worth knowing before you buy, because they will affect your first file. The employee bank code column (57-BANK) is emitted empty. The HRSD preset includes the column so the layout is right, but the value is not populated from the employee record — if your bank requires it, tell me and I will wire it for you under support. If an employee's WPS basic is left at zero, the module falls back to the native wage field for that row rather than writing a zero; set the four WPS amounts explicitly if you do not want that. And the currency is fixed to SAR, which is what the specification permits, regardless of the company's currency.

    Requirements: Odoo 19.0, Community or Enterprise, with the base HR app. Published for the 19.0 series.

    How to use it

    1. Install the module.
    2. Open HR → حماية الأجور WPS → توليد ملف WPS Generate file once and fill the company's establishment details — bank code, establishment ID, establishment IBAN, MoL establishment ID.
    3. Fill the four WPS amounts on each employee record — set basic explicitly, since a zero falls back to the native wage field — and make sure each employee has an IBAN and an identity number.
    4. If your bank does not accept either preset, go to HR → حماية الأجور WPS → قوالب البنوك Bank templates, duplicate the closest one, set its bank code in upper case, and reorder the columns to match the layout your bank gave you.
    5. Back in the generate wizard: pick the template and the value date, select the employees, generate, download, upload to the bank or Mudad.

    Where it sits against the alternatives

    The direct comparable is the UAE equivalent on the store at around $53, which also ships configurable delimiters and date formats — the same conclusion reached independently in a neighbouring market. The Arabic HR suite sits at roughly $2,500. Odoo's native Saudi export is included with Enterprise Payroll, and is the right answer if you already run it.

    At $59 this is for the establishment that runs Odoo, does not run Odoo Payroll, and needs a file its bank will accept on the first upload.

    FAQ

    Do I need Odoo Enterprise Payroll to generate a WPS file?

    Not with this module. It depends only on hr, the base HR app, so it runs on Odoo Community and on Enterprise databases without the Payroll app. Odoo's own Saudi WPS export lives in the localisation payroll module, which requires Enterprise Payroll and its dependencies.

    Why does every bank want a different WPS file?

    Because the ministry specification allows it. The HRSD wage-file specification states that establishments prepare the file based on the agreement between the bank and the establishment, with the minimum WPS fields present, and places no restriction on the filename format. In practice one bank wants tab-delimited text and another works from a spreadsheet, with different column orders and encodings.

    What exactly can I change in a bank template?

    Delimiter (tab, comma, semicolon, pipe), decimal separator, date format, encoding including UTF-8 with BOM and Windows-1256, line endings, whether a header row is written, the end marker, the filename pattern, and the exact column order for both the header row and the employee rows — with fixed text or blank columns wherever a bank needs a placeholder.

    Which salary fields does it use?

    Four amounts per employee — basic salary, housing allowance, other earnings and deductions — added to the employee record. Net is computed as basic plus housing plus other minus deductions, which matches the ministry specification, and the header control total is the sum of those nets — both calculated at generation, never typed. Two behaviours to know: if WPS basic is left at zero the module falls back to the employee's native wage field, and the employee bank code column (57-BANK) is emitted empty.

    Does it submit the file to Mudad or to the bank automatically?

    No. It produces the file. You upload it to your bank's portal or to Mudad yourself. There is no API integration and no credential handling.

    Does it calculate salaries, GOSI or end-of-service?

    No. This is an export tool, not a payroll engine. You hold the four salary components on the employee record and the module turns them into a correctly formatted file.

    Get it

    KSA WPS / Mudad Payroll Export (per-bank) — $59 USD, one-time, on the Odoo Apps Store: apps.odoo.com/apps/modules/19.0/eh_wps_ksa

    For the 19.0 series, Community or Enterprise. Licensed OPL-1. Includes 90 days of support by email at ebraheem@brioche.me — questions answered within 24 hours, and I will help you build the template for your bank. One purchase covers one Odoo major version.

    Built for a multi-company restaurant and bakery group in Saudi Arabia paying real staff through real banks on Odoo 19, then generalised for sale.

    KSA WPS / Mudad Payroll Export (per-bank)

    $59 USD — one-time, on the Odoo Apps Store

    Odoo 19.0, Community or Enterprise · Licensed OPL-1 · 90 days of support included · One purchase covers one Odoo major version.

    Get it on the Odoo Apps StoreAsk a question first

    Need this fitted to your business, not just installed?

    EHC takes on consultancy, projects and ongoing services — Odoo implementation, process and controls design, data migration, and custom development like the module above.

    What EHC doesEmail Ebraheem
    في Odoo Notes
    Odoo 19 Trial Balance: Get Debit and Credit Columns Back
    Odoo 19 collapsed the opening and closing balances into one net column.

    Have a system that is not telling you the truth?

    Let's look at it together.

    Email

    ebraheem@brioche.me

    What EHC does

    Services, consultancy and projects

    Written work

    Odoo Notes

    EHC · hashem.sa
    • الرئيسية
    • •
    • Services
    • •
    • Odoo Notes
    • •
    • About
    • •
    • Contact
    • •
    • Privacy Policy
    Copyright © EHC · Ibrahim Mahmoud Hashim Trading One Person Company · Unified no. 7037243677
    الْعَرَبيّة | English (US)
    مشغل بواسطة أودو - رقم واحد التجارة الإلكترونية مفتوحة المصدر