Upgrading Odoo 18 to Odoo 19

What changes between Odoo 18 and Odoo 19 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 · 22

13 breaking, 9 deprecated but still working in 19.0. Started from OCA's migration guides; we checked each one in the Odoo code.

BreakingRemoved in 19.0

Remove @api.returns

The decorator no longer exists, so the module fails to import. RPC now returns recordsets as lists of ids by itself.

Before
@api.returns('self', lambda value: value.id)
def copy(self, default=None):
After
def copy(self, default=None):

Checked in: 18.0/odoo/api.py:359, 19.0/odoo/service/model.py:103 · Odoo: #182709

BreakingRemoved in 19.0

Rename the field parameter auto_join to bypass_search_access

auto_join=True is ignored from 19.0 (only an "unknown parameter" warning), so searches through the field lose the behaviour without an error.

Before
partner_id = fields.Many2one('res.partner', auto_join=True)
After
partner_id = fields.Many2one('res.partner', bypass_search_access=True)

Checked in: 18.0/odoo/fields.py:3233, 19.0/odoo/orm/fields_relational.py:39 · Odoo: #219627

BreakingOld code works differently from 19.0

Create test data in the tests

New databases no longer get demo data unless created with --with-demo, so tests that rely on env.ref() of demo records fail.

Before
partner = self.env.ref('base.res_partner_2')
After
partner = self.env['res.partner'].create({'name': 'Test partner'})

Checked in: 18.0/odoo/tools/config.py:114, 19.0/odoo/tools/config.py:233

BreakingRemoved in 19.0

Register fake test models with add_to_registry

The ORM hooks odoo-test-helper relied on are gone. Register the model with odoo.orm.model_classes.add_to_registry, set it up, and clean it up after the class.

Before
loader = FakeModelLoader(cls.env, cls.__module__)
loader.backup_registry()
loader.update_registry((FakeModel,))
After
add_to_registry(cls.registry, FakeModel)
cls.registry._setup_models__(cls.env.cr, ['fake.model'])
cls.registry.init_models(cls.env.cr, ['fake.model'], {'models_to_check': True})
cls.addClassCleanup(cls.registry.__delitem__, 'fake.model')

Checked in: 19.0/odoo/orm/model_classes.py:152

BreakingRemoved in 19.0

Rename groups_id to group_ids

On users, views, menus, actions, reports and website page properties the field is now group_ids, with no alias. Update Python, XML data, view arches and domains.

Before
<field name="groups_id" eval="[(4, ref('base.group_user'))]"/>
self.env.user.groups_id
After
<field name="group_ids" eval="[Command.link(ref('base.group_user'))]"/>
self.env.user.group_ids

Checked in: 18.0/odoo/addons/base/models/ir_ui_view.py:179, 19.0/odoo/addons/base/models/ir_ui_view.py:175, 19.0/odoo/addons/base/models/res_users.py:257 · Odoo: #179354

BreakingRemoved in 19.0

Point groups to a privilege instead of a category

res.groups lost its category_id. Create a res.groups.privilege record, which carries the module category, and set privilege_id on your groups.

Before
<record id="group_x" model="res.groups">
  <field name="category_id" ref="base.module_category_sales"/>
</record>
After
<record id="privilege_x" model="res.groups.privilege">
  <field name="name">My app</field>
  <field name="category_id" ref="base.module_category_sales"/>
</record>
<record id="group_x" model="res.groups">
  <field name="privilege_id" ref="privilege_x"/>
</record>

Checked in: 18.0/odoo/addons/base/models/res_users.py:191, 19.0/odoo/addons/base/models/res_groups.py:36, 19.0/odoo/addons/base/models/res_groups_privilege.py:13 · Odoo: 33637d13

BreakingDeprecated in 18.0, removed in 19.0

Rewrite kanban views with a card template

kanban-box still renders in 18.0 with a console warning; 19.0 requires a card template and raises without one. Inside card, fields are plain <field> elements, no wrapping divs; kanban-tooltip is gone, and the color picker is <field name="color" widget="kanban_color_picker"/>.

