Skip to main content
iVentureTeam

Odoo 20 Payroll Release Notes

All 15 Payroll changes from the official Odoo 20 release notes, explained in plain words with a screenshot from a live Odoo 20 database, plus where to find each one and what it means for your upgrade.

Planning the move? See our Odoo upgrade services, the Odoo 20 upgrade guide or get a number from the migration cost calculator.

New feature 4Enhancement 9Refactoring 1Removal 1In Community 4Enterprise only 11
Type
Edition

Change 1 of 15

Chatter on pay runs

New featureEnterprise only

The chatter is now enabled on pay runs to allow more interaction.

Official Odoo 20 release note

In plain words

Pay runs now have their own chatter. From the Pay Runs list you can open a side panel to post notes, send messages, plan activities and see the history of a pay run (creation, status changes).

Payroll > Payslips > Pay RunsThe chatter panel of the Sep 2026 pay run, with a logged note and the status change history.

Where to find it

  1. Payroll > Payslips > Pay Runs.
  2. Hover a pay run card and click its chat icon next to the employee count.

For users

Click the chat icon next to a pay run to open its chatter on the right side of the Pay Runs screen.

For developers

A PayRunChatterService plugin keeps the selected hr.payslip.run and the panel visibility; the chatter is rendered aside with threadModel hr.payslip.run.

Upgrading from Odoo 19

No data migration. Custom pay run views that replace the kanban js_class lose the chatter panel.

Change 2 of 15

Contract date modification

EnhancementEnterprise only

It is now impossible to modify the contract dates of an employee if it impacts existing payslips. Instead, revert those payslips in order to modify the contract dates.

Official Odoo 20 release note

In plain words

If you change a contract start or end date so that validated or paid payslips fall outside the contract, Odoo now blocks the save. The warning offers a button to open the payslips that must be refunded (corrected) first.

Employees > Employee > Payroll tabSetting the contract end date to Aug 15 is refused because the August payslip is already validated.

Where to find it

  1. Employees > open an employee with validated payslips > Payroll tab.
  2. Set a contract end date before the end of an already validated payslip and save (choose Correct terms).

For users

Payroll officers get a clear warning with a View Payslips to Refund button instead of silently breaking existing payslips.

For developers

New constraint hr.version._check_contract_dates (on contract_date_start, contract_date_end, departure_id) raises a RedirectWarning when validated or paid, non-refunded payslips fall outside the new dates.

Upgrading from Odoo 19

Scripts or imports that rewrite contract dates of employees with validated payslips will now fail; refund the payslips first.

Change 3 of 15

Dashboard

EnhancementEnterprise only

The Payroll dashboard has been revamped to focus on warnings for setup and day-to-day control of pay.

Official Odoo 20 release note

In plain words

The Payroll dashboard is now a monthly timeline of warning cards. Setup tasks (pay schedule, payslip layout, benefits) and control warnings (missing bank accounts, employees without contract, attendance issues) each come with a button that opens the records to fix.

Payroll > DashboardThe revamped dashboard: setup cards and control warnings on a monthly timeline, each with its action button.

Where to find it

  1. Payroll > Dashboard.

For users

Open Payroll to see what needs attention this month, sorted on a timeline, and click the button on each card to fix it.

For developers

Warnings are records of hr.payroll.warning (renamed from hr.payroll.dashboard.warning) with a domain on the checked model; localizations add their own warnings as data.

Upgrading from Odoo 19

Custom dashboard warnings defined on hr.payroll.dashboard.warning must be moved to hr.payroll.warning.

Change 4 of 15

Driver assignment

EnhancementEnterprise only

Partly confirmed in the Odoo 20 source code. Parts of this note could not be traced.

When selecting or changing a car for an employee, the vehicle's assigned driver is updated automatically in the Fleet app.

Official Odoo 20 release note

In plain words

In the Belgian salary package flow, the car picked in an offer is set on the vehicle: the employee becomes future driver when they sign, and driver once every party has signed. The vehicle's driver in Fleet therefore follows the car chosen for the employee.

