GuideOdoo 20 series, part 11 of 25September 21, 2026By Olivia, Senior Odoo Architect

Odoo 20 Payroll:
salary rules as inputs, a review loop before payday, and new country packages

Payroll, reworked: Odoo 20 screenshot behind the article title
INTRODUCTION

Fewer places to configure the same thing, fewer surprises on payday

Payroll is one of the most reworked apps in Odoo 20, and most of the change is in the foundations. The separate list of payslip input types is gone: a salary rule can now be an input itself. The contract is called the Employee Record and carries a review state that can block a payslip until someone looks at it. Dashboard warnings are configurable records. If you run payroll, this changes how you set up allowances and how you check a pay run before validating it.

This post covers two sections of our Odoo 20 series: the payroll rework and the new country packages. We clicked through the rework on a United States company and the Belgian declarations on a Belgian company, on the pre-release build. The Gulf packages and the Saudi GOSI connector are described from the guide and the 20.0 source.

Observed on the Odoo 20.0 Enterprise pre-release build of September 23, 2026. Names, menus and availability can change before general availability; we will update this page when they do.

One list of rules, and a rule can be its own input

In Odoo 19 a payroll manager maintained two lists: input types, and the salary rules that read them. An input could exist with no rule consuming it, and nobody noticed until a payslip came out short. Odoo 20 folds the two together under Payroll > Configuration > Salary > Rules, a page titled Salary Rules that holds every rule of every pay structure.

Salary Rules list with name, code, pay structures and categories
Payroll > Configuration > Salary > Rules: one list for rules and inputs

To make a rule an input, set Amount Type to Input Value (with Based on: Input Value in the condition block) and tick Inputtable on Employee, Payslip or both. Employee stores the value once on the employee record, for a recurring allowance. Payslip means you type it on each payslip, for a one-off bonus or deduction. On screen, "flagging a rule as an input" is these two checkboxes.

Remote Work Allowance rule form with Employee and Payslip checkboxes ticked
A salary rule that is itself an input: "Inputtable on Employee / Payslip"

An Input Options tab holds the payslip section, a Selected by Default toggle, a default value and a suffix such as "USD / month". Sections live under Configuration > Salary > Salary Input Sections, a menu that opens a page titled Salary Rule Sections. On the demo we added a Remote Work Allowance and a Mobile Phone Allowance to the United States: Regular Pay structure this way.

Input Options tab showing Section Inputs, Selected by Default, Default Value 75, Input Suffix USD / month
Input Options tab: section, Selected by Default, default value, suffix

The contract is now the Employee Record, with payroll properties

What Odoo 19 introduced as the contract "Version" is called the Employee Record throughout Odoo 20 Payroll. Each record carries the wage, the hourly wage (now with four decimals), the structure type, the employee type, departure information and a block of payroll properties. Records can be archived with their payslips.

Inputs block with Remote Work Allowance 75 and Mobile Phone Allowance 30 USD / month
Payroll properties filled on the employee record

One correction to the guide. It describes Many2one and selection properties with a dedicated model for the values. On the pre-release build, the properties block is generated from the rules that are inputtable on Employee, and every property is a number with a suffix: our two allowances show as 75 and 30 USD / month. Nothing on screen defines a joint committee or a car category as a dropdown. Treat that part of the guide as roadmap.

Second correction: the guide lists Employees, Employee Records and Payslip Adjustments under Payroll > Employees. In normal mode only Employees is there; the other two need developer mode. Payroll officers work from the employee form's Payroll tab.

Jessica Johnson employee record with a To Review badge
Employee record carrying the "To Review" state

Review states, configurable warnings and blocked payslips

This is the part a payroll officer feels first. Every employee has a review state, Reviewed, To Review or Anomaly, shown as a badge on the form. The guide says any tracked change flips it to To Review. On this build that happens only when the editor is not a Payroll Officer; an edit by the payroll team leaves the state alone. When HR changes a wage, payroll gets a flag.

Payroll Warnings list with colour class and active toggles
Configuration > Dashboard > Warnings: configurable warning cards

Dashboard warnings are records under Payroll > Configuration > Dashboard > Warnings: 39 on the demo, each with a description, a colour class (Primary, Info, Warning, Danger) and an active toggle. Employees To Review, Employees With Anomalies and Payslips With Zero or Negative Net are all there.

Dashboard timeline with cards like 2 Employees To Review, 1 Employees With Anomalies
Payroll dashboard with warning cards and counts

The guide describes a Review Employees banner on the pay run. We did not find one. Instead, the payslip of an employee in To Review shows the status Blocked with the warning "Review employee to validate payslip" and a Review link. A Review Employees button does exist, in the warning dialog shown when you start a pay run, and on the dashboard card as Review Records. Pay run states are Draft, Ready, Done and Paid, plus Cancelled.