Before
<templates>
  <t t-name="kanban-box">
    <div class="oe_kanban_global_click">
      <strong><field name="name"/></strong>
      <ul class="oe_kanban_colorpicker" data-field="color"/>
    </div>
  </t>
</templates>
After
<templates>
  <t t-name="card">
    <field name="name" class="fw-bold"/>
    <field name="color" widget="kanban_color_picker"/>
  </t>
</templates>

Checked in: 18.0/addons/web/static/src/views/kanban/kanban_arch_parser.js:153, 19.0/addons/web/static/src/views/kanban/kanban_arch_parser.js:140 · Odoo: #167751

BreakingRemoved in 19.0

Rename name_search args to domain in overrides

Callers now pass domain= as a keyword, so an override that still names it args raises TypeError.

Before
def name_search(self, name='', args=None, operator='ilike', limit=100):
After
def name_search(self, name='', domain=None, operator='ilike', limit=100):

Checked in: 18.0/odoo/models.py:1885, 19.0/odoo/orm/models.py:1527 · Odoo: e35bceda

BreakingDeprecated in 18.0, removed in 19.0

Import Registry from odoo.modules.registry

odoo.registry() logs a deprecation warning in 18.0. In 19.0 the odoo package no longer has it, so the import fails.

Before
from odoo import registry
with registry(db_name).cursor() as cr: ...
After
from odoo.modules.registry import Registry
with Registry(db_name).cursor() as cr: ...

Checked in: 17.0/odoo/__init__.py:97, 18.0/odoo/__init__.py:37, 19.0/odoo/init.py · Odoo: #178784

BreakingRemoved in 19.0

Drop string and expand from <group> in search views

The view schema rejects them, so the module fails to install or update. Check inherited views too.

Before
<group expand="0" string="Group By">
After
<group>

Checked in: 19.0/odoo/addons/base/rng/common.rng:295 · Odoo: #220023

BreakingOld code works differently from 19.0

Handle optimized operators in search methods

Search methods of computed fields no longer receive '=' or '!=': the domain optimizer turns them into 'in' and 'not in' with a set, e.g. ('flag', '=', True) arrives as 'in', {True}. Returning a list still works; returning a Domain is optional.

Before
def _search_is_late(self, operator, value):
    if operator == '=' and value:
        return [('date_deadline', '<', fields.Date.today())]
After
def _search_is_late(self, operator, value):
    if operator != 'in':
        return NotImplemented
    return Domain('date_deadline', '<', fields.Date.today())

Checked in: 19.0/odoo/orm/fields.py:145, 19.0/odoo/orm/domains.py:1298 · Odoo: 4f0d4670

BreakingRemoved in 19.0

Declare constraints with models.Constraint and models.Index

_sql_constraints is ignored from 19.0: only a warning is logged, and the constraint is silently not created. Declare each one as a class attribute; the database name is the table plus the attribute name.

Before
_sql_constraints = [
    ('name_uniq', 'unique(name)', 'Name must be unique'),
]
After
_name_uniq = models.Constraint('UNIQUE(name)', 'Name must be unique')
_partner_date_idx = models.Index('(partner_id, date)')

Checked in: 19.0/odoo/orm/model_classes.py:162, 19.0/odoo/orm/table_objects.py:79 · Odoo: #175783

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

Heads-upDeprecated 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

Heads-upOptional since 19.0, the old way still works

Write relative dates in domains

Domain values on date fields can be relative strings such as 'today -7d'. Optional: context_today() expressions still work.

Before
[('date', '>=', (context_today() - relativedelta(days=7)).strftime('%Y-%m-%d'))]
After
[('date', '>=', 'today -7d')]

Checked in: 19.0/odoo/tools/date_utils.py:116, 19.0/odoo/orm/domains.py:1554 · Odoo: #216665

Heads-upDeprecated in 19.0, still works

Use self.env.cr, env.uid and env.context

self._cr, self._uid and self._context still work in 20.0 but log a deprecation warning. Replace them now; it is a safe search and replace.

Before
self._cr.execute(query)
lang = self._context.get('lang')
After
self.env.cr.execute(query)
lang = self.env.context.get('lang')

Checked in: 19.0/odoo/orm/models.py:5931, 20.0/odoo/orm/models.py:5395