Where to find it

  1. Requires the Belgian payroll localization (l10n_be_hr_contract_salary).
  2. Send a salary package offer with a company car and have it signed; check the car's driver in Fleet.

For users

Belgian payroll users no longer need to update the Fleet driver by hand after a car is chosen in an offer.

For developers

SignContract._update_version_on_signature (l10n_be_hr_contract_salary) writes future_driver_id then driver_id on version.car_id and bike_id.

Upgrading from Odoo 19

Only relevant for databases using the Belgian payroll localization.

  • Text only: the code is in the Belgian localization (l10n_be_hr_contract_salary), which is not installed in this US demo database. In the source, the automatic update is limited to country code BE.

Change 5 of 15

Employee type per company or branch

EnhancementCommunity + Enterprise

Restrict an employee type to a specific company or branch.

Official Odoo 20 release note

In plain words

Employee types (Employee, Student, Intern and so on) are now records with an optional Company. Set a company or branch to make the type available only there; leave it empty to share it with all companies.

Payroll > Configuration > Contracts > Employee TypesA demo "Field Technician" employee type restricted to the Chicago company through the Company field.

Where to find it

  1. Payroll > Configuration > Contracts > Employee Types.
  2. Open a type and set its Company.

For users

Multi-company groups can keep a branch-specific employee type (for example a local contract type) out of the other companies.

For developers

hr.employee.type (company_id, country_id, code, sequence) replaces the old employee_type selection; hr_payroll adds payroll_closing_date and payroll_auto_post on it.

Upgrading from Odoo 19

Code reading the old employee_type selection must use employee_type_id (a many2one to hr.employee.type).

Change 6 of 15

Net to gross simulation

New featureEnterprise only

Perform a salary simulation based on a net amount.

Official Odoo 20 release note

In plain words

The Gross-Net Salary Calculator accepts a salary expressed as Net Per Month. Odoo then finds the gross wage (and employer cost) that gives this net pay with the chosen pay structure and working schedule.

Payroll > Employees > Salary CalculatorA salary entered as Net Per Month, with the gross, benefits and company cost computed on the right.

Where to find it

  1. Payroll > Employees > Salary Calculator.
  2. Set the salary type to Net Per Month and enter an amount.

For users

Answer "how much gross for this net?" questions during hiring or negotiation without trial and error.

For developers

hr.contract.salary.offer.budget_type gets a monthly_net option; the offer computes gross from the net through a simulated payslip (_generate_salary_simulation_payslip).

Upgrading from Odoo 19

The former hr_contract_salary_payroll logic now lives in hr_contract_salary.

Change 7 of 15

Pay run workflow

EnhancementEnterprise only

The "Pay Runs" workflow has been enhanced to provide a clear, step-by-step process for creating and validating pay runs.

Official Odoo 20 release note

In plain words

Creating a pay run is now guided. New opens a dialog to pick employee types, pay structure and period; Continue lets you select employees, then a Before You Start check lists pending issues before payslips are generated. Each pay run card then shows its status and only the next useful action (Validate, Pay, Mark as Paid).

Payroll > Payslips > Pay Runs > NewFirst step of the guided flow: the New Pay Run dialog with employee types, pay structure and period.

Where to find it

  1. Payroll > Payslips > Pay Runs > New.
  2. Check the prefilled period and click Continue.

For users

Fewer clicks and fewer mistakes when starting a pay run: period and structure are prefilled and issues are shown before payslips are created.

For developers

hr.payslip.run._get_start_payrun_warnings feeds the PayrunStartWarningDialog; the kanban card buttons come from the payrun_menu template.

Upgrading from Odoo 19

No data migration. The intermediate status-bubble steps that existed during development were removed again before release (commit f810c80cfbf).

Change 8 of 15

Payslip sending options

New featureEnterprise only

Choose when payslips are sent to employees (on confirmation, on payment, or manually).

Official Odoo 20 release note

In plain words

A new setting decides when payslip PDFs are generated and emailed to employees: When Confirmed, When Paid, or Manually. With Manually, the pay run shows a Send by email button instead.

