Dieser Artikel ist derzeit nur auf Englisch verfügbar. Die Übersetzung folgt bald.
By the end of this recipe, you will have a properly packaged Odoo 19 module ready for distribution — through the official Odoo App Store, your own customer download portal, or a private Git repository. Skill required: Odoo developer comfortable with Python packaging conventions. Time required: 90 minutes for the first module, 30 minutes per subsequent. ECOSIRE distributes 36 paid Odoo modules and 24 free ones, and the recipe below is the playbook.
The reason most homemade Odoo modules fail to install on customer systems: missing dependencies, hardcoded paths, hardcoded company data, or the manifest declares a Python version that doesn't match Odoo's runtime. The recipe below catches all of these before you ship.
What you will need
- Odoo version: 17, 18, or 19. Each major version requires its own packaged variant.
- Working module that runs in your dev environment.
- Documentation skills: README, screenshots.
- Time: 90 min first module.
Step-by-step
1. Polish the manifest
__manifest__.py:
{
'name': 'Customer Segmentation',
'version': '19.0.1.0.0',
'category': 'CRM',
'summary': 'Tag customers as Strategic/Enterprise/Mid-Market/SMB with auto-assignment.',
'description': """
Customer Segmentation
=====================
Segment your customers based on revenue and industry, with auto-assignment of
account managers and tier-specific commission rates.
Features
--------
* Five-tier segmentation (Strategic, Enterprise, Mid-Market, SMB, Consumer)
* Automatic segment assignment based on rolling 12-month revenue
* Strategic Account Manager assignment per segment
* Per-segment commission rate overrides
""",
'author': 'ECOSIRE',
'website': 'https://ecosire.com',
'license': 'OPL-1', # or LGPL-3, AGPL-3 depending on your model
'depends': [
'base',
'sale',
'crm',
],
'data': [
'security/ir.model.access.csv',
'views/partner_views.xml',
'data/segment_data.xml',
],
'demo': [
'demo/demo.xml',
],
'images': [
'static/description/banner.png',
'static/description/icon.png',
],
'price': 199.00,
'currency': 'USD',
'support': '[email protected]',
'installable': True,
'application': False,
'auto_install': False,
}
Every field above is required by the App Store. summary is the one-liner customers see in search results. description is RST or HTML.
Verification: odoo-bin --check-manifest /path/to/module returns success.
2. Build the static description folder
static/description/index.html:
<section class="oe_container">
<div class="oe_row">
<div class="oe_span12">
<h2 class="oe_slogan">Customer Segmentation</h2>
<h3 class="oe_slogan">Tag, sort, and prioritize your customers in 30 seconds.</h3>
</div>
<div class="oe_span6">
<img class="oe_picture" src="screenshot1.png" alt="Customer form with segment dropdown"/>
</div>
<div class="oe_span6">
<p>Segment your customers automatically based on revenue and industry.</p>
<ul>
<li>Five tiers out of the box</li>
<li>Per-tier commission rates</li>
<li>Strategic Account Manager assignment</li>
</ul>
</div>
</div>
</section>
Add screenshots: screenshot1.png, screenshot2.png, screenshot3.png (1200x800 minimum), plus banner.png (1280x600) and icon.png (128x128).
Verification: open the HTML in a browser; layout looks correct.
3. Add a comprehensive README
README.md at the repo root:
# Customer Segmentation for Odoo 19
[](https://www.odoo.com/documentation/19.0/legal/licenses/licenses.html)
## Installation
1. Place the module in your `addons_path`.
2. Update the apps list (`Apps > Update Apps List`).
3. Search for "Customer Segmentation" and click Install.
## Configuration
1. Go to `Settings > Customer Segmentation`.
2. Configure the revenue thresholds for each tier.
3. Assign Strategic Account Managers per region.
## Usage
Every contact form now shows a "Customer Segment" field. Segments are auto-computed based on the rolling 12-month revenue but can be manually overridden.
## Known Issues
- Multi-currency revenue computation requires v19.0.1.1.0+
## Support
[email protected]
Verification: README renders correctly on GitHub or your distribution platform.
4. License the right way
OPL-1 (Odoo Proprietary License) is what the App Store accepts for paid apps. AGPL-3 / LGPL-3 are open-source. Pick one and include the full license text as LICENSE.
wget https://www.odoo.com/sites/default/files/odoo_proprietary_license.txt -O LICENSE
Verification: LICENSE file exists at module root.
5. Validate dependencies
The depends field must list every Odoo module your code references. Run a static check:
grep -rh "self.env\['" custom_module | grep -oP "self\.env\['\K[^']+" | sort -u
# Output shows every model your code touches; cross-reference with Odoo's module-to-model map
A model mail.template lives in mail — declare mail as a dependency.
Verification: installing on a minimal Odoo (only base) without your declared deps fails with a clear message.
6. Test the install on a fresh DB
docker exec odoo /opt/odoo/odoo-bin -c /etc/odoo/odoo.conf -d fresh_install_test -i custom_module --stop-after-init
# Should complete with no errors
docker exec odoo /opt/odoo/odoo-bin -c /etc/odoo/odoo.conf -d fresh_install_test -u custom_module --stop-after-init
# Re-run upgrade idempotently
docker exec odoo /opt/odoo/odoo-bin -c /etc/odoo/odoo.conf -d fresh_install_test --uninstall=custom_module --stop-after-init
# Cleanly uninstalls
Verification: install + upgrade + uninstall all work without errors.
7. Build the ZIP
cd /opt/custom-addons
zip -r customer_segmentation_19.0.1.0.0.zip customer_segmentation \
-x "*.pyc" "*/__pycache__/*" "*/.git/*"
The ZIP must contain a folder with the same name as the module's technical name. Verification: unzip -l shows customer_segmentation/__manifest__.py at the top.
8. Submit to the App Store
https://apps.odoo.com > Publish a Module. Fill in:
- Module name (must match technical name)
- Category
- Versions supported (19.0)
- ZIP upload
- Banner + screenshots
- Description (RST or Markdown)
- Pricing
Odoo reviews in 5 to 10 business days. Common rejection reasons: missing License field, hardcoded company info, code quality issues (PEP8, security warnings).
Verification: module appears on apps.odoo.com under your developer account.
Common mistakes
- Hardcoded company data. Use
self.env.companyinstead ofcompany_id = 1. - Missing
auto_install. Set toFalseunless you genuinely need silent install on dependency. - Wrong license. AGPL apps cannot charge price > 0 on the App Store (per OCA guidelines); use OPL-1 for paid.
- Inconsistent version.
__manifest__.pyversion must match the directory name in the ZIP and the version declared in your README. - Skipping demo data. Reviewers test with
--with-demo; demo data should populate sensible defaults.
Going further
Multi-version maintenance: maintain branches 17.0, 18.0, 19.0 of your module repo so customers on different versions can install. Cherry-pick non-breaking fixes across branches; major features only land on the latest version.
CI/CD pipeline: GitHub Actions that runs the test suite + validates manifest + builds the ZIP on every commit to main. On tagged releases (e.g., v19.0.1.0.0), upload the ZIP to the App Store + your customer portal.
Customer download portal: instead of (or in addition to) the App Store, host modules on your own site with license keys and download tokens. ECOSIRE has built this; it bypasses the App Store's revenue share. Every download is logged with timestamp and customer email for support.
Per-version automated rebuilds: when Odoo releases a patch, rebuild and re-test against the new minor version automatically. Catches regressions early.
Documentation site: pair each module with a Docusaurus or MkDocs site at docs.yourdomain.com/module_name. Users find your docs faster than digging through a README.
Demo videos: 2-3 minute Loom or YouTube videos showing the module in action. Conversion lift on App Store listings with videos is significant.
Module review tooling: the OCA maintains automated review tools (pylint-odoo, flake8-odoo) that catch common issues. Run on every commit.
License enforcement at runtime: even with the OPL-1 legal license, enforce technically. ECOSIRE has built ecosire-license-client that validates license keys against a remote server, with grace periods, expiry, and per-domain restrictions. Without runtime enforcement, customers extract the module from one Odoo and re-install on a different (unlicensed) one.
Internationalization: ship .po files for major languages. The App Store boosts visibility for multilingual modules. Pair with a translation service (we use professional translators for our top-selling modules).
Customer onboarding flow: when a customer first installs the module, show a "Quick Setup" wizard that walks them through the 3-5 essential configuration steps. Drops support ticket volume by 30-50%.
Telemetry (opt-in): with explicit consent, collect anonymized usage telemetry to understand which features are used. Don't ship without opt-in consent — it's a GDPR landmine.
Beta program: maintain a beta channel where customers opt in to test new features before general release. Drives quality and surfaces bugs before they hit thousands of customers.
Refund policy: even with the App Store's 14-day refund policy, set your own additional 30-day money-back guarantee. Customers feel safer; conversion lift is measurable.
SLA and support tiers: free email support for App Store buyers, faster response for customers on a paid support plan. ECOSIRE bundles support tiers with module pricing.
For module distribution platform setup including license validation, automated S3 uploads, and version management, ECOSIRE custom Odoo development builds the entire pipeline. Pair this with how to write a custom Odoo cron to schedule version-bump notifications.
Frequently Asked Questions
What is the App Store revenue split?
Odoo takes 30% of the sale price. So a $199 module nets you $139 per sale. For high-volume modules, it's worth setting up your own distribution to keep the full margin.
How do I license my paid module beyond just selling it?
Use HMAC-signed license keys validated against a remote server. ECOSIRE built a dedicated licensing module (ecosire-license-client) that hooks into customer Odoo instances to validate keys. License revocation, expiry, and per-domain restrictions are all enforced server-side.
Can I distribute via OCA?
Yes — fork an OCA repo, contribute your module under AGPL/LGPL, and the OCA community helps maintain it. No revenue but you get free QA and broad adoption.
How do I update a module post-launch?
Bump the version in manifest, push a new ZIP to the App Store. Existing customers see "Update Available" in their Apps menu.
For full module distribution including App Store submission, customer portal, and license enforcement, ECOSIRE custom Odoo development builds the entire stack. Or read how to write an Odoo migration script for handling version upgrades cleanly.
Geschrieben von
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
ECOSIRE
Transformieren Sie Ihr Unternehmen mit Odoo ERP
Kompetente Odoo-Implementierung, Anpassung und Support zur Optimierung Ihrer Abläufe.
Verwandte Artikel
So fügen Sie einer Odoo-Formularansicht eine benutzerdefinierte Schaltfläche hinzu (2026)
Fügen Sie benutzerdefinierte Aktionsschaltflächen zu Odoo 19-Formularansichten hinzu: Python-Aktionsmethode, Ansichtsvererbung, bedingte Sichtbarkeit, Bestätigungsdialoge. Produktionsgeprüft.
So fügen Sie ein benutzerdefiniertes Feld in Odoo ohne Studio hinzu (2026)
Fügen Sie benutzerdefinierte Felder über ein benutzerdefiniertes Modul in Odoo 19 hinzu: Modellvererbung, Ansichtserweiterung, berechnete Felder, Store/Non-Store-Entscheidungen. Code-First, versioniert.
So fügen Sie einen benutzerdefinierten Bericht in Odoo mithilfe eines externen Layouts hinzu
Erstellen Sie einen gebrandeten PDF-Bericht in Odoo 19 mit web.external_layout: QWeb-Vorlage, Papierformat, Aktionsbindung. Mit gedrucktem Logo + Fußzeilenüberschreibungen.