Upgrading Odoo 19 to Odoo 20

What changes between Odoo 19 and Odoo 20 only: first what to change in custom modules, then the changes we flagged week by week. Tick them off as you go; ticks stay in this browser.

Coming from an older version? Do the earlier steps first.

Framework changes for custom modules · 11

11 breaking, 0 deprecated but still working in 20.0. Started from OCA's migration guides; we checked each one in the Odoo code.

BreakingDeprecated in 18.0, removed in 20.0

Rename the field attribute group_operator to aggregator

group_operator is mapped to aggregator with a deprecation warning in 18.0 and 19.0. In 20.0 it is an unknown parameter: a warning at startup, and the field falls back to the default aggregate.

Before
price_avg = fields.Float(group_operator='avg')
After
price_avg = fields.Float(aggregator='avg')

Checked in: 17.0/odoo/fields.py:323, 18.0/odoo/fields.py:480, 20.0/odoo/orm/fields.py:562 · Odoo: dd7a10aa

BreakingRemoved in 20.0

Replace the selection_badge widget

Use badges_selection for selection fields and badges_many2one for many2one fields; selection_badge_with_filter is gone too. The old name does not crash: the field falls back to the default widget with only a console warning.

Before
<field name="state" widget="selection_badge"/>
<field name="stage_id" widget="selection_badge"/>
After
<field name="state" widget="badges_selection"/>
<field name="stage_id" widget="badges_many2one"/>

Checked in: 20.0/addons/web/static/src/views/fields/badges_selection/badges_selection_field.js:80, 20.0/addons/web/static/src/views/fields/badges_many2one/badges_many2one_field.js:114

BreakingDeprecated in 18.0, removed in 20.0

Call check_access instead of check_access_rights and check_access_rule

One method now checks both access rights and record rules; has_access returns a boolean instead of raising. _filter_access_rules and _filter_access_rules_python become _filtered_access. The old names log a deprecation warning in 18.0 and 19.0 and are gone in 20.0.

Before
self.check_access_rights('write')
self.check_access_rule('write')
allowed = records._filter_access_rules('read')
After
self.check_access('write')
if records.has_access('read'): ...
allowed = records._filtered_access('read')

Checked in: 17.0/odoo/models.py:4156, 18.0/odoo/models.py:4442, 19.0/odoo/orm/models.py:4168, 20.0/odoo/orm/models.py:3443 · Odoo: #179148

BreakingDeprecated in 19.0, removed in 20.0

Replace odoo.osv.expression with odoo.fields.Domain

odoo.osv warns in 19.0 and no longer exists in 20.0, so the import fails there. Build domains with Domain and its &, | and ~ operators, or Domain.AND and Domain.OR.

Before
from odoo.osv import expression
domain = expression.AND([domain, [('state', '=', 'done')]])
After
from odoo.fields import Domain
domain = Domain(domain) & Domain('state', '=', 'done')

Checked in: 19.0/odoo/osv/__init__.py:4, 19.0/odoo/fields/__init__.py:20 · Odoo: #217708, #170009

BreakingRemoved in 20.0

Use self.env.tz, and drop pytz for 20.0

self.env.tz gives the user or context timezone. In 19.0 it is a pytz timezone; in 20.0 it is a ZoneInfo and pytz is no longer an Odoo requirement, so .localize() and .normalize() calls break.

Before
tz = pytz.timezone(self.env.context.get('tz') or self.env.user.tz or 'UTC')
local = pytz.utc.localize(dt).astimezone(tz)
After
from datetime import UTC
local = dt.replace(tzinfo=UTC).astimezone(self.env.tz)

Checked in: 19.0/odoo/orm/environments.py:285, 20.0/odoo/orm/environments.py:315 · Odoo: #221541

BreakingDeprecated in 18.0, removed in 20.0

Use _has_cycle instead of _check_recursion

_check_recursion and _check_m2m_recursion log a deprecation warning in 18.0 and 19.0 and are gone in 20.0. _has_cycle returns the opposite: True when there is a cycle.

Before
if not self._check_recursion():
    raise ValidationError(_('Recursive hierarchy.'))
