Skip to main content
Development · Odoo App Store

Publishing a module on the Odoo App Store: the written rules and the ones learned after 117 listings

We have 117 modules published on the Odoo App Store, on Odoo 19, 18 and 17. This is what the documentation says, what it does not, and the process we follow so a listing goes out first time and stays maintained across three versions.

Odoo Apps screen with the list of installed modules on a real backend

The Odoo App Store is the only channel where an Odoo module sells without a salesperson: someone searches for it, buys it and installs it. Publishing is free and anyone can do it with a git repository and a well-written manifest. What is not written anywhere is why a listing takes days to appear, why a description comes out broken, or why a module that compiles on your machine will not install on the buyer's Odoo. This is what we have learned publishing 117 modules and maintaining them on Odoo 19, 18 and 17.

Key idea: the App Store does not install your module to check it. It reads the manifest, the description and the images, and publishes. If the module does not install on a real Odoo, the first buyer finds out. The whole discipline of publishing is about not letting that happen.

The written rules: repository, branch and manifest

The mechanism is simple and worth following to the letter. You register a git repository in your apps.odoo.com account; the App Store scans it and publishes every module it finds. The branch matters: the 19.0 branch feeds the Odoo 19 listings, 18.0 those for 18, 17.0 those for 17. The same technical name across the three branches is one listing with three versions, and that is what you want: one URL, one reviews page, three download buttons. Different technical names per version are three listings sharing the traffic.

From the manifest, what the App Store reads and shows:

  • name, summary and category: the listing title, the line under it and where it appears in the catalogue. The name must be unique across the whole store.
  • version with the Odoo version prefix (19.0.1.0.0): without that prefix the listing does not know which Odoo it belongs to.
  • license: OPL-1 for paid modules, LGPL-3 or AGPL-3 for free ones. A paid module under a free licence is a gift you did not mean to give.
  • price and currency: the listing price. Odoo keeps a share of every sale and pays you the rest; the split is published in the App Store terms.
  • images: the list of screenshots, starting with the banner shown in the catalogue. Without a banner, the listing shows a grey gap next to those that have one.
  • static/description/index.html: the long description. HTML without scripts, relative images inside the module and, from experience, ASCII characters: a badly encoded accent or typographic quote can leave the listing with broken symbols you only see once it is live.

The rules that are not written down

The re-scan rules, and it is not forced with a zip

After a push, the listing does not change instantly: the App Store re-scans the repository at its own pace, which can be hours or days. The temptation is to upload a zip by hand to “speed it up”. Don't: a hand-uploaded version and a version scanned from the repository coexist badly, and you end up with a listing you cannot trace. The rule we follow is a single source, the repository, and patience. If you need the scan to notice a change, bump the manifest version number: a content change under the same version is sometimes not picked up.

Compiling is not installing

The scan does not install the module. A valid manifest and code that imports without errors do not mean the module installs. On Odoo 19 this has become especially treacherous: security groups changed model (res.groups.privilege), ir.cron no longer accepts the numbercall field, and list views are called list, not tree. A module written for 17 passes the 19 scan without complaint and fails to install on the buyer's Odoo. We detail it in why an Odoo 19 module compiles but does not install.

Three versions are three modules that look alike

Maintaining the same module on 19, 18 and 17 is not copying the folder to three branches. Each version has its API differences, and the only way to know all three work is to install them on a real Odoo of each version. We do it on Odoo.sh: one build per version, clean install, tests, and only then the push to the branch the App Store scans. And when Odoo 20 comes out, the process is the same with one more branch. A module tested only on the version it was written for is a module that will sell three times and fail twice.

The process we follow, in order

  1. Unique and final technical name. Search the App Store before writing the first line; changing it later means losing the listing and its reviews.
  2. Complete manifest from the first commit: prefixed version, licence, price, category, images, exact dependencies.
  3. Clean install on real Odoo.sh for every version to be published, with tests green. Without this there is no push.
  4. ASCII description with real screenshots of the installed module, not mock-ups. The buyer compares what they see on the listing with what they install.
  5. Push to the version branch and wait for the scan. No zips. If a fix is needed, bump the version and wait again.
  6. Check the published listing on all three versions: banner, description without broken symbols, price, download button.

What publishing does not do for you

Publishing is not selling. A well-made listing shows up when someone searches for exactly that problem, and that is all. What gets it installed is the module working first time, the description saying what it does and does not do, and support questions being answered. That is why we treat every published module as a product with its maintenance, not as an uploaded file. And that is why, when a software company asks us for a connector for their product, publishing on the App Store is part of the job, not an extra: it is where their Odoo users will look for it.

Frequently asked questions

How long does a module take to appear after the push?

As long as the next repository scan takes, which you do not control: it can be hours or days. If nothing has changed after a few days, the first thing is to check the branch is right and bump the manifest version; the last thing is uploading a zip by hand.

Can the same module be published for Odoo 17, 18 and 19 under one listing?

Yes, and it is the recommended way: the same technical name on the 17.0, 18.0 and 19.0 branches of the same repository produces one listing with the three versions. Each branch has to actually install on its version; the App Store does not check it for you.

Which licence do I use if the module is paid?

OPL-1, Odoo's proprietary licence, which allows selling the module and forbids redistributing it. Under LGPL-3 or AGPL-3 the buyer may redistribute it freely, which is what you want if it is free and what you do not want if you charge for it.

Useful links inside FlexigoTech

The 117 published modulesThe full catalogue, by family, on Odoo 19, 18 and 17A connector for your software, published on the App StoreFor technology partners: build, test and publishAn Odoo 19 module compiles but does not installThe 19 API traps the scan does not seeGreen tests and the connector fails in productionWhy the test that counts is the real install

Got a module you want to publish, or a published one that does not sell?

We will tell you what the manifest, the description or the install is missing, and how to take it to all three versions. Email comercial@flexigobe.com or call +34 616 809 504.

Talk to an engineer