Migrate Odoo 18 to 19

Last updated: October 2026

Migrating Odoo Community Edition from version 18 to 19 involves 129 models added or removed, 25 module merges, and 43 field renames. OCU automates this entire process — upload your database backup and download a production-ready database running Odoo 19.

New to Odoo upgrades? Start with our guide on how to upgrade Odoo Community Edition, which covers the options, the preparation and the steps that apply to every version.

What changes

Between Odoo 18 and 19, the following major changes occur: 15 model renames, 207 constraint changes, and 43 field renames, alongside the 129 models added or removed.

Counted from the Odoo source of each version and from the OCU migration mappings, step by step; Odoo’s internal test modules are left out because they never exist in a production database. Multi-step paths add up their steps.

  • Employee contracts become versions. hr_contract merges into hr and hr.contract is renamed hr.version. In Odoo 19 an employee reads most of its HR data from its current version record, so every employee needs one and work entries point at versions instead of contracts.
  • Units of measure lose their categories. uom.category is gone. Each unit now points at a reference unit with a relative factor, and product packagings (product.packaging) become units of measure (product.uom).
  • Access groups are restructured. groups_id becomes group_ids on users, window, server and report actions, views and menus; res.groups.users becomes user_ids; group categories give way to privileges. Record rules, filters and server action code that mention the old names break.
  • Inventory references, packages and valuation. procurement.group becomes stock.reference, stock.quant.package becomes stock.package, and stock.valuation.layer becomes product.value under a redesigned valuation model.
  • Models that disappear. Quotation options (sale.order.option), expense reports (hr.expense.sheet), fiscal position tax mappings (account.fiscal.position.tax) and partner titles are removed. Their data has to be converted into the new structures, not just carried over.

What changes in detail

Here is a detailed breakdown of the structural changes between Odoo 18 and 19:

Module changes

  • 5 module renames. web_editor becomes html_builder, membership becomes partnership, pos_viva_wallet becomes pos_viva_com, l10n_in_edi_ewaybill becomes l10n_in_ewaybill and l10n_ec_website_sale becomes l10n_ec_sale.
  • 25 modules merged into others. hr_contract into hr, hr_holidays_contract into hr_holidays, hr_work_entry_contract into hr_work_entry, pos_epson_printer into point_of_sale, sale_async_emails into sale, website_membership into website_crm_partner_assign, plus a series of localization and e-invoicing sub-modules into their parents.

Model renames

  • 15 business model renames. hr.contract to hr.version, hr.candidate.skill to hr.applicant.skill, hr.attendance.overtime to hr.attendance.overtime.line, procurement.group to stock.reference, stock.quant.package to stock.package, stock.package_level to stock.package.history, stock.valuation.layer to product.value, product.packaging to product.uom, mrp.batch.produce to mrp.production.serials, mail.wizard.invite to mail.followers.edit, bus.presence to mail.presence, web_editor.assets to website.assets, and three smaller technical models. hr.candidate is merged back into hr.applicant.
  • Why other sources say 130. A source-code comparison finds 131 renamed models, but 116 of them are Odoo’s internal test models (test_new_api became test_orm). Those never exist in a production database.

Field renames

  • groups_id becomes group_ids. On res.users, ir.actions.act_window, ir.actions.server, ir.actions.report, ir.ui.view and ir.ui.menu. The relation tables stay the same; the field name in domains, filters and code changes.
  • Order line fields. sale.order.line.tax_id and purchase.order.line.taxes_id both become tax_ids; product_uom becomes product_uom_id on sale, purchase, supplier info and milestone lines; purchase.order.notes becomes note.
  • 43 field renames in total. Including hr.employee.gender to sex (now on the version), hr.work.entry.contract_id to version_id, stock.move.line.package_level_id to package_history_id, res.company.check_account_audit_trail to restrictive_audit_trail, and the Viva Wallet payment method fields to Viva.com.

Schema and constraints

  • 207 constraint changes. 98 constraints added, 80 removed and 29 changed, counting Python constraints, SQL constraints and the new models.Constraint declarations. New ones include unique uuid columns on POS orders, order lines and payments, and checks on mail activities and accrual levels. Data is checked against the new rules before they apply.
  • Translatable flag becomes a selection. ir_model_fields.translate changes from a boolean to a selection (standard, html_translate, xml_translate). Odoo 19 reads this column before any migration script runs, so it has to be converted before Odoo starts.
  • 71 new models, 58 removed. Outside the test modules. Among the removed ones: uom.category, sale.order.option, hr.expense.sheet, account.fiscal.position.tax, res.partner.title, stock.valuation.layer (renamed) and hr.contract.history.