Heads-upRemoved 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

Heads-upDeprecated in 19.0, still works

Use @route(type="jsonrpc") instead of type="json"

type="json" is still mapped to jsonrpc in 20.0, with a deprecation warning. Switch when the module no longer has to run on 18.0.

Before
@http.route('/my/endpoint', type='json', auth='user')
After
@http.route('/my/endpoint', type='jsonrpc', auth='user')

Checked in: 19.0/odoo/http.py:813, 20.0/odoo/http/routing_map.py:189 · Odoo: #183636

Heads-upDeprecated 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

Heads-upDeprecated 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

Heads-upOptional since 19.0, the old way still works

Import SUPERUSER_ID from odoo.api

odoo.SUPERUSER_ID still works in 20.0 without a warning, but it is a shortcut meant to go now that odoo is a namespace package.

Before
from odoo import SUPERUSER_ID
After
from odoo.api import SUPERUSER_ID

Checked in: 19.0/odoo/api/__init__.py:19, 20.0/odoo/init.py:47 · Odoo: d6a955f1

Heads-upOptional since 19.0, the old way still works

Use odoo.tools.urls.urljoin

Recommended, not required. The helper keeps the base URL's host and refuses an absolute or '..' second part, so check calls that join absolute URLs.

Before
from urllib.parse import urljoin
url = urljoin(base_url, '/web/image')
After
from odoo.tools.urls import urljoin
url = urljoin(base_url, 'web/image')

Checked in: 19.0/odoo/tools/urls.py:13 · Odoo: 977e62d9

Modules removed or renamed · 102

23 removed, 8 replaced, 17 renamed, 54 merged. If a custom module depends on one of these, change its depends before you upgrade.

