Upgrading to Odoo 18: The Budget Migration Headache
Update 11.06.25
The Odoo Upgrade Service now adds a new Analytic Plan called 'Upgraded Budget Plan' to your database. In addition to this it creates new Analytic Accounts in this plan for each of your Budgetary Position records in previous versions of Odoo. Previous journals that were associated to the Old Budgetary Positions will be retrospectively allocated the new Analytic Accounts. Lastly Odoo creates new Analytic Distribution models to automatically allocate these new Analytic Accounts (replacement for Budgetary Positions). This is a massive help (though we did incur an issue where the upgrade process marked the Analytic Account % allocation as a string and not an integer). If you go through this process be careful of having everything setup properly in your previous version, otherwise you'll have a real headache trying to do it in 18.
If you are running Odoo 17 or earlier and rely on Budgets in Projects, upgrading to Odoo 18 can catch you off guard. Odoo has completely reworked how Budgets are handled, and if you are not prepared, you will find that much of your hard-earned data simply disappears. Here is what changes, why it matters, and how to fix it properly.
In Odoo 17 and earlier, Budgets in Projects were handled through Budgetary Positions. You would create a Budgetary Position for each item within a Budget. For example, you could create one for Sales and link it to journals in the account tree. To ensure accurate reporting, you had to make sure that the same journal was not used more than once. For instance, if you linked 41110 Sales Product 1 to the Budgetary Position 'Revenue' and also linked 41110 to 'Other Revenue,' you would end up double counting journal entries across Bills, Invoices, and so on. Once set up properly, you could retrospectively assign Budgets to Projects and get a clear view of profitability. It all worked reasonably well once you had the framework in place.
Then along came Odoo 18.
Gone is the concept of Budgetary Positions. As a result, your old Budgets are still visible, but the detailed line items (formerly the Budgetary Positions) are missing. To make matters worse, you will now only see amounts based on the Analytic Account for the Project. No more granular breakdowns. This can be a rude shock when you realise that all your rich Budget data has essentially vanished.
Onwards and upwards though — how do you fix this?
The new way to recreate something similar to Budgetary Positions is by setting up a new Analytic Plan. In our case, we created one called 'Budget items.' Within this plan, we mirrored the old Budgetary Positions such as Revenue and Labour by creating new Analytic Accounts.
Next comes the mapping process, which happens in three steps:
Step 1 — Export the old Budget data and reimport it, tagging each line item with the appropriate new Analytic Account.
Step 2 — Export all journal entries and reimport them with the new Analytic Account applied to each line.
Step 3 — Set up your Analytic Distribution Models. I recommend using account prefixes to map accounts to the new Analytic Accounts under the 'Budget items' Analytic Plan.
Step one ensures each line item is correctly tagged. Step two updates your historical data. Step three automates the tagging of new records moving forward.
If you are upgrading to Odoo 18, this is not a trivial task. It needs to be done properly or you will lose the value of your historical Budget data. While the new Budget approach in Odoo 18 has merit, it clearly does not consider data migration.
If you are not comfortable updating mass records through imports, you should consider engaging an Odoo Partner to script the process for you, particularly if you are on a hosted instance.