Breaking changes for custom code

  • Anything using groups_id. Python code, XML views and domains that read user.groups_id or write groups_id on actions and menus fail in Odoo 19 with "Invalid field" or missing attribute errors.
  • Anything using hr.contract, uom.category or product.packaging. Custom modules that inherit or reference these models need porting. The data is migrated, the old model names no longer exist.
  • web_editor templates. Views inheriting web_editor templates must point at html_builder. Three snippet views (website.snippets, mass_mailing.email_designer_snippets, mass_mailing.s_hr) change from inherited to standalone views.

What breaks between Odoo 18 and 19, by area

The 18 to 19 step in OCU runs 77 hand-written migration steps across 25 modules on top of the generated renames and merges, nearly twice as many as the 17 to 18 step (39). This is where they go:

  • Users and access rights. Group fields are renamed (groups_id to group_ids, users to user_ids) and group categories are replaced by privileges. OCU renames the fields, rewrites the old names in record rules, saved filters, window action domains and server action code, and converts categories to privileges. Custom Python code still needs your update.
  • Employees and HR. Contracts become versions. OCU renames the contract data to hr.version, creates a version for every employee that has none so employees keep their job, department and wage data visible, moves gender to the new sex field, carries the employee timezone into work entry dates, and fixes overlapping contract dates.
  • Units of measure and packaging. The category structure is converted into the new tree of units with relative factors, packagings become units (product.uom) with their quantities, and stock moves keep their packaging unit.
  • Inventory and valuation. Procurement groups become stock references and keep their links to moves, sales, purchases and POS orders. Packages and package levels are renamed. The old valuation layers become product.value records with their dates, users and journal entry links, and company valuation accounts and journals are carried over. The removed "manual_periodic" valuation option is mapped to "periodic".
  • Sales, purchase and POS. Quotation options are converted into optional lines on the quotation, down-payment accounts move to the company, done purchase orders become locked orders, and every POS configuration gets the sequences Odoo 19 expects for orders.
  • Accounting. Fiscal position tax mappings move to the new many-to-many structure, deprecated accounts become archived accounts, partner mappings on reconciliation models become regex rules, and the auto-reconcile flag maps to the new trigger field.
  • Expenses, CRM and other apps. Expense reports are removed: their approval data and journal entries move onto the expenses. Lead mobile numbers are kept in the phone field. Project rating settings move to task stages. Stored mail alias addresses are recomputed before CRM loads (see the TypeError below).
  • Website and editor. web_editor is renamed html_builder. Snippet views that became standalone are detached from their old parents first, so removing the old module data does not delete them, and product snippets that used removed templates are pointed at the surviving one.

How long an 18 to 19 migration takes

Time grows with database size and the number of installed modules. As a reference from real runs: an 18 to 19 database with about 950,000 HR work entries completed the upgrade in roughly five minutes, and a 1 GB database went through all three steps from 16 to 19 in about 17 minutes.

After the Odoo upgrade itself, OCU recomputes the stored fields that depend on data its scripts changed. That phase is capped at 10 minutes per step; anything it cannot reach is listed as a warning instead of holding up the run.

The test migration report shows the exact duration for your database. Use it to size the maintenance window for the production run, and add the time to restore the result on your Odoo 19 server.

What the test migration report shows

  • Progress by stage. Preparing and restoring the database, analyzing installed modules, the Odoo upgrade, sanity checks, neutralization and export, each with its own status.
  • Duration and warnings. The total run time, plus warnings that need your attention, for example third-party modules found in the database or references to missing records that were kept rather than deleted, named by table, column and sample ids.
  • Full log. The complete migration log as a download, for you or your Odoo partner to review.
  • The upgraded database. A .zip with the Odoo 19 dump and your filestore, ready to restore on a staging server. Test output is neutralized: outgoing mail and scheduled actions are switched off and a test banner is shown, so nothing reaches customers.
  • If it fails. The error type, message and traceback. Most messages are covered in our upgrade error guides.

Pre-flight checklist for 18 to 19

  1. Update Odoo 18 to the latest 18.0 revision. Then take the backup. It reduces the chance of templates frozen at an older revision.
  2. List your third-party and custom modules. They stay installed with their data, but their views are switched off until you install Odoo 19 versions of them.
  3. Search custom code for renamed models and fields. groups_id, hr.contract, uom.category, product.packaging, procurement.group, stock.quant.package, stock.valuation.layer, sale.order.option, tax_id on sale order lines.
  4. Check the time zone package on your Odoo 19 server. Ubuntu 24.04 based servers need tzdata-legacy if users picked legacy zones such as Asia/Calcutta.
  5. Record control figures. Trial balance, receivables and payables, stock valuation, number of employees with active contracts, open quotations with optional products. Compare them after the test run.
  6. Back up with the filestore. Use the .zip backup from the database manager so attachments and images come along.
  7. Run a test, restore it on staging, try your daily flows. Quotation to invoice, receipts and deliveries, payslips or time off if you use HR, POS sessions if you use POS.

