Aangepaste Odoo-modules bouwen: een praktische gids voor Europese mkb-bedrijven
Odoo is voor duizenden kleine en middelgrote bedrijven in de Benelux en Scandinavië het ERP-systeem van keuze geworden, en niet zonder reden. Het dekt financiën, voorraad, productie, CRM en HR in één codebase, draait probleemloos op bescheiden infrastructuur, en het licentiemodel is veel vriendelijker voor een bedrijf van 60 medewerkers dan de enterprise-suites die voor multinationals zijn gebouwd.
Maar zodra een bedrijf tegen een proces aanloopt dat Odoo niet standaard ondersteunt — een Belgische intracommunautaire btw-uitzondering, een Deense loonintegratie, een specifieke kwaliteitscontroleworkflow op de werkvloer — verschuift het gesprek naar de ontwikkeling van aangepaste modules. Dat is waar het interessant wordt, en waar veel Odoo-projecten in stilte misgaan.
Deze gids behandelt wat de ontwikkeling van een aangepaste Odoo-module eigenlijk inhoudt, hoe u bepaalt of u het nodig heeft, en hoe u zo bouwt dat de volgende versie-upgrade u niet opbreekt.
Bepaal eerst of u werkelijk een aangepaste module nodig heeft
Het meest waardevolle Odoo-ontwikkelwerk is vaak het werk dat u vermijdt. Voordat u een regel Python schrijft, toetst u de vereiste aan een korte filter:
Kan Odoo Studio het aan? Met Studio voegt u velden toe, past u weergaven aan, bouwt u geautomatiseerde acties en maakt u eenvoudige rapporten zonder code. Voor ruwweg 40–50% van de aanvragen die wij zien met de strekking "we hebben een aanpassing nodig", is Studio voldoende. Dat is niet zonder nadelen — Studio-aanpassingen worden als data opgeslagen en zijn lastiger te versiebeheren — maar voor een simpel extra veld op een verkooporder is het het juiste gereedschap.
Bestaat er al een community- of OCA-module? De Odoo Community Association onderhoudt duizenden goed onderhouden, peer-reviewed modules die alles dekken van SEPA-incassovarianten tot geavanceerde voorraadwaardering. Vooral voor Europese lokalisatiebehoeften loopt OCA vaak jaren voor op een build vanaf nul. Controleer eerst apps.odoo.com en de OCA GitHub-repositories.
Is de vereiste eigenlijk een verkapt procesprobleem? Een distributeur uit Rotterdam vroeg ons ooit om een complexe goedkeuringsworkflow met drie niveaus voor inkooporders te bouwen. Toen we de daadwerkelijke goedkeuringen in kaart brachten, bleken twee van de drie niveaus te bestaan vanwege een controlezwakte in een legacysysteem die Odoo al had geëlimineerd. De oplossing was een configuratiewijziging en een beleidsupdate, geen module.
Pas wanneer die drie deuren gesloten zijn, verdient maatwerkontwikkeling zijn plaats.
Anatomie van een goed gebouwde Odoo-module
Een Odoo-module is een map met Python- en XML-bestanden die Odoo bij het opstarten laadt. Een overzichtelijke structuur ziet er ongeveer zo uit:
my_company_quality/
├── __init__.py
├── __manifest__.py
├── models/
│ ├── __init__.py
│ └── quality_check.py
├── views/
│ └── quality_check_views.xml
├── security/
│ ├── ir.model.access.csv
│ └── quality_security.xml
├── data/
│ └── quality_data.xml
├── report/
├── static/
└── tests/
└── test_quality_check.py
my_company_quality/
├── __init__.py
├── __manifest__.py
├── models/
│ ├── __init__.py
│ └── quality_check.py
├── views/
│ └── quality_check_views.xml
├── security/
│ ├── ir.model.access.csv
│ └── quality_security.xml
├── data/
│ └── quality_data.xml
├── report/
├── static/
└── tests/
└── test_quality_check.py
Het bestand __manifest__.py declareert de naam, versie, afhankelijkheden en databestanden van uw module. Het correct instellen van afhankelijkheden is enorm belangrijk: het declareren van depends: ['stock', 'mrp'] vertelt Odoo de laadvolgorde en garandeert dat de modellen die u uitbreidt daadwerkelijk bestaan.
Uitbreiden, niet vervangen
Het allerbelangrijkste principe bij Odoo-ontwikkeling is overerving (inheritance). Odoo biedt u drie mechanismen:
- Klassieke overerving (
_inherit) — voeg velden en methoden toe aan een bestaand model. Dit gebruikt u 90% van de tijd. Het toevoegen van een veldx_customs_codeaanproduct.templatekost vier regels. - Prototype-overerving (
_inherit+_name) — kopieer de structuur van een bestaand model naar een nieuw model. - Delegatie (
_inherits) — bed één model in een ander in, zoalsres.usersdelegeert aanres.partner.
Gebruik voor weergaven op XPath gebaseerde view-overerving in plaats van complete weergaven te vervangen. Als u het volledige verkooporderformulier overschrijft, verdwijnt elke toekomstige Odoo-verbetering aan dat formulier, en zal elke andere module die het formulier raakt in conflict komen met de uwe.
Een concreet voorbeeld — een veld toevoegen aan het verkooporderformulier:
<record id="view_order_form_inherit" model="ir.ui.view">
<field name="name">sale.order.form.customs</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='client_order_ref']" position="after">
<field name="x_export_declaration_ref"/>
</xpath>
</field>
</record>
<record id="view_order_form_inherit" model="ir.ui.view">
<field name="name">sale.order.form.customs</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='client_order_ref']" position="after">
<field name="x_export_declaration_ref"/>
</xpath>
</field>
</record>
Klein, chirurgisch precies, en het overleeft upgrades.
Wijzig nooit de kerncode
Het verdient herhaling, want het gebeurt nog steeds: bestanden in Odoo's addons-map rechtstreeks bewerken is de snelste manier om uw systeem onupgradebaar en onondersteunbaar te maken. Elke aanpassing hoort thuis in uw eigen modulemap, bijgehouden in Git.
De Europese compliance-laag
Voor mkb-bedrijven in de Benelux en Scandinavië is een groot deel van de maatwerkontwikkeling compliance-gedreven, en dat is precies waar lokale expertise zichzelf terugverdient.
E-facturatie is de grote. België heeft gestructureerde e-facturatie voor B2B-transacties vanaf januari 2026 verplicht gesteld. Nederland, Noorwegen, Denemarken, Zweden en Finland opereren allemaal binnen het Peppol-netwerk, elk met eigen profielvereisten. Odoo heeft sterke native Peppol-ondersteuning, maar het correct koppelen van uw productcatalogus, belastingcodes en klantstamgegevens aan een geldig UBL-document is echt projectwerk.
AVG (GDPR) bepaalt mede het ontwerp van uw datamodel. Als uw aangepaste module persoonsgegevens opslaat — sollicitantendossiers, klantenservicelogs, functioneringsaantekeningen — heeft u bewaartermijnen, een verdedigbare rechtsgrondslag en een daadwerkelijk mechanisme voor verwijderverzoeken nodig. active-vlaggen en archiveringslogica vanaf dag één inbouwen is veel goedkoper dan het er later bij te bouwen.
Lokale boekhouding en salarisverwerking verschillen wezenlijk. Nederlandse btw-aangiftes, Belgische Intervat-aangiftes, Noorse SAF-T-exports en de Zweedse bokföringslagen-archiveringsvereisten hebben elk specifieke kenmerken die een generieke module niet dekt. Gebruik de lokalisatiemodules die Odoo en OCA onderhouden, en bouw daarop voort.
Meertaligheid en meerdere valuta zijn in deze markten vrijwel universele vereisten. Zorg dat elke tekst die de gebruiker ziet vertaalbaar is, en hardcode nooit valutalogica — gebruik de conversiemethoden van Odoo's res.currency.
Testen, uitrol en de upgradevraag
Aangepaste modules hebben geautomatiseerde tests nodig. Odoo's testframework (gebouwd op Python's unittest) laat u tests schrijven die tegen een tijdelijke database draaien. Een testsuite die uw bedrijfslogica dekt, maakt van de jaarlijkse upgrade geen week handmatig klikwerk meer, maar een paar uur falende tests beoordelen.
Werk met minimaal drie omgevingen: ontwikkeling, staging (een recente kopie van de productiedata) en productie. Rol uit via Git, niet door bestanden naar een server te kopiëren. Odoo.sh biedt dit standaard; zelf gehoste opstellingen kunnen hetzelfde bereiken met Docker en een bescheiden CI-pijplijn.
Over upgrades: Odoo brengt jaarlijks een grote versie uit en ondersteunt elke versie ongeveer drie jaar. De realistische kosten van een upgrade zijn recht evenredig met hoeveel maatwerkcode u meedraagt en hoe netjes die geschreven is. Modules die met correcte overerving zijn gebouwd, hebben doorgaans slechts kleine aanpassingen nodig. Modules die kerngedrag overschrijven, moeten vaak worden herschreven.
Waar externe expertise de rekensom verandert
Veel mkb-bedrijven beginnen met een interne ontwikkelaar die Odoo al doende leert. Dat werkt voor eenvoudige veldtoevoegingen. Het wordt kostbaar zodra de vereisten raken aan boekhoudkundige engines, voorraadwaardering, of de prestatiekenmerken van de ORM — gebieden waar Odoo niet-voor-de-hand-liggende conventies hanteert en waar fouten pas maanden later opduiken als reconciliatiefouten.
De praktische middenweg waar de meeste van onze klanten op uitkomen: haal gespecialiseerde ondersteuning binnen om de architectuur, coderingsstandaarden, testopzet en uitrolpijplijn neer te zetten, en geef de dagelijkse iteratie daarna met periodieke review aan het interne team. Zo krijgt u de snelheid van eigen beheer, zonder een codebase te erven die uw volgende upgrade blokkeert.
Bij GEC Business Growth Services helpen wij mkb-bedrijven in de Benelux en Scandinavië om Odoo goed neer te zetten — van het bepalen welke aanpassingen daadwerkelijk hun geld waard zijn, tot het bouwen van upgrade-veilige modules en lokalisatie voor e-facturatie en regionale compliance. Plant u een Odoo-implementatie, of worstelt u met geërfde maatwerkcode? We kijken graag met u mee.