After
if self._has_cycle():
    raise ValidationError(_('Recursive hierarchy.'))

Checked in: 17.0/odoo/models.py:5657, 18.0/odoo/models.py:6075, 19.0/odoo/orm/models.py:5707, 20.0/odoo/orm/models.py:5122

BreakingRemoved in 20.0

Merge access rights and record rules into ir.access

ir.model.access and ir.rule no longer exist. Each ir.access row has an operation (a subset of "crud") and an optional domain; an empty group makes it a restriction. The upgrade_code script 19.4-00-ir-access converts existing files; review its output.

Before
# ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_my_model_user,my.model user,model_my_model,base.group_user,1,1,1,0
After
# ir.access.csv
id,name,model_id,group_id/id,operation,domain
access_my_model_user,my.model user,my.model,base.group_user,cru,

Checked in: 20.0/odoo/addons/base/models/ir_access.py:66, 20.0/odoo/upgrade_code/19.4-00-ir-access.py, 20.0/addons/project/security/ir.access.csv:1 · Odoo: #166359

BreakingDeprecated in 19.0, removed in 20.0

Replace @ormcache_context with @ormcache

ormcache_context warns in 19.0 and is gone in 20.0, where the import fails. Pass every context key as a self.env.context.get() expression.

Before
@tools.ormcache_context('self.id', keys=('lang',))
After
@tools.ormcache('self.id', 'self.env.context.get("lang")')

Checked in: 19.0/odoo/tools/cache.py:187 · Odoo: #220725

BreakingDeprecated in 19.0, removed in 20.0

Replace read_group with _read_group or formatted_read_group

read_group is deprecated in 19.0, and in 20.0 it has a new, final signature, so old calls and overrides break. Use _read_group in backend code and formatted_read_group for UI-shaped results.

Before
res = Order.read_group([('state', '=', 'sale')], ['amount_total:sum'], ['partner_id'], lazy=False)
After
for partner, total in Order._read_group([('state', '=', 'sale')], ['partner_id'], ['amount_total:sum']):
    ...

Checked in: 19.0/odoo/orm/models.py:2754, 19.0/addons/web/models/models.py:802, 20.0/odoo/orm/models.py:1930 · Odoo: #163300

BreakingOld code works differently from 20.0

Choose the test user in BaseCommon tests

BaseCommon now runs each test as a plain internal user, so admin-only operations raise AccessError. Set _test_user_groups = None to keep the previous user, or list the groups the test needs.

Before
class TestMyModule(BaseCommon):
    def test_flow(self): ...
After
class TestMyModule(BaseCommon):
    _test_user_groups = None
    def test_flow(self): ...

Checked in: 20.0/odoo/addons/base/tests/common.py:18

BreakingDeprecated in 19.0, old code works differently from 19.0, removed in 20.0

Override action_archive, not toggle_active

From 19.0 archiving no longer goes through toggle_active, so its overrides stop firing. Calls still work until 20.0, where the method is gone. action_archive and action_unarchive already exist in 18.0.

Before
def toggle_active(self):
    res = super().toggle_active()
    ...
After
def action_archive(self):
    res = super().action_archive()
    ...

Checked in: 19.0/odoo/orm/models.py:5808, 20.0/odoo/orm/models.py:5279 · Odoo: #183691

Modules removed or renamed · 134

29 removed, 17 replaced, 3 renamed, 82 merged, 3 moved. If a custom module depends on one of these, change its depends before you upgrade.