ModuleIn Odoo 19Edition
account_no_followupAccount No FollowupRemovedAdded to 18.0 after its release; not in 19.0.Enterprise
documents_hr_recruitmentDocuments - RecruitmentRemovedRecruitment documents are no longer managed in Documents.Enterprise
hr_contract_reportsEmployee Contracts ReportingRemovedPart of the contracts-to-employee-versions change.Enterprise
l10n_ch_hr_payroll_elm_transmissionSwissdec Certified Payroll (ELM 5.0)RemovedPart of the contracts-to-employee-versions change.Enterprise
l10n_ch_hr_payroll_elm_transmission_accountSwitzerland - Payroll with AccountingRemovedPart of the contracts-to-employee-versions change.Enterprise
l10n_co_edi_website_saleE-Commerce Colombian LocalizationRemovedAddress handling moved to the portal.Enterprise
l10n_ee_roundingEstonia - RoundingRemovedAdded to 18.0 after its release; not in 19.0.Enterprise
l10n_in_documentsIndia - DocumentsRemovedEnterprise
l10n_in_ewaybill_portIndian - Shipping Ports for E-waybillRemovedAdded to 18.0 after its release; not in 19.0.Community
l10n_in_purchaseIndian - Purchase Report(GST)RemovedThe GST treatment field went with it.c2540a9aCommunity
l10n_mx_hrEmployees - MexicoRemovedRemoved when payslip CFDI was added to Mexican payroll.74725675Community
l10n_uy_website_saleUruguay WebsiteRemovedAdded to 18.0 after its release; not in 19.0. Address handling moved to the portal.Community
pos_no_followupPOS No FollowupRemovedAdded to 18.0 after its release; not in 19.0.Enterprise
pos_paytmPOS PayTMRemovedPayTM terminals are no longer supported.eb906879Community
product_imagesProduct ImagesRemovedFetching product images from Barcode Lookup is gone.7e708422Community
sale_renting_signRental/Sign BridgeRemovedRental and Sign integration dropped.Enterprise
spreadsheet_dashboard_hr_contractSpreadsheet dashboard for human resourcesRemovedPart of the contracts-to-employee-versions change.Enterprise
website_event_jitsiEvent / JitsiRemovedJitsi integration dropped.9cab4f8fCommunity
website_event_meetEvent Meeting / RoomsRemovedJitsi integration dropped.9cab4f8fCommunity
website_event_meet_quizQuiz and Meet on communityRemovedJitsi integration dropped.9cab4f8fCommunity
website_jitsiWebsite JitsiRemovedJitsi integration dropped.9cab4f8fCommunity
website_payment_authorizeWebsite - Payment AuthorizeRemovedRemoved when the website settings were reorganised.b798db1bCommunity
website_sale_shiprocketShiprocket: Cash on DeliveryRemovedCash on delivery became a generic shipping option.Enterprise
l10n_be_reports_post_wizardBelgium - Accounting Reports (post wizard)ReplacedTax closing became Accounting Returns.Enterprise
l10n_nl_reports_vat_pay_wizardNetherlands - Accounting Reports (post wizard)ReplacedTax closing became Accounting Returns.Enterprise
membershipMembersReplaced by partnershipThe Membership app is gone; partnership grades in CRM and Sales replace it.b09d9a39Community
pos_sixPOS SixReplaced by pos_iot_sixIt no longer worked since Odoo 17.ca3deb56Community
pos_urban_piper_swiggyPOS UrbanPiper - SwiggyReplaced by l10n_in_pos_urban_piperEnterprise
pos_urban_piper_zomatoPOS UrbanPiper - ZomatoReplaced by l10n_in_pos_urban_piperEnterprise
web_editorWeb EditorReplaced by html_editor and html_builderCustom code that extends web_editor must move to the new editor.f2ca3220Community
website_membershipOnline Members DirectoryReplaced by partnershipRemoved with the Membership app.b09d9a39Community
account_auto_transferAccount Automatic TransfersRenamed to account_transferAutomatic transfers were reworked.Enterprise
account_disallowed_expensesDisallowed ExpensesRenamed to account_fiscal_categoriesEnterprise
account_disallowed_expenses_fleetDisallowed Expenses on FleetsRenamed to account_fiscal_categories_fleetEnterprise
base_automation_hr_contractAutomation Rules based on Employee ContractsRenamed to base_automation_hrPart of the contracts-to-employee-versions change.Enterprise
hr_contract_signContract - SignatureRenamed to hr_signPart of the contracts-to-employee-versions change.Enterprise
hr_work_entry_contract_attendanceWork Entries - AttendanceRenamed to hr_work_entry_attendancePart of the contracts-to-employee-versions change.Enterprise
hr_work_entry_contract_enterpriseWork Entries - Contract EnterpriseRenamed to hr_work_entry_enterprisePart of the contracts-to-employee-versions change.Enterprise
hr_work_entry_contract_planningWork Entries - PlanningRenamed to hr_work_entry_planningPart of the contracts-to-employee-versions change.Enterprise
hr_work_entry_contract_planning_attendanceAttendances - PlanningRenamed to hr_work_entry_planning_attendancePart of the contracts-to-employee-versions change.Enterprise
l10n_be_account_disallowed_expenses_fleetBelgium - Disallowed Expenses FleetRenamed to l10n_be_fiscal_categories_fleetEnterprise
l10n_be_disallowed_expensesBelgium - Disallowed Expenses DataRenamed to l10n_be_fiscal_categoriesEnterprise
l10n_ec_website_saleEcuadorian WebsiteRenamed to l10n_ec_saleAddress handling moved to the portal; most eCommerce localizations were dropped.3958956fCommunity
l10n_in_edi_ewaybillIndian - E-waybillRenamed to l10n_in_ewaybillThe e-way bill no longer depends on e-invoicing; the IRN part is in l10n_in_ewaybill_irn.ce313d87Community
l10n_in_reports_gstrIndian - GSTR India eFilingRenamed to l10n_in_edi_gstrEnterprise
pos_l10n_seSweden Registered Cash RegisterRenamed to l10n_se_posEnterprise
pos_viva_walletPOS Viva WalletRenamed to pos_viva_com6df4dbc6Community
project_enterprise_hr_contractProject Enterprise HR contractRenamed to project_enterprise_hrPart of the contracts-to-employee-versions change.Enterprise
account_edi_ubl_cii_tax_extensionTax extension for UBL/CIIMerged into account_edi_ubl_cii7f85a4c6Community
account_intrastat_servicesIntrastat Reports for ServicesMerged into account_intrastatAdded to 18.0 after its release.Enterprise
account_peppol_selfbillingPeppol Self BillingMerged into account_edi_ubl_ciiAdded to 18.0 after its release.Community
auth_totp_mail_enforce2FA by mailMerged into auth_totp_mail37f4edf0Community
documents_hr_contractDocuments - ContractsMerged into documents_hrPart of the contracts-to-employee-versions change.Enterprise
hr_appraisal_contractAppraisal ContractMerged into hr_appraisalPart of the contracts-to-employee-versions change.Enterprise
hr_contractEmployee ContractsMerged into hrContracts became versions of the employee record: hr.contract is gone.21f18b1aCommunity
hr_holidays_contractHr Holidays ContractMerged into hr_holidaysPart of the contracts-to-employee-versions change.21f18b1aCommunity
hr_holidays_contract_ganttTime off - Contract GanttMerged into hr_holidays_ganttPart of the contracts-to-employee-versions change.Enterprise
hr_work_entry_contractWork Entries - ContractMerged into hr_work_entryPart of the contracts-to-employee-versions change.21f18b1aCommunity
l10n_ae_corporate_tax_reportUnited Arab Emirates - Corporate Tax ReportMerged into l10n_ae_reportsEnterprise
l10n_be_hr_contract_salary_mobility_budgetSalary Configurator (Belgium) - Mobility BudgetMerged into l10n_be_hr_contract_salaryEnterprise
l10n_be_hr_payroll_dmfa_sftpBelgium - Payroll - DmfA SFTPMerged into l10n_be_hr_payrollEnterprise
l10n_be_intrastat_servicesBelgian Intrastat Declaration (Services)Merged into l10n_be_intrastatAdded to 18.0 after its release.Enterprise
l10n_be_reports_prorataBelgium - Accounting Reports - Prorata DeductionMerged into l10n_be_reportsEnterprise
l10n_cz_reports_2025Czech Republic - Accounting Reports 2025Merged into l10n_cz_reportsAdded to 18.0 after its release.Enterprise
l10n_dk_rsuDenmark - RSUMerged into l10n_dk_reportsEnterprise
l10n_es_modelo130Spain - Modelo 130 Tax reportMerged into l10n_es5dab717dCommunity
l10n_es_reports_modelo130Spain - Modelo 130Merged into l10n_es_reportsEnterprise
l10n_fr_intrastat_servicesFrench Intrastat Declaration (Services)Merged into l10n_fr_intrastatAdded to 18.0 after its release.Enterprise
l10n_id_efakturIndonesia E-fakturMerged into l10n_id_efaktur_coretax6b33864bCommunity
l10n_in_enet_batch_paymentIndia ENet Batch Payment CSV GeneratorMerged into l10n_in_reportsEnterprise
l10n_in_gstin_statusIndian - Check GST Number StatusMerged into l10n_in0b49f819Community
l10n_in_qr_code_bill_scanScan Vendor bills QRcode(India)Merged into l10n_in_reportsEnterprise
l10n_in_reports_gstr_document_summaryIndian - GSTR Document SummaryMerged into l10n_in_reportsEnterprise
l10n_in_reports_gstr_spreadsheetSpreadsheet document for GSTR1 ReportMerged into l10n_in_edi_gstrEnterprise
l10n_in_reports_tds_tcsIndian - TDS TCS ReportsMerged into l10n_in_reportsEnterprise
l10n_in_withholdingIndian - TDS and TCSMerged into l10n_in0b49f819Community
l10n_in_withholding_paymentIndian - TDS For PaymentMerged into l10n_in11c186efCommunity
l10n_it_edi_nddItaly - E-invoicing - Additional module to support the debit notes (nota di debito - NDD)Merged into l10n_it_edidc0ab074Community
l10n_it_edi_ndd_account_dnItaly - E-invoicing - Bridge module between Italy NDD and Account Debit NoteMerged into l10n_it_edi431b9a25Community
l10n_it_edi_website_saleItaly eCommerce eInvoicingMerged into l10n_it_ediAddress handling moved to the portal.3958956fCommunity
l10n_it_edi_withholdingItaly - E-invoicing (Withholding)Merged into l10n_it_edie1e10281Community
l10n_it_xml_exportItaly - Tax Report XML ExportMerged into l10n_it_reportsThe export moved into the tax report.Enterprise
l10n_jo_edi_extendedJordan E-Invoicing Extended FeaturesMerged into l10n_jo_ediAdded to 18.0 after its release.Community
l10n_ke_hr_payroll_shifKenya - Payroll SHIFMerged into l10n_ke_hr_payrollSHIF replaces NHIF.Enterprise
l10n_mx_hr_payroll_localisationMexico - Payroll - LocalisationMerged into l10n_mx_hr_payrollEnterprise
l10n_my_edi_extendedMalaysia - E-invoicing Extended FeaturesMerged into l10n_my_edi9ab5acddCommunity
l10n_nl_reports_sbrNetherlands - SBRMerged into l10n_nl_reportsEnterprise
l10n_nl_reports_sbr_icpNetherlands - SBR ICPMerged into l10n_nl_reportsEnterprise
l10n_nl_reports_sbr_ob_nummerNetherlands - SBR OB NummerMerged into l10n_nl_reportsEnterprise
l10n_nl_reports_sbr_status_infoNetherlands - SBR Status information serviceMerged into l10n_nl_reportsEnterprise
l10n_pe_website_salePeruvian eCommerceMerged into l10n_peAddress handling moved to the portal.3958956fCommunity
l10n_pl_taxable_supply_datePoland - Taxable Supply DateMerged into account and l10n_plThe taxable supply date is now a field in Accounting.4db24942Community
l10n_ro_efactura_synchronizeRomania - Synchronize E-FacturaMerged into l10n_ro_ediAdded to 18.0 after its release.Community
l10n_us_hr_payroll_state_calculationUnited States - Payroll - State CalculationMerged into l10n_us_hr_payrollEnterprise
payment_razorpay_oauthRazorpay OAuth IntegrationMerged into payment_razorpayadcf1166Community
planning_contractPlanning ContractMerged into planningPart of the contracts-to-employee-versions change.Enterprise
pos_epson_printerPOS Epson PrinterMerged into point_of_sale8a0ab8c0Community
pos_hr_preparation_displayPoS Preparation Display HRMerged into pos_enterpriseEnterprise
pos_preparation_displayPoS Preparation DisplayMerged into pos_enterpriseEnterprise
pos_self_order_epson_printerPOS Self Order Epson PrinterMerged into pos_self_order8a0ab8c0Community
sale_amazon_channel_managementAmazon Connector Channel ManagementMerged into sale_amazonAdded to 18.0 after its release.Enterprise
sale_async_emailsSales - Async EmailsMerged into sale156bc1b1Community
New modules in Odoo 19 · 220