Sep 2026 (US) pay run, Jessica Johnson payslip Blocked with warning "Review employee to validate payslip -> Review"
Pay run payslips: an employee to review blocks validation

Pro tip

Before your first Odoo 20 pay run, agree on who marks employees as Reviewed. If the same officer edits records and validates payslips, the state rarely flips: the safety net only works when HR and payroll are different groups.

First Payrun Date and Benefits inside Payroll

Under Payroll > Configuration > Settings, a First Payrun Date tells Odoo not to generate anything for periods before go-live, which removes the "missing payrun" warnings for months you paid in the old system. We set it to Jan 1, 2025 on the San Francisco company.

Payroll settings with First Payrun Date set to Jan 1, 2025
Settings: First Payrun Date

Benefits configuration has moved out of the Salary Configurator into Payroll > Configuration > Salary > Benefits, grouped by benefit type, so HR and payroll share one definition. The guide also says an offer can now be a contract amendment for an existing employee, with a Sign PDF template picked from the offer form; that module was not installed on our demo, so we saw the Benefits menu but not the offer form.

Benefits list grouped by benefit type (Belgian company active)
Configuration > Salary > Benefits now lives in Payroll

Iraq, Kuwait, Oman and the Philippines, plus a Saudi GOSI connector

According to the guide and the 20.0 source, four payroll packages are new: Iraq (social insurance, end of service, overtime), Kuwait (a "Kuwait: Monthly Pay" structure with social security, end of service indemnity and tiered sick leave), Oman (monthly structure, social insurance, two overtime rulesets) and the Philippines. Each ships an accounting bridge so payslips post journal entries. To be plain: neither Canada nor the United States is among the new packages. The US package is still there, and our demo pay runs used its United States: Regular Pay structure; the guide does not mention the Canadian package.

Jessica Johnson September 2026 payslip with Basic Salary, input allowances, Gross, taxes
Computed payslip, Salary Computation tab (generic/US package)

Saudi Arabia deepens. A GOSI module connects to the General Organization for Social Insurance API, fetches contribution data and logs each update as a wage update record; it is configured with a certificate key in the payroll settings. A companion module collects late hours from Attendances and runs them through To Approve, Approve and Refuse. Salary Package Configurators are localised for the United Arab Emirates, India, Saudi Arabia and Egypt. None of this was installed on our demo, so this paragraph is from the source, not from the screen.

Belgium: declarations produced from Odoo, connectors retired

Belgium remains the most active localisation. Under Configuration > Salary > Structures, the Belgium Pay group lists Monthly Pay (BE) with 256 rules, Double Holidays, Termination Fees, 13th Month and more. Know this before you install it: the Belgian package archives its structures, rules and categories right after install; they come back once a Belgian company is configured. An empty list on a fresh database is expected.

Belgium Pay group with Monthly Pay (BE) 256 rules, Double Holidays, Termination Fees, 13th Month...
Pay Structures grouped by type: the Belgian package

The Reporting menu on a Belgian company lists Meal Vouchers, Eco-Vouchers, DMFA, DIMONA, DRS and the 273.XX, 274.XX and 281.XX Sheets, among others. The guide mentions a "281.30 declaration"; there is no menu of that name. The entry is Reporting > Belgium > 281.XX Sheets, the form is titled Create 281.XX Form, and it asks only for a Year and a Sending Type (Original or Corrections) before Compute.

Reporting dropdown listing 273.XX, 274.XX, 281.XX Sheets, DMFA, DIMONA, DRS...
Payroll > Reporting > Belgium declarations
Step 1: Three steps: the Payroll Reporting menu on a Belgian company, the empty Create 281.XX Form list with the New button highlighted, and the new form with Year 2025, Sending Type Original and the Compute buttonStep 2: Three steps: the Payroll Reporting menu on a Belgian company, the empty Create 281.XX Form list with the New button highlighted, and the new form with Year 2025, Sending Type Original and the Compute buttonStep 3: Three steps: the Payroll Reporting menu on a Belgian company, the empty Create 281.XX Form list with the New button highlighted, and the new form with Year 2025, Sending Type Original and the Compute button
Tutorial: Payroll > Reporting > Belgium > 281.XX Sheets, then New, set Year and Sending Type, then Compute

The guide also lists a correction flow for the 273S declaration, a thirteenth month for joint committee 302 and a mobility budget module bridging payroll and expenses. And a removal that matters: the connectors to SD Worx, Partena, Group S, UCM, Acerta and Prisma no longer exist as modules, according to the 20.0 source diff. Dimona was folded into the main Belgian module.