ModuleIn Odoo 20Edition
account_iso20022_account_accountantSEPA Credit Transfer / ISO20022 InvoicingRemovedAdded to 19.0 after its release; not in 20.0.Enterprise
account_peppol_advanced_fields[DEPRECATED] Account Peppol Advanced FieldsRemovedIt didn't work properly.679bb8cbCommunity
account_winbooks_importAccount Winbooks ImportRemovedRarely used.Enterprise
delivery_mondialrelayRemovedUse the Sendcloud connector.97a662aeCommunity
documents_fsmDocuments - FSMRemovedEnterprise
helpdesk_fsm_reportHelpdesk FSM ReportsRemovedField Service moved into Planning.Enterprise
hr_payroll_sale_commissionCommission in PayslipsRemovedPayslip input types gave way to salary rules.Enterprise
l10n_be_coda_extension_numberCODA - Extension NumberRemovedAdded to 19.0 after its release; not in 20.0.Enterprise
l10n_be_hr_payroll_acertaBelgium - Payroll - Export to AcertaRemovedThe old payroll export system is gone.Enterprise
l10n_be_hr_payroll_group_sBelgium - Payroll - Export to Group SRemovedThe old payroll export system is gone.Enterprise
l10n_be_hr_payroll_partenaBelgium - Payroll - Export to PartenaRemovedThe old payroll export system is gone.Enterprise
l10n_be_hr_payroll_prismaBelgium - Payroll - Export to PrismaRemovedThe old payroll export system is gone.Enterprise
l10n_be_hr_payroll_sd_worxBelgium - Payroll - Export to SD WorxRemovedThe old payroll export system is gone.Enterprise
l10n_be_hr_payroll_ucmBelgium - Payroll - Export to UCMRemovedThe old payroll export system is gone.Enterprise
l10n_be_pos_blackbox_hr_pos_blackbox_beBelgian Registered Cash Register (Transition from V1 to V2) HRRemovedAdded to 19.0 after its release for the blackbox v2 migration.Enterprise
l10n_be_pos_blackbox_pos_blackbox_beBelgian Registered Cash Register (Transition from V1 to V2)RemovedAdded to 19.0 after its release for the blackbox v2 migration.Enterprise
l10n_dk_oioublDenmark - E-invoicingRemovedThe OIOUBL 2.01 format is dropped.6123b713Community
l10n_fr_hr_payrollFrench PayrollRemovedThe French payroll localization was dropped as unmaintained.Enterprise
l10n_fr_hr_payroll_accountFrance - Payroll with AccountingRemovedThe French payroll localization was dropped as unmaintained.Enterprise
l10n_it_hr_payroll_sd_worxItaly - Payroll - Export to SD WorxRemovedThe old payroll export system is gone.Enterprise
l10n_pk_reportsPakistan - Accounting ReportsRemovedObsolete.Enterprise
l10n_tr_nilvera_base_vatTürkiye - Nilvera/Base VATRemovedAdded to 19.0 after its release; not in 20.0.Community
l10n_us_hr_payroll_adpUnited States - Payroll - Export to ADPRemovedThe old payroll export system is gone.Enterprise
mrp_subcontracting_repairMRP Subcontracting RepairRemoved3676d4adCommunity
mrp_workorder_expiryMRP II - ExpiryRemovedLeftover of the old tablet view, replaced by the Shop Floor app.Enterprise
pos_iot_ingenicoPoS IoT IngenicoRemovedIngenico terminals are no longer supported.Enterprise
transifexTransifex integrationRemovedOdoo translates on Weblate now.7c891163Community
voip_onsipPhone - OnSIPRemovedEnterprise
website_sale_mondialrelayeCommerce Mondialrelay DeliveryRemovedUse the Sendcloud connector.97a662aeCommunity
esg_projectESG ProjectReplaced by esgESG actions are their own records instead of project tasks.Enterprise
helpdesk_fsmHelpdesk FSMReplaced by helpdesk_planning_field_serviceField Service moved into Planning.Enterprise
helpdesk_fsm_saleHelpdesk FSM - SaleReplaced by helpdesk_planning_field_service_sale_timesheetField Service moved into Planning.Enterprise
industry_fsmField ServiceReplaced by planning_field_serviceField Service moved into Planning.Enterprise
industry_fsm_repairField Service RepairReplaced by planning_field_service_repairField Service moved into Planning.Enterprise
industry_fsm_reportField Service ReportsReplaced by planning_field_service_worksheetField Service moved into Planning.Enterprise
industry_fsm_saleField Service - SaleReplaced by planning_field_service_sale_timesheetField Service moved into Planning.Enterprise
industry_fsm_sale_reportField Service Reports - SaleReplaced by planning_field_service_sale_worksheetField Service moved into Planning.Enterprise
industry_fsm_sale_subscriptionField Service - Sale SubscriptionReplaced by planning_field_service_sale_subscriptionField Service moved into Planning.Enterprise
industry_fsm_smsFSM - SMSReplaced by planning_field_service_smsField Service moved into Planning.Enterprise
industry_fsm_stockField Service StockReplaced by planning_field_service_sale_stockField Service moved into Planning.Enterprise
l10n_uy_posUruguayan - Point of SaleReplaced by l10n_uy_edi_pos77f9c014Community
mrp_workorder_iotIoT features for Work OrderReplaced by mrp_iotEnterprise
pos_blackbox_beBelgian Registered Cash RegisterReplaced by l10n_be_pos_blackboxFor the blackbox v2 hardware.Enterprise
pos_restaurant_urban_piperPOS Restaurant Urban PiperReplaced by pos_self_order_urban_piperEnterprise
purchase_requisition_salePurchase Requisition SaleReplaced by purchase_alternative_salef7f94927Community
quality_mrp_workorder_iotMRP features for Quality Control with IoTReplaced by mrp_iotEnterprise
ai_appAIRenamed to ai_agenticEnterprise
l10n_din5008_industry_fsmDIN 5008 - Field ServiceRenamed to l10n_din5008_planning_field_serviceField Service moved into Planning.Enterprise
website_sale_autocompleteGoogle places autocompletionRenamed to website_address_autocompleteAddress autocomplete no longer needs eCommerce.a2814d3fCommunity
account_accountant_batch_paymentAccount Batch Payment ReconciliationMerged into account_batch_paymentEnterprise
account_add_glnAdd Partner GLNMerged into account_edi_ubl_ciiAdded to 19.0 after its release.Community
account_peppol_responsePeppol Business ResponseMerged into account_peppol34b2b549Community
base_ibanIBAN Bank AccountsMerged into accountBank accounts were reworked; IBAN handling is in Accounting.113d77ebCommunity
base_vatVAT Number ValidationMerged into base and l10n_eu_account_viesOffline VAT number checks are in base; the VIES check is a separate module.2be8edf4Community
delivery_stock_picking_batchDelivery Stock Picking BatchMerged into stockBatch transfers are part of Inventory.78b5ef88Community
esg_csrdESG CSRDMerged into esgEnterprise
esg_csrd_aiAI - ESG CSRDMerged into ai_esgEnterprise
esg_csrd_hrHR - ESG CSRDMerged into esg_hrEnterprise
esg_csrd_hr_fleetESG CSRD - FleetMerged into esg_hr_fleetEnterprise
hr_contract_salary_holidaysSalary Configurator - HolidaysMerged into hr_contract_salaryBenefits moved to Payroll.Enterprise
hr_contract_salary_payrollSalary Configurator - PayrollMerged into hr_contract_salaryBenefits moved to Payroll.Enterprise
hr_holidays_homeworkingHolidays with Remote WorkMerged into hr5411ad2eCommunity
hr_homeworkingRemote WorkMerged into hr5411ad2eCommunity
hr_homeworking_calendarRemote Work with calendarMerged into hr5411ad2eCommunity
hr_hourly_costEmployee Hourly WageMerged into hr9954b7bdCommunity
hr_org_chartHR Org ChartMerged into hrea8ddab5Community
hr_payroll_holidaysTime Off in PayslipsMerged into hr_payrollEnterprise
hr_payroll_planningPayroll - PlanningMerged into hr_work_entryWork entries and time off were reworked.Enterprise
hr_work_entry_attendanceWork Entries - AttendanceMerged into hr_payrollAttendance-based pay is part of Payroll.Enterprise
hr_work_entry_enterpriseWork Entries - EnterpriseMerged into hr_work_entryWork entries and time off were reworked.Enterprise
hr_work_entry_holidaysTime Off in PayslipsMerged into hr_work_entryWork entries and time off were reworked.d37cf89aCommunity
hr_work_entry_holidays_enterpriseTime Off in Payslips EnterpriseMerged into hr_work_entryWork entries and time off were reworked.Enterprise
hr_work_entry_planningWork Entries - PlanningMerged into hr_work_entryWork entries and time off were reworked.Enterprise
hr_work_entry_planning_attendanceAttendances - PlanningMerged into hr_work_entryWork entries and time off were reworked.Enterprise
iot_baseIoT BaseMerged into iot84fed796Community
l10n_ar_reports_simpleArgentinean Accounting IVA Simple ExportMerged into l10n_ar_reportsEnterprise
l10n_be_hr_payroll_dimonaBelgium - Payroll - DimonaMerged into l10n_be_hr_payrollEnterprise
l10n_be_hr_payroll_dimona_autoBelgium - Payroll - Dimona - AutomationMerged into l10n_be_hr_payrollEnterprise
l10n_be_hr_payroll_fixBelgian Payroll - Holiday Attest FixMerged into l10n_be_hr_payrollAdded to 19.0 after its release.Enterprise
l10n_be_hr_payroll_fleetBelgium - Payroll - FleetMerged into l10n_be_hr_payrollBelgian payroll now depends on Fleet.Enterprise
l10n_be_intervatBelgian Intervat & Myminfin EdiMerged into l10n_be_reportsEnterprise
l10n_be_reports_client_nihilBelgium - Accounting Reports Client NihilMerged into l10n_be_reportsEnterprise
l10n_br_edi_fiscal_reformAvatax Brazil Fiscal ReformMerged into l10n_br_ediEnterprise
l10n_br_edi_pos_fiscal_reformAvatax Brazil POS Fiscal ReformMerged into l10n_br_edi_posEnterprise
l10n_br_edi_sale_fiscal_reformAvatax Brazil Sale Fiscal ReformMerged into l10n_br_edi_saleEnterprise
l10n_br_website_sale_fiscal_reformAvatax Brazil eCommerce Fiscal ReformMerged into l10n_br_website_saleEnterprise
l10n_cn_cityChina - City DataMerged into l10n_cnThe city list is in the Chinese localization.e7407b61Community
l10n_co_dianElectronic invoicing for Colombia with DIANMerged into l10n_co_ediEnterprise
l10n_co_edi_mandateMandate invoicing for ColombiaMerged into l10n_co_ediEnterprise
l10n_de_reports_elsterGermany - Elster Tax SubmissionMerged into l10n_de_reportsEnterprise
l10n_dk_nemhandelDenmark EDI - NemhandelMerged into l10n_dk6123b713Community
l10n_dk_nemhandel_responseNemhandel Business ResponseMerged into l10n_dka7e77ab0Community
l10n_ec_stockEcuador - StockMerged into l10n_ec5d43e398Community
l10n_es_reports_2024Spain - Accounting Reports (2024 Update)Merged into l10n_es_reportsSpanish tax returns run on the new return engine.Enterprise
l10n_es_reports_2025Spain - Accounting Reports (2025 Update)Merged into l10n_es_reportsAdded to 19.0 after its release.Enterprise
l10n_fr_hr_work_entry_holidaysFrance - Work Entries Time OffMerged into hr_work_entryWork entries and time off were reworked.d37cf89aCommunity
l10n_hk_hr_payroll_empfHong Kong - Payroll eMPFMerged into l10n_hk_hr_payrollEnterprise
l10n_hu_edi_receiveHungary - E-invoicing Receive Vendor BillsMerged into l10n_hu_edi7f485337Community
l10n_latam_baseLATAM Localization BaseMerged into accountIdentification types became partner identifiers in Accounting.80c63e49Community
l10n_lk_invoiceSri Lanka - Tax InvoiceMerged into l10n_lkf2408c6fCommunity
l10n_mx_hr_payroll_account_ediMexico - Payroll CFDIMerged into l10n_mx_hr_payroll_accountEnterprise
l10n_mx_reports_closingMexico - Month 13 Trial BalanceMerged into l10n_mx_reportsEnterprise
l10n_mx_xml_polizasOdoo Mexican XML Polizas ExportMerged into l10n_mx_reportsEnterprise
l10n_nl_returnsNetherlands - Accounting ReturnsMerged into l10n_nl_reportsEnterprise
l10n_pl_bank_verificationPoland - Accounting - Bank Account VerificationMerged into l10n_plAdded to 19.0 after its release.Community
l10n_pl_reports_account_saftPoland - SAFT Income Tax Report (JPK KR PD)Merged into l10n_pl_reportsAdded to 19.0 after its release.Enterprise
l10n_pl_reports_jpk_faPoland - JPK FA ReportsMerged into l10n_pl_reportsEnterprise
l10n_pl_reports_vat_euPoland - VAT-UE ReportMerged into l10n_pl_reportsEnterprise
l10n_ro_cpv_codeRomania - CPV CodeMerged into l10n_ro_edi86f9ed8fCommunity
l10n_ro_edi_stock_batchRomania - E-Transport Batch PickingsMerged into l10n_ro_edi_stockBatch transfers are part of Inventory.78b5ef88Community
l10n_sa_withholding_taxSaudi Arabia - Withholding TaxMerged into l10n_sad5cf655aCommunity
l10n_se_returnsSweden - Accounting ReturnsMerged into l10n_se_reportsAdded to 19.0 after its release.Enterprise
l10n_tr_gib_invoice_scenariosTürkiye - Nilvera E-Invoice Commercial and ReturnMerged into l10n_tr_nilvera_einvoiceAdded to 19.0 after its release.Community
l10n_tr_nilvera_einvoice_extendedTürkiye - Nilvera E-Invoice ExtendedMerged into l10n_tr_nilvera_einvoicef5a2aed4Community
pos_restaurant_adyenPOS Restaurant AdyenMerged into pos_adyen and point_of_saleTips after payment are now a Point of Sale setting.b3df61e7Community
pos_restaurant_stripePOS Restaurant StripeMerged into pos_stripe and point_of_saleTips after payment are now a Point of Sale setting.3411f30fCommunity
pos_self_order_adyenPOS Self Order AdyenMerged into pos_adyenKiosks use the regular Adyen module.ef7b4e80Community
pos_self_order_stripePOS Self Order StripeMerged into pos_stripeKiosks use the regular Stripe module.44457bfdCommunity
pos_self_order_viva_comPOS Self Order Viva.comMerged into pos_viva_comAdded to 19.0 after its release.Community
pos_urban_piper_enhancementsPoint of Sale - UrbanPiper EnhancementsMerged into pos_urban_piperEnterprise
pos_urban_piper_ubereatsPOS UrbanPiper - Uber EatsMerged into pos_urban_piperEnterprise
quality_control_picking_batchQuality - Batch TransferMerged into quality_controlBatch transfers are part of Inventory.Enterprise
stock_barcode_picking_batchBarcode for Batch TransferMerged into stock_barcodeBatch transfers are part of Inventory.Enterprise
stock_barcode_quality_control_picking_batchBarcode/Quality/Batch Transfer bridge moduleMerged into stock_barcode_quality_controlBatch transfers are part of Inventory.Enterprise
stock_picking_batchWarehouse Management: Batch TransferMerged into stockBatch and wave transfers are part of Inventory.78b5ef88Community
website_sale_collect_wishlistCollect & WishlistMerged into website_sale_collecta2036bb4Community
website_sale_comparisonProduct ComparisonMerged into website_salefd61df26Community
website_sale_comparison_wishlistProduct Availability NotificationsMerged into website_sale19e434d6Community
website_sale_stock_wishlistProduct Availability NotificationsMerged into website_sale_stock90201d3cCommunity
website_sale_wishlistShopper's WishlistMerged into website_sale3c33c969Community
whatsapp_oauthWhatsApp OAuthMerged into whatsappEnterprise
l10n_tr_nilveraTürkiye - NilveraMoved now in EnterpriseCommunity
l10n_tr_nilvera_edispatchTürkiye - e-Irsaliye (e-Dispatch)Moved now in EnterpriseCommunity
l10n_tr_nilvera_einvoiceTürkiye - Nilvera E-InvoiceMoved now in EnterpriseCommunity
New modules in Odoo 20 · 231