Payroll > Configuration > SettingsThe Send payslips to employees setting (When Confirmed, When Paid, Manually).

Where to find it

  1. Payroll > Configuration > Settings.
  2. Look at Send payslips to employees.

For users

Companies that pay later than they validate can wait until payment before employees receive their payslips.

For developers

res.company.payslip_generate_and_send_trigger (on_confirmed, on_paid, never); action_validate passes payslip_generate_pdf in context based on it.

Upgrading from Odoo 19

Default is When Confirmed, which matches the previous behavior.

Change 9 of 15

Payslip UX

EnhancementEnterprise only

The "Salary Computation" tab of payslips has been improved to show only relevant information.

Official Odoo 20 release note

In plain words

The Salary Computation tab now lists the lines that matter, greys out obvious values (such as totals of empty categories) and hides empty columns. A Show all toggle brings back every line when you need the full detail.

Payroll > Payslips > Payslip > Salary ComputationThe Salary Computation tab with only relevant lines, a muted category total and the Show all toggle.

Where to find it

  1. Payroll > Payslips > open a payslip > Salary Computation.

For users

Payslips are easier to read and check.

For developers

Line display depends on salary rule display settings (appears on payslip, extra info) and a muted style for obvious values.

Upgrading from Odoo 19

Rules that should always be visible may need their display options reviewed.

Change 10 of 15

Salary indexation

EnhancementEnterprise only

Increase an employee's salary by a percentage and/or a fixed amount.

Official Odoo 20 release note

In plain words

The Salary Increase action (on one or several employees) asks for a date, an increase rate, whether it applies to the full wage or a capped wage, and an extra fixed amount. Odoo creates the new contract versions and offers to correct payslips already affected.

Employees > Actions > Salary IncreaseThe Salary Increase dialog with a 3 % rate and a fixed extra amount of 150.

Where to find it

  1. Employees > select employees > Actions > Salary Increase.

For users

Yearly indexation or raises for many employees in one step, including a fixed bonus amount.

For developers

Transient model hr.payroll.salary.increase (increase_rate, applied_on full or capped, capped_wage, extra_amount) launched by the server action action_increase_employee_salary_form.

Upgrading from Odoo 19

No migration.

Change 11 of 15

Salary rules

EnhancementEnterprise only

Salary rules can now belong to multiple categories and be used in multiple structures.

Official Odoo 20 release note

In plain words

A salary rule now has a Categories field and a Pay Structures field, both accepting several values. One rule can count in several totals and be shared by several structures instead of being duplicated.

Payroll > Configuration > Salary > RulesA demo rule with two categories (Allowance, Taxable Salary) and two pay structures (Regular Pay, Worker Pay).

Where to find it

  1. Payroll > Configuration > Salary > Rules.
  2. Open or create a rule.

For users

Less duplication when the same rule applies to several pay structures.

For developers

hr.salary.rule.category_id became category_ids (many2many) and struct_id became struct_ids (many2many); the code must be unique among rules sharing a structure.

Upgrading from Odoo 19

Custom rules and code using category_id or struct_id must switch to category_ids and struct_ids.

Change 12 of 15

Test print pay runs

New featureEnterprise only

Test a pay run in one click with printed payslips.

Official Odoo 20 release note

In plain words

A Test Print action on a pay run in the Ready state generates draft PDF payslips for all its employees and attaches them to each payslip's chatter, so you can check them before validating.

Payroll > Payslips > Pay RunsThe Test Print action in the menu of a Ready pay run.

Where to find it

  1. Payroll > Payslips > Pay Runs.
  2. Open the menu of a Ready pay run and choose Test Print.

For users

Review real payslip PDFs before validation.

For developers

hr.payslip.run.action_generate_payslips_pdf calls action_generate_pdf with context is_test_print.

Upgrading from Odoo 19

No migration.

Change 13 of 15

Time entry exports

RefactoringCommunity + Enterprise

All time entry exports now follow a standard format.

Official Odoo 20 release note

In plain words

The separate export tools of each payroll provider were replaced by one Export Time Entries action on employees. It exports a month of time entries for the selected employees in one common file format.