How to try it on a demo database

  1. Install Payroll with demo data on a company whose country ships salary rules (the United States package worked for us).
  2. Open Payroll > Configuration > Salary > Rules, create a rule, set Amount Type to Input Value, tick Inputtable on Employee and fill the Input Options tab.
  3. Open Payroll > Employees, pick an employee and fill the new property in the Payroll tab.
  4. As an HR user who is not a Payroll Officer, change that employee's wage; the badge switches to To Review.
  5. Open Payroll > Payslips > Pay Runs, click New, pick the structure and period, then Continue. The payslip shows Blocked with a Review link.
  6. Follow the link, mark the record Reviewed, and validate the pay run.
  7. For Belgium, switch company, open Reporting > Belgium > 281.XX Sheets, click New, set Year and Sending Type, then Compute.
Step 1: Three steps: the Payroll dashboard with its warning cards, the New Pay Run dialog with the United States: Regular Pay structure and the September period, and Jessica Johnson's employee record carrying the To Review badgeStep 2: Three steps: the Payroll dashboard with its warning cards, the New Pay Run dialog with the United States: Regular Pay structure and the September period, and Jessica Johnson's employee record carrying the To Review badgeStep 3: Three steps: the Payroll dashboard with its warning cards, the New Pay Run dialog with the United States: Regular Pay structure and the September period, and Jessica Johnson's employee record carrying the To Review badge
Tutorial: start a pay run from Payroll > Payslips > Pay Runs, then follow the review link to the employee record

What we could not verify on the pre-release build

We did not see the Kuwait, Oman, Iraq or Philippines structures and payslips, the Saudi GOSI settings, wage update log and late-attendance approvals (modules not installed, and GOSI needs a real certificate key), the Salary Package Configurator pages and the contract-amendment offer form (not installed), or a computed 281.XX PDF and a Belgian payslip (the Belgian demo company had no employees or payslips). Many2one and selection payroll properties did not exist in this build, the Review Time action needed pending time off, and the mobility budget banner needs a Belgian employee with a budget and an expense. Everything else on this page was clicked through on the 20.0 Enterprise build of 23 September 2026.

What this means for an upgrade

If you run payroll on Odoo 17, 18 or 19, expect three kinds of work. First, every payslip input type becomes a salary rule with Inputtable on set, and custom rules that read inputs by code need a check, since the hr_work_entry_* bridges and hr_payroll_holidays were merged into payroll. Second, verify your country: according to the 20.0 source diff, the France, US ADP, Italy SD Worx and Hong Kong eMPF packages are absent from the 20.0 enterprise branch, with no removal commit to explain them. Third, decide who owns the Reviewed state and set the First Payrun Date to your go-live month. We run this checklist inside our migration service; if any script pulls payslip data over XML-RPC or JSON-RPC, add the RPC migration audit, since Odoo has scheduled the removal of those endpoints for Odoo 20. The series hub lists the other changes in the same upgrade.

FAQ

Frequently asked questions

Are payslip input types gone in Odoo 20?

Yes. The separate input type list is replaced by salary rules that are themselves inputs: set Amount Type to Input Value and tick Inputtable on Employee or Payslip. Sections, defaults and suffixes live on the rule's Input Options tab, under Payroll > Configuration > Salary > Rules.

Does Odoo 20 add payroll for Canada or the United States?

No. The new packages named in the guide are Iraq, Kuwait, Oman and the Philippines, with deeper Saudi, UAE, Egypt and Belgian coverage. The United States package is still present; our demo pay runs used its Regular Pay structure. The guide does not mention changes to the Canadian package, so check it against your own setup before upgrading.

Why is a payslip Blocked in my Odoo 20 pay run?

Because the employee is in the To Review state. A tracked change made by someone who is not a Payroll Officer flips the record to To Review, and the payslip stays Blocked with a Review link until a payroll officer opens the record and marks it Reviewed. Then the pay run can be validated.

What happened to the French payroll package in Odoo 20?

According to the 20.0 source diff, l10n_fr_hr_payroll is absent from the 20.0 enterprise branch, as are US ADP, Italy SD Worx and Hong Kong eMPF. No removal commit explains it, so the packages may have moved elsewhere. Confirm with Odoo before planning a French payroll migration.

Where is the Belgian 281.30 declaration in Odoo 20?

Under Payroll > Reporting > Belgium > 281.XX Sheets on a Belgian company. Click New, choose the Year and the Sending Type (Original or Corrections), then Compute. There is no separate 281.30 menu; the same form covers the 281 family. The Belgian rules must be active, which happens once a Belgian company is configured.

Where did Benefits configuration go in Odoo 20?

It moved from the Salary Configurator into Payroll > Configuration > Salary > Benefits, grouped by benefit type. The point is one definition shared by HR offers and payroll computation, instead of two lists that drift apart. The configurator offer form still references those benefits when it builds a package.

Want your inputs and rules mapped before the first Odoo 20 pay run?

We can take your current input types, custom rules and country package, map them to Odoo 20 salary rules on a copy of your database, and run one parallel pay run so you see every Blocked payslip before payday, not after.

Book a free consultation