Community · 51

  • account_payment_custom
  • base_report_paper_muncher
  • base_report_wkhtmltox
  • crm_sale_project
  • fleet_maintenance
  • hr_address_extended
  • hr_calendar_google
  • iot_webserial
  • l10n_be_pos
  • l10n_eg_edi_pos
  • l10n_es_website_sale
  • l10n_eu_account_vies
  • l10n_fr_payment
  • l10n_gr_edi_delivery_note
  • l10n_id_pos_self_order_qris
  • l10n_in_boe
  • l10n_kr_sale
  • l10n_mk
  • l10n_mm
  • l10n_ph_invoice
  • l10n_ph_sale
  • l10n_pk_edi
  • l10n_pk_edi_pos
  • l10n_tw_edi_ecpay_sale
  • l10n_vn_edi_viettel_stock
  • mail_tracking
  • mail_tracking_mass_mailing
  • mail_tracking_sms
  • marketing_card_event
  • mrp_delivery
  • mysubscription
  • populate
  • portal_discuss
  • pos_bancontact_pay
  • pos_partner_autocomplete
  • pos_sale_delivery
  • pos_sale_stock
  • pos_self_order_bancontact_pay
  • pos_self_order_event
  • pos_self_order_sms
  • pos_stock
  • pos_sumup
  • printer
  • purchase_alternative
  • purchase_alternative_sale
  • purchase_alternative_stock
  • sale_project_margin
  • website_address_autocomplete
  • website_mass_mailing_event
  • website_partnership
  • website_sale_project

