Odoo 19 to 20: what changed
Community + Enterprise Community + Enterprise modules. 1,944 models in Odoo 19, 2,203 in Odoo 20.
Breaking changes to know first
get_param() / set_param() removed
ir.config_parameter get_param() and set_param() were removed in Odoo 20.
What to do: Use the typed accessors get_str / get_int / get_float / get_bool and set_str / set_int / ...
Binary fields no longer take base64 bytes
Odoo 20 binary fields raise TypeError when given bytes such as the output of base64.b64encode().
What to do: Write raw content (BinaryBytes / attachment raw), or decode base64 to a str first.
read_group() takes the _read_group signature
In Odoo 20 read_group() takes groupby and aggregates and returns tuples, like _read_group().
What to do: Use formatted_read_group() for dictionary results, or adapt to read_group(domain, groupby, aggregates).
Record rules (ir.rule) replaced by ir.access
Odoo 20 replaced record rules (ir.rule) with access records that carry a domain (ir.access).
What to do: Use env['ir.access'] with a domain instead of ir.rule.
ir.model.access replaced by ir.access
Odoo 20 replaced access rights (ir.model.access) with ir.access (operations + optional domain).
What to do: Use env['ir.access'] with operation 'r' / 'rw' / 'crud' and an optional domain; the CSV file becomes security/ir.access.csv.
Renamed models and fields
| Odoo 19 | Odoo 20 | Kind |
|---|---|---|
| ir.model.access | ir.access | model |
| ir.rule | ir.access | model |
51 more field renames detected from matching names and types (likely, not confirmed)
| Model | Odoo 19 | Odoo 20 | Confidence |
|---|---|---|---|
| res.config.settings | l10n_co_dian_cert_credit_count | l10n_co_edi_cert_credit_count | likely |
| res.config.settings | l10n_co_dian_cert_debit_count | l10n_co_edi_cert_debit_count | likely |
| res.config.settings | l10n_co_dian_cert_invoice_count | l10n_co_edi_cert_invoice_count | likely |
| res.config.settings | l10n_co_dian_certificate_ids | l10n_co_edi_certificate_ids | likely |
| res.config.settings | l10n_co_dian_certification_process | l10n_co_edi_certification_process | likely |
| res.config.settings | l10n_co_dian_demo_mode | l10n_co_edi_demo_mode | likely |
| res.config.settings | l10n_co_dian_operation_mode_ids | l10n_co_edi_operation_mode_ids | likely |
| res.config.settings | l10n_co_dian_test_environment | l10n_co_edi_test_environment | likely |
| res.config.settings | l10n_vn_edi_default_symbol | l10n_vn_edi_default_symbol_id | possible |
| res.config.settings | pos_iface_display_id | pos_iot_display_id | likely |
| res.config.settings | pos_iface_printer_id | pos_iot_printer_id | likely |
| res.config.settings | pos_iface_scale_id | pos_iot_scale_id | likely |
| res.config.settings | pos_iface_scanner_ids | pos_iot_scanner_ids | likely |
| res.config.settings | send_request_wa_template_id | sign_send_request_wa_template_id | possible |
| res.config.settings | stock_journal | stock_journal_id | possible |
| res.company | l10n_co_dian_certificate_ids | l10n_co_edi_certificate_ids | likely |
| res.company | l10n_co_dian_certification_process | l10n_co_edi_certification_process | likely |
| res.company | l10n_co_dian_demo_mode | l10n_co_edi_demo_mode | likely |
| res.company | l10n_co_dian_operation_mode_ids | l10n_co_edi_operation_mode_ids | likely |
| res.company | l10n_co_dian_test_environment | l10n_co_edi_test_environment | likely |
| hr.version | new_car | has_new_car | possible |
| account.move | l10n_co_dian_attachment_id | l10n_co_edi_attachment_id | likely |
| account.move | l10n_co_dian_claim_reason | l10n_co_edi_claim_reason | likely |
| account.move | l10n_co_dian_commercial_state | l10n_co_edi_commercial_state | likely |
| account.move | l10n_co_dian_document_ids | l10n_co_edi_document_ids | likely |
| account.move | l10n_co_dian_identifier_type | l10n_co_edi_identifier_type | likely |
| account.move | l10n_co_dian_is_enabled | l10n_co_edi_is_enabled | likely |
| account.move | l10n_co_dian_post_time | l10n_co_edi_post_time | likely |
| account.move | l10n_co_dian_processed_by_get_event_status_cron | l10n_co_edi_processed_by_get_event_status_cron | likely |
| account.move | l10n_co_dian_show_support_doc_button | l10n_co_edi_show_support_doc_button | likely |
| account.move | l10n_co_dian_state | l10n_co_edi_state | likely |
| account.move | l10n_co_dian_update_commercial_event_enabled | l10n_co_edi_update_commercial_event_enabled | likely |
| pos.config | iface_display_id | iot_display_id | likely |
| pos.config | iface_printer_id | iot_printer_id | likely |
| pos.config | iface_scale_id | iot_scale_id | likely |
| pos.config | iface_scanner_ids | iot_scanner_ids | likely |
| pos.config | is_closing_entry_by_product | use_closing_entry_by_product | likely |
| pos.config | is_header_or_footer | use_header_or_footer | likely |
| pos.config | is_order_printer | use_order_printer | likely |
| hr.payslip | use_worked_day_lines | struct_use_worked_day_lines | possible |
| pos.session | statement_line_ids | bank_statement_line_ids | possible |
| account.asset | account_depreciation_expense_id | import_account_depreciation_expense_id | possible |
| account.asset | account_depreciation_id | import_account_depreciation_id | possible |
| marketing.campaign | domain | enroll_domain | possible |
| marketing.campaign | unique_field_id | enroll_unique_field_id | possible |
| marketing.activity | domain | split_domain | possible |
| ai.composer | ai_agent | ai_agent_id | possible |
| event.event | address_inline | contact_address_inline | possible |
| frontdesk.visitor | host_ids | station_host_ids | possible |
| event.event.ticket | price_incl | total_price_incl | possible |
| event.event.ticket | price_reduce_taxinc | total_price_reduce_taxinc | possible |
Models with the most field changes
| Model | Added | Removed | Type changes |
|---|---|---|---|
| res.config.settings | 349 | 205 | 5 |
| hr.employee | 280 | 82 | 3 |
| res.company | 240 | 104 | 4 |
| hr.version | 272 | 67 | 2 |
| account.move | 144 | 52 | 6 |
| res.partner | 86 | 43 | 2 |
| pos.config | 67 | 50 | 0 |
| pos.order | 50 | 48 | 0 |
| hr.payslip | 60 | 19 | 1 |
| l10n_be.274_xx | 75 | 2 | 0 |
| hr.work.entry.type | 50 | 18 | 0 |
| planning.slot | 54 | 10 | 0 |
| pos.session | 13 | 47 | 0 |
| project.task | 5 | 54 | 0 |
| res.partner.bank | 33 | 25 | 0 |
| res.users | 47 | 10 | 1 |
| stock.picking | 56 | 2 | 0 |
| account.move.line | 43 | 5 | 7 |
| l10n_be.dmfa | 45 | 9 | 0 |
| product.template | 36 | 13 | 0 |
| website | 27 | 21 | 0 |
| delivery.carrier | 41 | 3 | 0 |
| account.payment | 32 | 10 | 0 |
| sale.order | 30 | 11 | 1 |
| hr.leave | 32 | 9 | 0 |
Models removed in Odoo 20 (175)
Grouped by the module that defined them in Odoo 19. E = Enterprise module.
account
- account.groupAccount Group
account_peppol
- account_peppol.servicePeppol Service
- peppol.config.wizardPeppol Configuration Wizard
account_reports
- account.ec.sales.report.handlerEEC Sales Report Custom Handler
account_sepa_direct_debit
- sdd.mandateESDD Mandate
- sdd.mandate.sendESDD Mandate Send
account_winbooks_import
- account.winbooks.import.wizardEAccount Winbooks import wizard
ai
- ai.topicECreate a topic that leverages instructions and tools to direct Odoo AI in assisting the user with their tasks.
appointment
- appointment.manage.leavesEAdd or remove leaves from appointments
barcodes
- barcodes.barcode_events_mixinBarcode Event Mixin
base
- ir.model.accessModel Accessnow ir.access
- ir.ruleRecord Rulenow ir.access
- res.bankBank
calendar
- calendar.popover.delete.wizardCalendar Popover Delete Wizard
- calendar.provider.configCalendar Provider Configuration Wizard
crm
- crm.lead2opportunity.partnerConvert Lead to Opportunity (not in mass)
data_cleaning
- ir.attachment.reportEStorage
documents
- documents.unlink.mixinEDocuments unlink mixin
esg_hr_fleet
- employee.commuting.emissions.wizardEGenerate emitted emissions from employee commuting
frontdesk
- frontdesk.drinkEFrontdesk Drink
google_calendar
- google.calendar.syncSynchronize a record with Google Calendar
helpdesk_fsm
- helpdesk.create.fsm.taskECreate a Field Service task
hr
- hr.contract.typeContract Type
- hr.departure.wizardDeparture Wizard
- hr.version.wizardContract Template Wizard
hr_appraisal_skills
- hr.appraisal.skill.reportEAppraisal Skills Report
hr_attendance
- hr.attendance.overtime.lineAttendance Overtime Line
- hr.attendance.overtime.ruleOvertime Rule
- hr.attendance.overtime.rulesetOvertime Ruleset
hr_expense
- hr.expense.post.wizardExpense Posting Wizard
hr_holidays
- hr.leave.typeTime Off Type
hr_payroll
- hr.payroll.dashboard.warningEPayroll Dashboard Warning
- hr.payroll.edit.payslip.lineEEdit payslip lines wizard line
- hr.payroll.edit.payslip.lines.wizardEEdit payslip lines wizard
- hr.payroll.edit.payslip.worked.days.lineEEdit payslip line wizard worked days
- hr.payroll.indexEIndex contracts
- hr.payroll.noteEPayroll Note
- hr.payslip.input.typeEPayslip Input Type
- hr.work.entry.export.employee.mixinEWork Entry Export Employee
- hr.work.entry.export.mixinEWork Entry Export Mixin
- hr.work.entry.reportEWork Entries Analysis Report
hr_recruitment
- applicant.send.mailSend mails to applicants
hr_skills
- hr.employee.certification.reportEmployee Certification Report
hr_work_entry
- hr.work.entryHR Work Entry
- hr.work.entry.regeneration.wizardRegenerate Employee Work Entries
im_livechat
- im_livechat.conversation.tagLive Chat Conversation Tags
industry_fsm
- project.task.stop.timers.wizardETask stop running timers confirmation wizard
- project.task.stop.timers.wizard.lineETask stop running timers confirmation wizard line
- report.industry_fsm.worksheet_customETask Worksheet Custom Report
- report.project.task.user.fsmEFSM Tasks Analysis
industry_fsm_report
- worksheet.template.load.wizardELoad the worksheet template
industry_fsm_stock
- fsm.stock.trackingETrack Stock
- fsm.stock.tracking.lineELines for FSM Stock Tracking
l10n_ar_withholding
- l10n_ar.payment.register.withholdingPayment register withholding lines
l10n_be_hr_payroll
- hr.payslip.employee.depature.holiday.attestsEManage the Employee Departure Holiday Attests
- hr.payslip.employee.depature.holiday.attests.time.off.lineEHoliday Attest Time Off Line
- hr.payslip.employee.depature.noticeEManage the Employee Departure - Notice Duration
- l10n.be.december.slip.wizardECP200: December Slip Computation
- l10n.be.double.pay.recovery.lineECP200: Double Pay Recovery Line Wizard
- l10n.be.double.pay.recovery.line.wizardECP200: Double Pay Recovery Line Wizard
- l10n.be.double.pay.recovery.wizardECP200: Double Pay Recovery Wizard
- l10n.be.group.insurance.line.wizardEGroup Insurance Wizard Line
- l10n.be.group.insurance.wizardEGroup Insurance Wizard
- l10n.be.holiday.attest.wizardEHoliday Attest Wizard
- l10n_be.273sE273S Sheet
- l10n_be.dmfa.location.unitEWork Place defined by ONSS
- l10n_be.work.entry.daily.benefit.reportEWork Entry Related Benefit Report
l10n_be_hr_payroll_acerta
- l10n.be.hr.payroll.export.acertaEExport Payroll to Acerta
- l10n.be.hr.payroll.export.acerta.employeeEAcerta Export Employee
l10n_be_hr_payroll_group_s
- l10n.be.hr.payroll.export.group.sEExport Payroll to Group S
- l10n.be.hr.payroll.export.group.s.employeeEGroup S Export Employee
l10n_be_hr_payroll_partena
- l10n.be.hr.payroll.export.partenaEExport Payroll to Partena
- l10n.be.hr.payroll.export.partena.employeeEPartena Export Employee
l10n_be_hr_payroll_prisma
- l10n.be.hr.payroll.export.prismaEExport Payroll to Prisma
- l10n.be.hr.payroll.export.prisma.employeeEPrisma Export Employee
l10n_be_hr_payroll_sd_worx
- l10n.be.hr.payroll.export.sdworxEExport Leaves to SDWorx
- l10n.be.hr.payroll.export.sdworx.employeeESDWorx Export Employee
l10n_be_hr_payroll_ucm
- l10n.be.hr.payroll.export.ucmEExport Payroll to UCM
- l10n.be.hr.payroll.export.ucm.employeeEUCM Export Employee
l10n_be_pos_blackbox
- pos.blackbox.beEPOS Blackbox BE
- pos.blackbox.log.deviceEPOS Blackbox Log Device
- pos.clock.in.outEPOS Clock In/Out Event of user/employee
- report.l10n_be_pos_blackbox.user_report_templateEPOS Session user report
l10n_be_reports
- l10n_be_reports.isoc.prepayment.pay.wizardEPayment instructions for ISOC prepayment
- l10n_be_reports.vat.return.lock.wizardEBelgian Periodic VAT Report Lock Wizard
l10n_co_dian
- l10n_co_dian.claim.wizardEWizard used for choosing a reason for rejecting a Vendor bill
- l10n_co_dian.documentEColombian documents used for each interaction with the DIAN
- l10n_co_dian.operation_modeEColombian operation modes of DIAN used for different documents
l10n_dk_oioubl
- account.edi.xml.oioubl_201OIOUBL 2.01
l10n_es_reports
- l10n_es_reports.aeat.boe.export.wizardEBOE Export Wizard
- l10n_es_reports.aeat.boe.mod111.export.wizardEBOE Export Wizard for (mod111)
- l10n_es_reports.aeat.boe.mod111and115and303.export.wizardEBOE Export Wizard for (mod111, mod115 & 303)
- l10n_es_reports.aeat.boe.mod115.export.wizardEBOE Export Wizard for (mod115)
- l10n_es_reports.aeat.boe.mod130.export.wizardEBOE Export Wizard for (mod130)
- l10n_es_reports.aeat.boe.mod303.export.wizardEBOE Export Wizard for (mod303)
- l10n_es_reports.aeat.boe.mod347.export.wizardEBOE Export Wizard for (mod347)
- l10n_es_reports.aeat.boe.mod347and349.export.wizardEBOE Export Wizard for (mod347 & mod349)
- l10n_es_reports.aeat.boe.mod349.export.wizardEBOE Export Wizard for (mod349)
- l10n_es_reports.aeat.boe.mod390.export.wizardEBOE Export Wizard for (mod390)
- l10n_es_reports.aeat.mod347.manual.partner.dataEManually Entered Data for Mod 347 Report
l10n_es_reports_2025
- l10n_es_reports_2025.mod111.submission.wizardEBOE Submission Wizard for (mod111)
- l10n_es_reports_2025.mod115.submission.wizardEBOE Submission Wizard for (mod115)
- l10n_es_reports_2025.mod130.submission.wizardEBOE Submission Wizard for (mod130)
- l10n_es_reports_2025.mod303.submission.wizardEBOE Submission Wizard for (mod303)
- l10n_es_reports_2025.mod347.submission.wizardEBOE Submission Wizard for (mod347)
- l10n_es_reports_2025.mod349.submission.wizardEBOE Submission Wizard for (mod349)
- l10n_es_reports_2025.mod390.submission.wizardEBOE Submission Wizard for (mod390)
- l10n_es_reports_2025.modelos.submission.wizardEGeneric BOE Submission Wizard
l10n_fr_hr_payroll
- report.l10n_fr_hr_payroll.report_l10n_fr_fiche_payeEFrench Pay Slip
l10n_fr_pdp
- pdp.config.wizardPeppol Configuration Wizard
l10n_fr_reports
- l10n_fr_reports.send.vat.report.bank.account.lineEBank Account Line for French Vat Report
l10n_hk_hr_payroll
- hr.payslip.run.hsbc.autopay.wizardEHR Payslip Run HSBC Autopay Wizard
- l10n_hk.manulife.mpfEManulife MPF
- l10n_hk.manulife.mpf.lineEManulife MPF Line
l10n_hu_edi_receive
- l10n_hu_edi_receive.bills.wizardReceive Bills Wizard
l10n_in
- l10n_in.section.alertindian section alert
- l10n_in.withhold.wizardWithhold Wizard
l10n_in_hr_payroll
- l10n.in.tds.computation.wizardEIndian Payroll: TDS computation
l10n_it_hr_payroll_sd_worx
- l10n.it.hr.payroll.export.sdworxEExport Work Entries to SDWorx (Italy)
- l10n.it.hr.payroll.export.sdworx.employeeESDWorx Export Employee Italy
l10n_latam_base
- l10n_latam.identification.typeIdentification Types
l10n_lu_hr_payroll
- l10n.lu.monthly.declaration.wizardELuxembourg: Monthly Declaration
- l10n.lu.situational.unemployment.wizardEEmployee Situational Unemployment
l10n_mx_xml_polizas
- l10n_mx_xml_polizas.xml_polizas_wizardEWizard for the XML Polizas export of Journal Entries
l10n_ph
- l10n_ph_2307.wizardExports 2307 data to a XLS file.
l10n_ph_reports
- l10n_ph.sawt_qap.report.handlerEWithholding Taxes Custom Handler
l10n_ro_reports_d300
- l10n_ro.d300.lock.wizardERomanian Periodic VAT Report Lock Wizard
l10n_se_returns
- l10n_se_returns.ec.sales.list.submission.wizardESwedish EC Sales List Submission Wizard
- l10n_se_returns.vat.return.submission.wizardESwedish VAT Return Submission Wizard
l10n_tr_nilvera_einvoice_extended
- l10n_tr_nilvera_einvoice_extended.account.tax.codeTurkish Tax Codes (GIB Codes)
- l10n_tr_nilvera_einvoice_extended.tax.officeTurkish Tax Office
l10n_uk_reports
- l10n_uk.tax.report.handlerEBritish Tax Report Custom Handler
l10n_us_hr_payroll_adp
- l10n.us.adp.exportEADP Export
l10n_vn_edi_viettel
- l10n_vn_edi_viettel.cancellationE-invoice cancellation wizard
- l10n_vn_edi_viettel.sinvoice.templateSInvoice template
- mail.thread.ccEmail CC management
mail_plugin
- res.partner.iapPartner IAP
mass_mailing
- mailing.list.mergeMerge Mass Mailing List
planning
- planning.previewEPlanning Preview
point_of_sale
- pos.close.session.wizardClose Session Wizard
pos_blackbox_be
- pos.blackbox.log.ipEPOS Blackbox Log IP
- pos_blackbox_be.logETrack every changes made while using the Blackbox
pos_enterprise
- pos.prep.stateEPos Preparation State
pos_iot_six
- pos_iot_six.add_six_terminalEConnect a Six Payment Terminal
pos_urban_piper
- product.urban.piper.statusEUrban piper product status
pos_urban_piper_enhancements
- pos.store.timingEPos Store Timings
product
- product.template.attribute.exclusionProduct Template Attribute Exclusion
- report.product.report_producttemplatelabel2x7Product Label Report 2x7
- report.product.report_producttemplatelabel4x12Product Label Report 4x12
- report.product.report_producttemplatelabel4x12nopriceProduct Label Report 4x12 No Price
- report.product.report_producttemplatelabel4x7Product Label Report 4x7
- report.product.report_producttemplatelabel_dymoProduct Label Report
purchase_requisition
- purchase.requisition.alternative.warningWizard in case PO still has open alternative requests for quotation
- purchase.requisition.create.alternativeWizard to preset values for alternative PO
repair
- stock.warn.insufficient.qty.repairWarn Insufficient Repair Quantity
sale_renting
- product.pricingEPricing rule of rental products
- sale.temporal.recurrenceESale temporal Recurrence
sign
- sign.completed.documentECompleted Document
social
- social.stream.post.imageESocial Stream Post Image Attachment
stock
- report.stock.label_lot_template_viewLot Label Report
- report.stock.label_product_product_viewProduct Label Report
- report.stock.report_receptionStock Reception Report
- stock.quantity.historyStock Quantity History
- stock.return.pickingReturn Picking
- stock.return.picking.lineReturn Picking Line
- stock.scrapScrap
stock_account
- stock_account.stock.valuation.reportStock Valuation
stock_intrastat
- stock.intrastat.report.handlerEIntrastat Report Custom Handler (Stock)
timesheet_grid
- hr.timesheet.stop.timer.confirmation.wizardEConfirm timesheet creation when stop timer
transifex
- transifex.code.translationCode Translation
- transifex.translationTransifex Translation
utm
- utm.source.mixinUTM Source Mixin
voip
- voip.country.code.mixinEPhone Country Mixin
- voip.queue.mixinEVOIP Queue support
website_sale
- website.base.unitUnit of Measure for price per unit on eCommerce products.
Models added in Odoo 20 (434)
Modules with the most new models:
Modules removed and added
133 modules of Odoo 19 are gone
250 new modules in Odoo 20
Views, menus and actions removed
XML ids that existed in Odoo 19 and no longer exist in Odoo 20. Customisations that inherit or reference them fail to install. See the full list.
| Module | Views | Menus | Actions |
|---|---|---|---|
| theme_artists | 136 | 0 | 0 |
| website | 121 | 0 | 0 |
| industry_fsm | 61 | 21 | 30 |
| theme_nano | 103 | 0 | 0 |
| theme_bistro | 99 | 0 | 0 |
| theme_buzzy | 98 | 0 | 0 |
| theme_notes | 97 | 0 | 0 |
| mass_mailing | 95 | 1 | 0 |
| theme_orchid | 86 | 0 | 0 |
| theme_kiddo | 85 | 0 | 0 |
| theme_loftspace | 83 | 0 | 0 |
| theme_kea | 80 | 0 | 0 |
| theme_yes | 80 | 0 | 0 |
| theme_bookstore | 77 | 0 | 0 |
| theme_vehicle | 71 | 0 | 0 |
| theme_anelusia | 70 | 0 | 0 |
| theme_real_estate | 70 | 0 | 0 |
| theme_aviato | 69 | 0 | 0 |
| theme_bewise | 67 | 0 | 0 |
| theme_treehouse | 66 | 0 | 0 |
| theme_odoo_experts | 65 | 0 | 0 |
| theme_beauty | 64 | 0 | 0 |
| theme_monglia | 64 | 0 | 0 |
| theme_graphene | 63 | 0 | 0 |
| theme_paptic | 60 | 0 | 0 |
| theme_cobalt | 54 | 0 | 0 |
| stock | 31 | 1 | 21 |
| theme_zap | 53 | 0 | 0 |
| theme_clean | 52 | 0 | 0 |
| theme_enark | 52 | 0 | 0 |
And 386 more modules in the full list.