Community · 56

Enterprise · 164

  • account_budget_purchase
  • account_fiscal_categories
  • account_fiscal_categories_fleet
  • account_iso20022_account_accountant
  • account_transfer
  • accountant_fleet
  • accountant_hr_expense
  • accountant_knowledge
  • ai
  • ai_account
  • ai_app
  • ai_auto_install
  • ai_crm
  • ai_crm_livechat
  • ai_documents
  • ai_documents_account
  • ai_documents_source
  • ai_fields
  • ai_knowledge
  • ai_livechat
  • ai_server_actions
  • ai_website
  • ai_website_livechat
  • base_automation_hr
  • databases
  • databases_auth
  • documents_l10n_mx_hr_payroll_account_edi
  • documents_spreadsheet_survey
  • equity
  • esg
  • esg_csrd
  • esg_csrd_ai
  • esg_csrd_hr
  • esg_csrd_hr_fleet
  • esg_hr
  • esg_hr_fleet
  • esg_project
  • event_iot
  • event_sale_iot
  • hr_expense_stripe
  • hr_expense_stripe_demo
  • hr_payroll_sale_commission
  • hr_recruitment_ai
  • hr_sign
  • hr_work_entry_attendance
  • hr_work_entry_enterprise
  • hr_work_entry_planning
  • hr_work_entry_planning_attendance
  • l10n_ae_faf
  • l10n_ar_reports_simple
  • l10n_at_intrastat
  • l10n_at_pos
  • l10n_au_hr_payroll_api
  • l10n_be_coda_extension_number
  • l10n_be_fiscal_categories
  • l10n_be_fiscal_categories_fleet
  • l10n_be_hr_payroll_dimona_auto
  • l10n_be_hr_payroll_fix
  • l10n_be_intervat
  • l10n_be_pos_blackbox
  • l10n_be_pos_blackbox_hr
  • l10n_be_pos_blackbox_hr_pos_blackbox_be
  • l10n_be_pos_blackbox_loyalty
  • l10n_be_pos_blackbox_pos_blackbox_be
  • l10n_be_pos_blackbox_self_order
  • l10n_be_pos_blackbox_settle_due
  • l10n_be_pos_blackbox_urban_piper
  • l10n_be_reports_client_nihil
  • l10n_be_reports_hr_payroll
  • l10n_be_reports_vat_comment
  • l10n_bf_reports
  • l10n_bg_saft
  • l10n_bh_reports
  • l10n_bj_reports
  • l10n_br_edi_pos_fiscal_reform
  • l10n_cd_reports
  • l10n_cf_reports
  • l10n_cg_reports
  • l10n_ci_reports
  • l10n_cl_reports_f29
  • l10n_cm_reports
  • l10n_cz_intrastat
  • l10n_de_reports_elster
  • l10n_eg_iot
  • l10n_eg_reports
  • l10n_es_intrastat
  • l10n_es_reports_2025
  • l10n_et_reports
  • l10n_fi_intrastat
  • l10n_ga_reports
  • l10n_gn_reports
  • l10n_gq_reports
  • l10n_gt_edi_pos
  • l10n_gw_reports
  • l10n_hk_hr_payroll_empf
  • l10n_hr_intrastat
  • l10n_hr_kuna_reports
  • l10n_id_reports
  • l10n_ie_intrastat
  • l10n_il_reports
  • l10n_in_edi_gstr
  • l10n_in_pos_urban_piper
  • l10n_it_hr_payroll_sd_worx
  • l10n_it_intrastat
  • l10n_jo_reports
  • l10n_jp_reports
  • l10n_km_reports
  • l10n_lk_reports
  • l10n_ml_reports
  • l10n_mu_reports
  • l10n_mx_hr_payroll_account_edi
  • l10n_ne_reports
  • l10n_nl_returns
  • l10n_om_reports
  • l10n_pe_reports_stock_landed_costs
  • l10n_pl_intrastat
  • l10n_pt_intrastat
  • l10n_ro_intrastat
  • l10n_ro_reports_d300
  • l10n_sa_reports
  • l10n_se_pos
  • l10n_se_returns
  • l10n_si_intrastat
  • l10n_sk_reports
  • l10n_sn_reports
  • l10n_td_reports
  • l10n_tg_reports
  • l10n_ug_reports
  • l10n_uk_intrastat
  • l10n_us_direct_deposit
  • l10n_uy_reports
  • l10n_uz_reports
  • l10n_za_reports
  • planning_attendance
  • pos_appointment
  • pos_enterprise_sms_whatsapp
  • pos_event_iot
  • pos_iot_adam_scale
  • pos_iot_ingenico
  • pos_iot_worldline
  • pos_platform_order
  • pos_platform_order_gofood
  • pos_platform_order_grabfood
  • purchase_accountant
  • sale_enterprise
  • sale_lazada
  • sale_renting_intrastat
  • sale_subscription_partnership
  • sale_tiktok
  • sign_ai
  • sign_emsigner
  • voip_ai
  • voip_helpdesk
  • voip_hr
  • voip_hr_recruitment
  • voip_sale_subscription
  • voip_sms
  • web_studio_ai_fields
  • website_sale_renting_planning
  • whatsapp_account_followup
  • whatsapp_calendar
  • whatsapp_oauth
  • whatsapp_sign
  • whatsapp_stock

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 · 1

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

Heads-up · 4

Behaviour changes to check in testing. Usually nothing to change.

Flagged in the weekly digest · 5

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