Enterprise · 180

  • account_accountant_payment_interco
  • account_direct_debit
  • account_loans_extract
  • account_reports_spreadsheet
  • ai_account_reports
  • ai_agentic
  • ai_agentic_documents
  • ai_agentic_knowledge
  • ai_calendar
  • ai_cloud_storage
  • ai_documents_fleet
  • ai_esg
  • ai_helpdesk
  • ai_hr_recruitment_integration_website_livechat
  • ai_html_builder
  • ai_marketing_automation
  • ai_marketing_automation_crm
  • ai_marketing_automation_loyalty
  • ai_marketing_automation_sms
  • ai_marketing_automation_website_sale
  • ai_marketing_automation_whatsapp
  • ai_mass_mailing
  • ai_mcp
  • ai_portal
  • ai_product
  • ai_project
  • ai_purchase
  • ai_sale
  • ai_sale_margin
  • ai_sale_stock
  • ai_social
  • ai_stock
  • ai_timesheet_grid
  • ai_website_appointment_livechat
  • ai_website_appointment_sale
  • ai_website_blog_livechat
  • ai_website_event_livechat
  • ai_website_helpdesk
  • ai_website_sale
  • ai_website_sale_livechat
  • ai_website_sale_slides
  • ai_website_slides_livechat
  • data_merge_product
  • delivery_shipstation
  • documents_hr_recruitment
  • documents_hr_recruitment_sign
  • documents_hr_sign
  • documents_hr_skills
  • documents_l10n_ph_hr_payroll
  • documents_spreadsheet_sign
  • frontdesk_partnership
  • frontdesk_sms
  • frontdesk_whatsapp
  • helpdesk_planning_field_service
  • helpdesk_planning_field_service_sale_timesheet
  • helpdesk_timesheet_calendar
  • hr_attendance_biometric_integration
  • hr_attendance_essl
  • hr_attendance_mantra
  • hr_attendance_pos_hr_mobile_nfc
  • hr_attendance_zkteco
  • l10n_ae_hr_contract_salary
  • l10n_be_hr_payroll_belcotaxonweb_2
  • l10n_be_hr_payroll_expense
  • l10n_be_hr_payroll_sign
  • l10n_bg_intrastat
  • l10n_br_edi_extract
  • l10n_ci_edi
  • l10n_din5008_planning_field_service
  • l10n_do_edi
  • l10n_eg_hr_contract_salary
  • l10n_fr_account_loans
  • l10n_fr_reports_accountant_knowledge
  • l10n_gr_intrastat
  • l10n_gt_reports
  • l10n_hk_autopay
  • l10n_hk_payment_autopay
  • l10n_hu_intrastat
  • l10n_hu_reports_a60
  • l10n_in_hr_contract_salary
  • l10n_iq_hr_payroll
  • l10n_iq_hr_payroll_account
  • l10n_kw_hr_payroll
  • l10n_kw_hr_payroll_account
  • l10n_mk_reports
  • l10n_mt_intrastat
  • l10n_no_saft_import
  • l10n_om_hr_payroll
  • l10n_om_hr_payroll_account
  • l10n_pe_edi_withholding
  • l10n_ph_hr_payroll
  • l10n_ph_hr_payroll_account
  • l10n_ph_reports_asset
  • l10n_ph_reports_stock
  • l10n_ro_reports_d390
  • l10n_rs_intrastat
  • l10n_sa_hr_contract_salary
  • l10n_sa_hr_payroll_attendance
  • l10n_sa_hr_payroll_gosi
  • l10n_se_intrastat
  • l10n_tr_currency_live_rate
  • l10n_tr_nilvera_edispatch_quality
  • l10n_tr_nilvera_einvoice_subscription_sale
  • l10n_us_reports_avatax
  • l10n_uy_edi_pos
  • l10n_uz_hr_payroll
  • l10n_uz_hr_payroll_account
  • l10n_vn_hr_payroll
  • l10n_vn_hr_payroll_account
  • l10n_za_hr_payroll
  • l10n_za_hr_payroll_account
  • maintenance_enterprise
  • marketing_automation_loyalty
  • marketing_automation_website
  • mrp_iot
  • obox
  • obox_android
  • obox_mrp
  • obox_point_of_sale
  • obox_point_of_sale_android
  • obox_pos_mobile
  • obox_pos_self_order
  • obox_pos_self_order_android
  • obox_quality
  • obox_quality_android
  • obox_quality_control
  • obox_quality_control_android
  • planning_field_service
  • planning_field_service_hr_attendance
  • planning_field_service_repair
  • planning_field_service_sale_stock
  • planning_field_service_sale_subscription
  • planning_field_service_sale_timesheet
  • planning_field_service_sale_timesheet_barcodes
  • planning_field_service_sale_worksheet
  • planning_field_service_sms
  • planning_field_service_stock
  • planning_field_service_stock_subscription
  • planning_field_service_worksheet
  • planning_sale_subscription
  • pos_hr_mobile_nfc
  • pos_mobile_android
  • pos_planning
  • pos_sale_commission
  • pos_sale_planning
  • pos_sale_renting_planning
  • pos_self_order_mobile
  • pos_self_order_urban_piper
  • pos_stock_enterprise
  • pricer
  • project_enterprise_hr_todo
  • project_timesheet_forecast_field_service_sale
  • purchase_quality_control
  • quality_control_iot_webserial
  • sale_project_enterprise
  • sale_renting_loyalty
  • sale_renting_pdf_quote_builder
  • sale_subscription_loyalty
  • spreadsheet_dashboard_hr_appraisal
  • spreadsheet_dashboard_sale_timesheet_enterprise
  • spreadsheet_dashboard_voip
  • spreadsheet_edition_account
  • stock_barcode_barcodelookup_product_expiry
  • stock_barcode_fleet
  • stock_intrastat_pos
  • stock_intrastat_purchase_stock
  • stock_intrastat_sale_stock
  • stock_pricer
  • timesheet_grid_calendar
  • timesheet_grid_hr_attendance
  • voip_cloud_storage_google
  • voip_project
  • voip_sale
  • website_generator_blog
  • website_planning_field_service
  • website_sale_collect_renting
  • website_sale_enterprise
  • whatsapp_crm
  • whatsapp_planning
  • whatsapp_pos_self_order

From the module lists of both branches. Community commits link to the change that removed the module; Enterprise code is private, so we only name its modules.

Breaking: action required · 3

Custom modules or integrations need a change before or during the upgrade.

Removed · 1

Features or code that no longer exist.

Removedhtml_editor, website · 20.0PR #282438 ↗6bef39c4 ↗

Dead YouTube editor plugin removed

YoutubePlugin was never registered and called a route that does not exist. Pasting a YouTube URL still works through VideoPlugin. Remove any custom code that imports YoutubePlugin or YOUTUBE_URL_GET_VIDEO_ID.

Flagged in the weekly digest · 4

My stack

Pick the versions and apps you run. Weekly digests, this week's table and All changes then show only what concerns you. Saved in this browser.

Versions
Apps
Modules