Skip to content
Contact

Guide · Customization

Odoo Studio or custom development in Odoo 20: when each one fits

Author
Eduin Garnica, CTO
Published
Updated
Version
Odoo 20

In short

Odoo Studio customizes Odoo without programming —fields, views, models, automations, reports and approval rules— and stores the changes in the database; a custom module is code that lives in files, usually in a repository, and can reach everything the Odoo framework allows. Studio comes with the Custom plan and works on Odoo Online, Odoo.sh and on-premise; a module requires Odoo.sh or on-premise. When you upgrade, Odoo's upgrade service converts what was built with Studio as long as Studio stays installed and the subscription is active, while a module is adapted by whoever maintains it, unless it has a maintenance contract with Odoo.

What each one is

Between what Odoo ships with and what a company needs there are three paths, and Studio and custom development are two of them. The first is the standard: turning on a setting, configuring master data or creating an automation rule. Odoo’s own documentation asks you to exhaust it before building anything. Its guide to upgrading customized databases recommends you “challenge the developments as much as possible and find functional workarounds”, because removing what a development duplicates from the standard eases the next upgrade and reduces technical debt.

Odoo Studio
the Odoo Enterprise tool for customizing Odoo without coding knowledge.
Custom module
code that extends Odoo’s standard and was not built with Studio, as the Odoo 20.0 documentation defines it.
Automation rule
an action Odoo runs by itself when an event happens, such as creating an activity or updating a field; it comes from the base_automation module, part of the Odoo 20 Community code, and Studio edits it from its own interface.
Upgrade service
the service Odoo uses to convert a database to a more recent version, included at no extra cost in the Enterprise subscription.
Custom plan
the Odoo Enterprise plan that includes Studio, multi-company, the external API and the Odoo.sh and on-premise hosting options.

What Studio solves

Studio works inside Odoo’s interface. The Odoo 20.0 documentation defines it as “a toolbox used to customize Odoo without coding knowledge” and lists what it adds or modifies in any app: fields, views, models, automation rules, webhooks —automatic notices one system sends another when something happens—, PDF reports, approval rules and security rules. That covers frequent requests, such as a field the operation needs, a view in a different order, a report in the company’s format or an approval before confirming, with no development environment and no deployment.

If you invoice in Mexico, one boundary is worth knowing early. Studio can edit PDF reports such as the invoice, but the CFDI (Mexico’s electronic invoice) is an XML file that the standard l10n_mx_edi module generates from the technical documentation published by the SAT, Mexico’s tax authority, and that Odoo sends along with the PDF, according to the Mexico localization documentation.

Everything built with Studio stays inside the database. Odoo groups it into a module called studio_customization, which can be exported as a ZIP file and imported into another database. The documentation asks that the destination database be on the same version and have the same apps, because Studio does not declare the modules it works on as dependencies.

Studio also accepts code. An automation rule can run Python through the Execute Code action, and two things change there. The first is cost, which the documentation flags on the same page:

“For automation rules that require the execution of custom code, note that maintenance of custom code is not included in the Standard or Custom pricing plans and incurs additional fees.”

Odoo S.A., “Automation rules”, official Odoo 20.0 documentation, accessed October 17, 2026.

The subscription agreement says the same with its own definition: an extra module is either a directory of source code files or “a set of Python-based customizations created in a database (e.g. with Odoo Studio)”. The second is reach. That code runs inside safe_eval, Odoo’s restricted evaluator, which on the 20.0 branch blocks import statements (odoo/tools/safe_eval/evaluation.py). Anything that needs to import a library is written as a module.

What a custom module solves

A module works on Odoo’s full framework. According to the developer documentation, it can contain business objects declared as Python classes, views, XML or CSV data files —with security rules, reports or configuration—, web controllers that handle browser requests, and static files such as images, CSS or JavaScript. Business logic is written in Python, and the interface uses OWL, Odoo’s own JavaScript framework.

Its code lives in files, usually in a Git repository that records every change with its author and date, and it is installed into the database from there. That has three consequences:

  • It requires hosting that supports modules. That means Odoo.sh or on-premise, because Odoo Online does not accept them; the full comparison is in the hosting guide.
  • It requires someone who knows Python to write and maintain it. The official tutorial asks for an intermediate level.
  • It reaches pieces Studio’s list does not name, and it is tested like software. Web controllers, custom interface components or logic that imports libraries fit in a module, and Odoo provides Python and JavaScript unit tests for it, plus tours that simulate a user end to end.

Which plan includes Studio

Studio is part of Odoo Enterprise: the Odoo 20 Community code does not include its module, web_studio, and the pricing page places it in the Custom plan, alongside multi-company and the external API. On the Standard plan, installing it changes the subscription:

“Installing Studio in an Odoo database on the Standard pricing plan automatically triggers an upsell to the Custom pricing plan.”

Odoo S.A., “Studio”, official Odoo 20.0 documentation, accessed October 17, 2026.

On yearly or multi-year contracts, that change arrives as an upsell order with a 30-day limit; on monthly contracts, the subscription moves to the Custom plan by itself with the next bill. There is one exception: the free One App plan lets you pick Studio as that one app.

The plan does not tip the scale between the two paths. Studio requires the Custom plan, and a module ends up requiring it too, because Odoo.sh and on-premise are only available on that plan. What gets added in both cases, as soon as there is code, is its maintenance: the pricing page leaves it out of every plan, as it does hosting on Odoo.sh.

What happens when you upgrade

This is the difference that weighs most over time, and Odoo sets it in the service level agreement of its upgrade service, which applies equally to Odoo Online, Odoo.sh and on-premise.

What Odoo’s upgrade service converts
CustomizationDoes the upgrade service convert it?If not, who adapts it
Standard appsYes—
Studio customizationsYes, as long as Studio stays installed and the subscription is active—
Developments under a maintenance of customizations subscriptionYes—
Modules without a maintenance contract, built in-house or by third parties, including Odoo partnersNoWhoever maintains the module

Source: the service level section of the upgrade page in the Odoo 20.0 documentation, accessed October 17, 2026.

The service converting Studio customizations does not exempt them from testing. The upgrade documentation asks you to test the upgraded database before production, and its checklist includes views, reports, automated actions and server actions. The subscription agreement leaves that validation on the customer’s side.

A module adds one more step, because the database does not move without it: “If your database contains custom modules, it cannot be upgraded until a version of your custom modules is available for the target version of Odoo.” Odoo’s guide for customized databases lists six steps: freeze the developments and challenge them against what is new, request an upgraded test database, make the module install on an empty database of the target version, then on the upgraded database, test thoroughly with a rehearsal, and upgrade production. On Odoo.sh, the production upgrade starts with the commit that brings the adapted code, and if anything fails the platform reverts it automatically.

How each one is documented and tested

Where each one lives, how it is documented and how it is tested
CriterionStudioCustom module
Where it livesIn the database, as the studio_customization moduleIn code files, usually in a Git repository
How it moves to another databaseExported as a ZIP and imported into a database on the same version with the same appsBy installing the module’s code on that database
How it is documentedWith whatever the team records; each automation rule has a notes tab for its purpose and how it worksWith the code, its change history and the module manifest, which declares its version and dependencies
How it is testedBy hand, on a neutralized duplicate or a staging databaseWith Python and JavaScript unit tests and tours that simulate the user; on Odoo.sh they run on development branches
From testing to productionThe change is recorded and repeated in productionThe branch is merged and the module updated
Who does itA trained functional userA developer who knows Python

On Odoo.sh, the next-to-last row is literal. Merging a staging branch into production only carries the code, and what was changed inside the staging database does not reach production. The Odoo.sh documentation gives two ways out for those changes: record them step by step and repeat them in production, or write them as XML data files inside a module in the branch.

When each one fits

Neither is better in the abstract: it depends on the need, the hosting and who will sustain the change.

Which path fits each need
If the need…Fits
is a field, a view, a PDF report or an approval on existing modelsStudio
is automating an action when an event happens, without codeAn automation rule, with or without Studio
has to run on a database hosted on Odoo OnlineStudio, because Online does not support custom modules
will be sustained by a team without a development profileStudio
calls for logic that imports libraries, web controllers or custom interface componentsA module
has to be reviewed as code, with history and automated testsA module

Five questions put the decision in order:

  1. Does the standard solve it? A setting or a configuration needs neither Studio nor code, and the upgrade service converts it together with the standard apps.
  2. Does it fit what Studio offers and the hosting? If the database is or will be on Odoo Online, configuration and Studio are the customization paths it supports.
  3. Who will maintain it, and who will adapt it at each version? Studio customizations are converted by the upgrade service as long as Studio stays installed; a module is adapted by whoever maintains it, unless it has a maintenance contract with Odoo.
  4. Does it involve code? A Studio rule that runs Python counts as an extra module under the subscription agreement, and its maintenance is billed separately, just like a module’s. Between the two, then, the difference lies in reach and in how each one is tested.
  5. How will it be tested and documented? Studio is tested by hand on a neutralized copy and documented with whatever the team records; a module brings automated tests and the repository history, and needs someone to write them.

Studio brings customization closer to the people who run the operation and leaves the conversion at each version to Odoo’s service. A module widens the reach and brings software tools —repository, review and tests— in exchange for a developer who sustains it at each version. The decision comes from the concrete need, the hosting and who will maintain the change.