Employees > Actions > Export Time EntriesThe Export Time Entries dialog: pick the month and year, then Export.

Where to find it

  1. Employees > select employees > Actions > Export Time Entries.

For users

One way to hand time data to an external payroll provider.

For developers

Wizard hr.export.work.entries (month, year, eligible employees) downloads through /hr_work_entry/download; provider specific export models (Acerta, UCM, SD Worx, ADP and others) and hr_work_entry_export_mixin were removed.

Upgrading from Odoo 19

Integrations built on the old provider export models must be adapted to the unified file.

Change 14 of 15

Work entries removal

RemovalCommunity + Enterprise

Work entries and the Planning-Payroll integration have been removed. Work entry types and time off types have been merged.

Official Odoo 20 release note

In plain words

The hr.work.entry records and the Planning-Payroll bridge are gone; payslips read time off and working schedules directly. Work entry types and time off types are now one Time Type, with a Time Off tab (approval, allocation) and a Payroll tab on the same form.

Payroll > Configuration > Time Management > Time TypesOne Time Type now holds both the Time Off settings and the Payroll settings (the two tabs).

Where to find it

  1. Payroll > Configuration > Time Management > Time Types.
  2. Open a type: Time Off and Payroll tabs on one form.

For users

No more work entry generation and conflict fixing before payroll; time off types are configured in one place.

For developers

hr.work.entry and hr.leave.type are removed; hr.work.entry.type carries the former time off type fields (leave_validation_type, requires_allocation, request_unit). Modules hr_work_entry_holidays, hr_payroll_planning, hr_work_entry_planning were removed.

Upgrading from Odoo 19

Major: custom code on hr.work.entry, hr.leave.type or the Planning-Payroll bridge must be rewritten.

Change 15 of 15

Working schedules

EnhancementCommunity

Use the updated working schedules to define a time per day without specifying start and end times.

Official Odoo 20 release note

In plain words

Working schedule lines can now hold only a number of hours per day. Leave the start and end times empty and enter the hours (for example 7h30 on Monday to Friday).

Payroll > Configuration > Time Management > Working SchedulesA demo schedule where each day only has a number of hours (7h 30m), with no start or end time.

Where to find it

  1. Payroll > Configuration > Time Management > Working Schedules.
  2. Open or create a schedule and enter hours per day.

For users

Part-time and flexible schedules can be described by hours per day without inventing fake start and end times.

For developers

resource.calendar.attendance gets duration_hours and a stored duration_based flag (true when hour_from and hour_to are empty); mixing duration and time based lines on the same day is refused.

Upgrading from Odoo 19

Code that assumes every attendance has hour_from and hour_to must handle duration_based lines.

See all 585 Odoo 20 changes across 52 apps

Odoo 20 Payroll: common questions

What is new in Odoo 20 Payroll?

The official Odoo 20 release notes list 15 Payroll changes (4 new features, 9 enhancements, 1 refactoring, 1 removal). They include Chatter on pay runs, Contract date modification, Dashboard, Driver assignment and more.

Are the Odoo 20 Payroll changes available in Community edition?

4 of the 15 changes are in Odoo 20 Community (and Enterprise). 11 are Enterprise only. Each change on this page is labeled with its edition.

Do Odoo 20 Payroll changes affect my customizations when upgrading from Odoo 19?

12 of the 15 changes have something to check when upgrading from Odoo 19, for example Chatter on pay runs, Contract date modification, Dashboard. Each change on this page has an "Upgrading from Odoo 19" note. Test custom modules on a copy of your database before moving production.

How do I upgrade Payroll to Odoo 20?

Restore a copy of your database, run the Odoo 20 upgrade on the copy, fix any custom modules that extend Payroll, then test your main Payroll flows with real users before switching production. iVentureTeam runs Odoo upgrades end to end, including custom module migration and user testing.

Odoo services for this

More Odoo 20 release notes

Planning your Odoo 20 move

Want these Payroll changes in your database?

We upgrade Odoo databases with their customizations and data intact, and test every custom module against the new version before go-live.