Guide · Payroll
Mexican payroll in Odoo 20: what it computes, how payslips are stamped and how to set it up
- Author
- Fabio Soto, Business Analyst
- Published
- Updated
- Version
- Odoo 20
In short
Yes: Odoo 20 has a native Mexican payroll localization, built from Odoo's own modules and described in its official documentation. It computes salaries with employee and employer payroll taxes, handles social security (IMSS) contributions, INFONAVIT housing and FONACOT consumer credits, the aguinaldo year-end bonus, vacation with its premium, savings funds and vouchers, and issues each payslip as a CFDI, Mexico's electronic invoice format, to be stamped. It runs on Odoo Enterprise's Payroll app and relies on the Mexican fiscal localization for stamping.
What Odoo’s Mexican payroll is
Odoo’s Mexican payroll is the localization the Payroll app uses to compute salaries, withholdings and contributions under Mexican rules. For a company arriving from abroad, two features of the Mexican system are worth knowing first: payroll contributions go to several public institutions, and every payslip is itself an electronic tax document, stamped like an invoice. The official Odoo 20 documentation sums up the localization’s scope in one sentence:
“The Mexico payroll localization covers salary computations for employees, including employee and employer payroll taxes.”
It is native: these are Odoo modules, listed in the documentation with their technical names, not third-party apps. Payroll is an Odoo Enterprise app whose code is not public, so everything below comes from the official version 20 documentation.
| Module | Technical name | What it adds |
|---|---|---|
| Mexico - Payroll | l10n_mx_hr_payroll | Fields to manage employee payroll and time off data |
| Mexico - Payroll with Accounting | l10n_mx_hr_payroll_account | Rules and parameters for local payroll calculations |
| Mexico - Payroll CFDI | l10n_mx_hr_payroll_account_edi | Signing payroll CFDI documents with the government |
| Documents - Mexican Payroll | documents_l10n_mx_hr_payroll_account_edi | CFDI XML and PDF files attached to payslip emails |
Installing the payroll CFDI module automatically installs the other two payroll modules. Mexico was already on the payroll localization list of the 18.0 documentation, has had its own page since 19.0, and the 20.0 documentation adds two things: the Documents module that sends the XML and PDF to the employee, and generating the CFDI from the pay run.
- IMSS
- Instituto Mexicano del Seguro Social, the Mexican Social Security Institute, to which the company pays social security contributions.
- INFONAVIT
- Instituto del Fondo Nacional de la Vivienda para los Trabajadores, the government housing fund that grants mortgage credits to employees.
- FONACOT
- Fondo Nacional para el Consumo de los Trabajadores, a government program that gives employees low-cost loans.
- ISR
- Impuesto sobre la renta, Mexico’s income tax, withheld from wages and salaries.
- Aguinaldo
- The annual year-end bonus, called Christmas bonus in Odoo.
- Payroll CFDI
- The payslip issued as a CFDI, Mexico’s electronic invoice format, with the SAT payroll complement.
What it covers, item by item
| Item | What Odoo 20 does | Where it is configured |
|---|---|---|
| Employee data | Requires an 11-digit social security number (NSS), a 13-character RFC tax ID, an 18-character CURP population ID and at least one trusted bank account | Employee, personal tab |
| Contract | Contract type, fixed or hourly wage, the «Mexico: Employee» pay category and the hiring regime, which drives benefits, taxes and social security | Employee, payroll tab |
| IMSS | Uses the company’s employer IMSS ID, risk type and occupational risk premium, and shows IMSS contributions and the CEAV old-age contribution (cesantía en edad avanzada y vejez) on every payslip | Payroll settings and rule parameters |
| Income tax (ISR) | Withholds wage and salary income tax and accepts ISR adjustments as payslip inputs | Payslip |
| State taxes | The state of the work address decides which salary rules Odoo applies when computing taxes | Employee, work tab |
| INFONAVIT | Deducts employee credits as a fixed fee, a percentage or a discount factor, with their monthly insurance, and posts contributions to accounting | Employee, Infonavit / Fonacot tab |
| FONACOT | Deducts the monthly credit amount and any extra contributions | Employee, Infonavit / Fonacot tab |
| Aguinaldo | Its own salary structure, with a minimum of 15 days of pay | Rule parameters |
| Vacation | The table of days by years of service and the vacation premium rate on base salary | Rule parameters and employee |
| Savings fund and vouchers | The monthly savings fund contribution and meal, transport and gasoline vouchers | Employee, payroll tab |
| Accounting | Twenty-two accounts from the Mexican chart of accounts for payroll entries | Chart of accounts |
| Payroll CFDI | Generates the CFDI from the payslip or from the pay run | Payslip or pay run |
Every row comes from the official Odoo 20.0 documentation, payroll localizations, Mexico (see Sources).
Those twenty-two accounts include wage and salary income tax withholding, the employment subsidy to apply, the IMSS withholding and employer provision, contributions to the retirement savings system (SAR) and to INFONAVIT, provisions for vacation, aguinaldo and savings fund, and FONACOT credits. If a salary rule has no account assigned, Odoo uses the salary expenses account for the entry.
How a payroll run works in Odoo 20
The flow Odoo documents is the same for all regular payroll:
- Validate the period’s work entries: approved time off, overtime and resolved conflicts.
- Create draft payslips, one by one or in batches, which Odoo calls pay runs; grouping them by wage type, pay schedule or department is common.
- Review each payslip’s worked days and inputs, and add missing ones such as commissions, bonuses or ISR adjustments.
- Check the totals —gross pay, vouchers, IMSS contributions, CEAV and taxes—, recompute the sheet if anything changed and validate.
- Generate the journal entries as drafts, per payslip or per batch, and post them.
- Register the payments, which require a trusted employee bank account.
- Generate the CFDI of each payslip, or of the whole pay run, and close the period’s payroll.
The aguinaldo follows the same flow with its own salary structure, «Mexico: Christmas Bonus», which the localization installs alongside the regular pay structure.
The payslip as a CFDI
Since January 1, 2022, version 1.2 of the payroll complement has been integrated with CFDI version 4.0, in its revision C. With that change, the SAT made the recipient’s RFC, name, fiscal regime and tax address ZIP code mandatory on the payroll document (SAT), so each employee’s tax data has to be complete before stamping.
Like every CFDI, the payslip is certified by an authorized certification provider (PAC) before it reaches Mexico’s tax administration (SAT). That is why the documentation asks for the CFDI to be configured before the first payroll run: the Payroll settings hold the employer IMSS ID and the company’s risk type, and the documentation points to the Mexican fiscal localization, where the PAC and the digital seal certificate are configured (see the guide to the Mexican localization in Odoo).
Once payroll is processed and paid, the CFDI is generated from the individual payslip or from the pay run. Odoo logs the submission in the payslip’s chatter, and if the Documents module is installed, it emails the employee a link to the folder with the payslip’s XML and PDF. The trusted bank account matters here too: without it, Odoo does not generate the CFDI files.
What to review at setup and every year
The localization ships with almost every parameter loaded, and the Odoo 20 documentation points out the ones each company adjusts:
- Occupational risk premium. The IMSS sets it for each company based on its accident rate, so it is always updated when payroll is configured.
- Aguinaldo days. The parameter ships with the 15-day minimum; a company that pays more changes it, and the value applies equally to all of its employees.
- Vacation table. It defines vacation days by years of service and is adjusted to the company’s paid vacation policy.
Odoo loads the updated rule parameters for the current calendar year. Its documentation advises against editing the others unless a national or state parameter has changed and differs from the one Odoo created, and against changing any of them before checking local and national regulations.
Two more decisions come before the first run. Each employee’s work address must be complete, because its state decides which salary rules apply; by default it is the company’s address. And the company decides whether journal entries are posted per payslip or per batch, because the documentation asks for that choice before payroll is run.
Work entries for Mexican payroll are created from each employee’s assigned working schedule, and overtime logged in the Attendances app is added when that option is enabled for the employee.
If the company has not set up electronic invoicing yet, the starting point is the guide to the Mexican localization in Odoo 20, because payroll CFDI depends on it.
Frequently asked questions
Does Odoo have payroll for Mexico?
Yes. Odoo 20 has a Mexican payroll localization built from Odoo’s own modules: it computes salaries with employee and employer payroll taxes and issues each payslip as a CFDI. It runs on the Payroll app, which is part of Odoo Enterprise.
How is payroll stamped as a CFDI in Odoo?
With the payroll CFDI module installed and the fiscal localization configured, payroll is processed and paid, and the CFDI is then generated from each payslip or from the whole pay run. Odoo logs it on the payslip, and with the Documents module it emails each employee a link to their XML and PDF.
Does Odoo payroll handle IMSS and INFONAVIT?
Yes. The localization uses each company’s IMSS occupational risk premium, shows the IMSS contributions on every payslip and posts the withholding and the employer provision to accounting. Employees’ INFONAVIT credits are deducted as a fixed fee, a percentage or a discount factor.
How is the aguinaldo paid in Odoo?
With the Christmas bonus salary structure the localization installs, following the same flow as regular payroll. The aguinaldo days parameter ships with the 15-day minimum and is raised if the company pays more; in Odoo it applies equally to all of the company’s employees.
What is needed before stamping payroll in Odoo?
The Mexican fiscal localization configured with its PAC and digital seal certificate; the employer IMSS ID and risk type in the Payroll settings; and, on each employee, their social security number, RFC, CURP and a bank account marked as trusted.
By industry
Planning to run your Mexican payroll in Odoo? See our Mexico localization and compliance service, or write to us.
Sources
- Odoo S.A., “Mexico”, official Odoo 20.0 documentation, payroll localizations, odoo.com/
documentation/ . Accessed .20.0/ applications/ hr/ payroll/ payroll_localizations/ mexico.html - Odoo S.A., “Payroll localizations”, official Odoo 20.0 documentation, odoo.com/
documentation/ . Accessed .20.0/ applications/ hr/ payroll/ payroll_localizations.html - Odoo S.A., “Mexico”, official Odoo 20.0 documentation, fiscal localizations, odoo.com/
documentation/ . Accessed .20.0/ applications/ finance/ fiscal_localizations/ mexico.html - Servicio de Administración Tributaria, “Recibo de nómina”, sat.gob.mx, omawww.sat.gob.mx/
tramitesyservicios/ . Accessed .Paginas/ complemento_nomina.htm