Upgrade errors seen on 18 to 19

These messages have stopped real 18 to 19 upgrades. Each guide explains the cause, a manual fix, and what OCU does about it.

Before you migrate

  1. Back up your database. Create a fresh backup from Odoo’s database manager (Settings → Database Manager). The .zip format includes your filestore.
  2. Note your installed modules. Check Settings → Apps for any third-party or custom modules. These will need updated versions for Odoo 19 after migration.
  3. Run a test migration first. Test migrations are free and unlimited. Verify the result before committing a production credit.
  4. Plan your custom module updates. OCU handles standard Odoo modules. Custom or third-party modules need separate updates for Odoo 19 compatibility.

How it works

  1. Upload your .zip, .sql, or .dump backup. We auto-detect the source version.
  2. Migrate. We handle schema changes, module merges, field renames, and data migration.
  3. Download your upgraded backup, ready for Odoo 19.

What OCU handles automatically

  • Schema changes. Column types, table renames, new required fields — all structural database changes are applied automatically.
  • Module merges. When Odoo consolidates modules between versions, OCU updates the module registry and migrates data to the new locations.
  • Field renames. Fields that change names between versions are renamed in the database, including references in domains, filters, and server actions.
  • Constraint validation. New CHECK and UNIQUE constraints are validated against your data, with automatic fixes for common violations.
  • View updates. Inherited views are reset so Odoo 19 can reload them from the updated XML definitions.
  • Filestore. Your attachments, images, and documents are preserved and included in the output.

Pricing

Test migrations are free and unlimited — run as many as you need to validate the upgrade. The output is neutralized (emails disabled, crons off) so it’s safe to explore but not for production use.

Production migrations cost one credit (99€), charged only when the migration completes successfully. If the migration fails, no credit is consumed. One credit covers the full path regardless of how many steps are involved.

Frequently asked questions

How many models does Odoo 19 really rename?
Comparing the 18 and 19 source code finds 131 renamed models, but 116 of them are Odoo’s own test models. Fifteen renames affect real databases, including hr.contract to hr.version, procurement.group to stock.reference, stock.quant.package to stock.package and product.packaging to product.uom. OCU applies all of them.
Will the HR changes in Odoo 19 affect my employee data?
The data is kept, but its structure changes: contracts become versions and the employee reads most HR fields from its current version. OCU renames the contract data, creates a version for employees that have none and links work entries to versions. Run a free test and check a few employees, their contracts and their time off before going live.
Is the Odoo 18 to 19 migration harder than earlier versions?
It touches more areas than 17 to 18: HR, units of measure, inventory valuation, access groups and several removed models all need data conversion. In OCU the 18 to 19 step has 77 hand-written migration steps against 39 for 17 to 18. A test migration shows whether your database hits any problem before you commit.
How long does the migration take?
For most databases up to about 1 GB, minutes rather than hours. One real 18 to 19 database with about 950,000 work entries finished the upgrade in roughly five minutes. The test run reports the exact time for your database.
Does OCU handle custom modules during migration?
OCU migrates the standard Odoo Community modules. Custom and third-party modules stay installed with their data tables preserved, but their views are disabled so they cannot break the upgrade. After the migration, install versions of those modules written for Odoo 19.
What happens to my warehouse and inventory data?
Stock moves, pickings, lots, serial numbers, quants and packages are kept. Packages move to stock.package, procurement groups to stock.reference, and valuation layers to product.value with their history. Compare your stock valuation report before and after on the test result.
Can I test before paying for a production migration?
Yes. Test migrations are free. The test output has outgoing mail and scheduled actions disabled, so it is safe to explore without affecting your production system. A production migration uses one credit (€99), and only when it completes successfully.
Can I go from Odoo 16 or 17 straight to 19?
Yes. Upload the 16 or 17 backup and choose 19; OCU runs each intermediate step in one job and charges one credit for the whole chain. See the 16 to 19 and 17 to 19 guides for what changes along the way.

Other migration paths

Further reading

Ready to migrate Odoo 18 to 19?

Free test migrations, unlimited runs. No credit card required.

Start your free test migration