Frequently asked questions

Is Odoo Studio free?

Studio is included in the Odoo Enterprise Custom plan. On a Standard plan database, installing it switches the subscription to the Custom plan, and the free One App plan lets you pick Studio as that one app. Maintenance of any Python code written inside Studio is billed separately.

Is Odoo Studio available in Odoo Community?

No. Automation rules, from the base_automation module, are in the Community code and can be configured without Studio, but Studio is part of Odoo Enterprise: the Odoo 20 Community code does not include its module, and it comes with the Custom plan.

Does Studio work on Odoo Online?

Yes, on the Custom plan. Odoo Online supports customizations that need no custom code; what it does not support is custom modules or apps from the Odoo Apps Store.

Are Studio customizations lost when you upgrade?

No. Odoo’s upgrade service converts Studio customizations as long as Studio stays installed and the subscription is active. The upgraded database is still tested before it goes to production, as with any other customization.

Can Odoo be customized without programming?

Yes, in two ways: by configuring standard features —settings, master data and automation rules— and with Odoo Studio, which adds fields, views, models, reports and approval rules without code and requires the Custom plan. Anything beyond that, such as logic that imports libraries or custom interface components, is built as a custom module.

By industry

Deciding how to customize your Odoo? See our Odoo implementation service, or write to us.

Sources

  1. Odoo S.A., “Studio”, official Odoo 20.0 documentation, odoo.com/documentation/20.0/applications/studio.html. Accessed .
  2. Odoo S.A., “Models, modules, and apps”, official Odoo 20.0 documentation, Studio, odoo.com/documentation/20.0/applications/studio/models_modules_apps.html. Accessed .
  3. Odoo S.A., “Automation rules”, official Odoo 20.0 documentation, Studio, odoo.com/documentation/20.0/applications/studio/automated_actions.html. Accessed .
  4. Odoo S.A., “PDF reports”, official Odoo 20.0 documentation, Studio, odoo.com/documentation/20.0/applications/studio/pdf_reports.html. Accessed .
  5. Odoo S.A., “Mexico”, official Odoo 20.0 documentation, fiscal localizations, odoo.com/documentation/20.0/applications/finance/fiscal_localizations/mexico.html. Accessed .
  6. Odoo S.A., “Upgrade”, official Odoo 20.0 documentation, odoo.com/documentation/20.0/administration/upgrade.html. Accessed .
  7. Odoo S.A., “Upgrade a customized database”, official Odoo 20.0 documentation, developers, odoo.com/documentation/20.0/developer/howtos/upgrade_custom_db.html. Accessed .
  8. Odoo S.A., “Chapter 1: Architecture Overview”, official Odoo 20.0 documentation, developers, odoo.com/documentation/20.0/developer/tutorials/server_framework_101/01_architecture.html. Accessed .
  9. Odoo S.A., “Testing Odoo”, official Odoo 20.0 documentation, developers, odoo.com/documentation/20.0/developer/reference/backend/testing.html. Accessed .
  10. Odoo S.A., “Modules”, official Odoo 20.0 documentation, developers, odoo.com/documentation/20.0/developer/reference/backend/module.html. Accessed .
  11. Odoo S.A., “Odoo.sh: Getting started”, official Odoo 20.0 documentation, odoo.com/documentation/20.0/administration/odoo_sh/getting_started.html. Accessed .
  12. Odoo S.A., “Odoo.sh: Branches”, official Odoo 20.0 documentation, odoo.com/documentation/20.0/administration/odoo_sh/getting_started/branches.html. Accessed .
  13. Odoo S.A., “Odoo Online”, official Odoo 20.0 documentation, odoo.com/documentation/20.0/administration/odoo_online.html. Accessed .
  14. Odoo S.A., “Odoo Enterprise Subscription Agreement, version 13 of September 24, 2026”, official Odoo 20.0 documentation, odoo.com/documentation/20.0/legal/terms/enterprise.html. Accessed .
  15. Odoo S.A., “Pricing”, Odoo public pricing page, odoo.com/pricing. Accessed .
  16. Odoo S.A., “odoo/tools/safe_eval/evaluation.py”, Odoo source code, odoo/odoo repository, branch 20.0, github.com/odoo/odoo/blob/20.0/odoo/tools/safe_eval/evaluation.py. Accessed .
  17. Odoo S.A., “addons/base_automation/__manifest__.py”, Odoo source code, odoo/odoo repository, branch 20.0, github.com/odoo/odoo/blob/20.0/addons/base_automation/__manifest__.py. Accessed .
  18. Odoo S.A., “addons folder”, Odoo source code, odoo/odoo repository, branch 20.0, github.com/odoo/odoo/tree/20.0/addons. Accessed .