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

> 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.

- Author: Eduin Garnica, CTO, Quantum Garage
- Published: 2026-10-17T00:00:00-06:00
- Updated: 2026-10-17T00:00:00-06:00
- Odoo version: 20
- URL: https://web.quantumgarage.io/en/guides/odoo-studio-vs-custom-development/

## What each one is

Between what Odoo ships with and what a company needs there are three paths, and [Studio](https://web.quantumgarage.io/en/glossary/odoo-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](https://www.odoo.com/documentation/20.0/applications/studio.html) 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](https://web.quantumgarage.io/en/glossary/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](https://www.odoo.com/documentation/20.0/applications/finance/fiscal_localizations/mexico.html).

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](https://www.odoo.com/documentation/20.0/developer/tutorials/server_framework_101/01_architecture.html), 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](https://web.quantumgarage.io/en/guides/odoo-online-vs-odoo-sh-vs-on-premise/).
- **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](https://www.odoo.com/pricing) 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.

Table: What Odoo's upgrade service converts

| Customization                                                                                       | Does the upgrade service convert it?                                  | If not, who adapts it        |
| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ---------------------------- |
| Standard apps                                                                                       | Yes                                                                   | —                            |
| Studio customizations                                                                               | Yes, as long as Studio stays installed and the subscription is active | —                            |
| Developments under a maintenance of customizations subscription                                     | Yes                                                                   | —                            |
| Modules without a maintenance contract, built in-house or by third parties, including Odoo partners | No                                                                    | Whoever 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](https://www.odoo.com/documentation/20.0/administration/upgrade.html) 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](https://www.odoo.com/documentation/20.0/developer/howtos/upgrade_custom_db.html) 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

Table: Where each one lives, how it is documented and how it is tested

| Criterion                        | Studio                                                                                                | Custom module                                                                                                       |
| -------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Where it lives                   | In the database, as the `studio_customization` module                                                 | In code files, usually in a Git repository                                                                          |
| How it moves to another database | Exported as a ZIP and imported into a database on the same version with the same apps                 | By installing the module's code on that database                                                                    |
| How it is documented             | With whatever the team records; each automation rule has a notes tab for its purpose and how it works | With the code, its change history and the module manifest, which declares its version and dependencies              |
| How it is tested                 | By hand, on a neutralized duplicate or a staging database                                             | With Python and JavaScript unit tests and tours that simulate the user; on Odoo.sh they run on development branches |
| From testing to production       | The change is recorded and repeated in production                                                     | The branch is merged and the module updated                                                                         |
| Who does it                      | A trained functional user                                                                             | A developer who knows Python                                                                                        |

On [Odoo.sh](https://web.quantumgarage.io/en/glossary/odoo-sh/), the next-to-last row is literal. Merging a [staging](https://web.quantumgarage.io/en/glossary/staging/) branch into production only carries the code, and what was changed inside the staging database does not reach production. The [Odoo.sh documentation](https://www.odoo.com/documentation/20.0/administration/odoo_sh/getting_started/branches.html) 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.

Table: Which path fits each need

| If the need…                                                                           | Fits                                                   |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| is a field, a view, a PDF report or an approval on existing models                     | Studio                                                 |
| is automating an action when an event happens, without code                            | An automation rule, with or without Studio             |
| has to run on a database hosted on Odoo Online                                         | Studio, because Online does not support custom modules |
| will be sustained by a team without a development profile                              | Studio                                                 |
| calls for logic that imports libraries, web controllers or custom interface components | A module                                               |
| has to be reviewed as code, with history and automated tests                           | A 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.

## Sources

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