Skip to content

Decision Matrix

Quick Reference Guide

This page provides decision matrices for common Odoo configuration choices. Use these tables when you need to quickly determine the right approach for a given scenario.

Field Type Decision

Basic Field Types

If You Need To Store...Use This Field TypeExample
Short text (name, reference, email)CharCustomer name, order reference
Long text (description, notes)TextProduct description, internal notes
Formatted text (HTML emails, descriptions)HtmlEmail templates, rich descriptions
Whole numbers (quantity, count)IntegerStock quantity, number of employees
Decimal numbers (weight, percentage)FloatWeight in kg, discount percentage
Money amountsMonetary (with currency field)Price, total amount
Yes/No choiceBooleanIs active, is published
Date onlyDateBirth date, expiry date
Date with timeDatetimeOrder timestamp, meeting time
Fixed list of choicesSelectionStatus, priority, type
File attachmentBinaryPDF documents, spreadsheets
ImageImageProduct photo, company logo

Relational Field Types

If You Need To...Use This Field TypeExample
Link to ONE other recordMany2oneOrder → Customer
Show child records (list)One2manyOrder → Order Lines
Link to MANY other records (tags)Many2manyProduct → Categories
Display value from linked recordRelated fieldShow customer country on order
Calculate value from other fieldsComputed fieldTotal = qty × price

Special Field Types

If You Need...Use ThisNotes
Different values per companycompany_dependent=TrueProduct cost varies by company
Dynamic custom fields per parentProperties fieldDifferent project task attributes
Searchable file contentChar + attachmentStore filename, attach file separately
JSON/structured dataJson fieldFlexible structured data

Storage Decision

Scenariostore=True?Reason
Field shown in list views✅ YesAvoid N+1 queries
Field used in Group By✅ YesRequired by database
Field used in filters/search✅ YesBetter search performance
Field used in reports✅ YesFaster report generation
Field only shown on form⚠️ MaybeDepends on complexity
Value changes frequently (age, days left)❌ NoWould need constant recalculation
Simple display from related record❌ NoUnless needed for reports
Context-dependent value (stock by location)❌ NoCannot store - value varies

Storage Decision Flowchart

mermaid
graph TD
    A[New Computed/Related Field] --> B{Shown in List View?}
    B -->|Yes| S[store=True]
    B -->|No| C{Used in Group By?}
    C -->|Yes| S
    C -->|No| D{Used in Filters?}
    D -->|Yes| S
    D -->|No| E{Used in Reports?}
    E -->|Yes| S
    E -->|No| F{Context-Dependent?}
    F -->|Yes| N[store=False]
    F -->|No| G{Form View Only?}
    G -->|Yes| N
    G -->|No| S

Relationship Decision

Choosing the Right Relationship Type

Business RelationshipTechnical FieldExampleNotes
Record belongs to ONE otherMany2oneOrder → CustomerMost common relationship
Record has MANY childrenOne2manyOrder → Order LinesInverse of Many2one
Record has MANY tags/categoriesMany2manyProduct → CategoriesNo additional data needed
Many-to-many with extra dataIntermediate modelProduct ↔ Supplier (with price)Create linking model
Show value from linked recordRelated fieldCustomer country on orderConsider storing

Many2many vs Intermediate Model

QuestionMany2manyIntermediate Model
Need extra data on the link?❌ No✅ Yes
Just tagging/categorization?✅ Yes❌ Overkill
Example: Product-Tags✅ Perfect❌ Unnecessary
Example: Product-Supplier (with price)❌ Can't store price✅ Create product.supplierinfo

Widget Decision

Choosing Display Widgets

Field TypeDefault WidgetAlternativeWhen to Use Alternative
SelectionDropdownradio2-4 options, all visible
SelectionDropdownstatusbarWorkflow status in header
SelectionDropdownbadgeStatus in list view
SelectionDropdownpriorityStar-based priority
Many2oneDropdownmany2one_avatarShow image with name
Many2oneDropdownmany2one_avatar_userUser assignment
Many2manyListmany2many_tagsColorful tags
Many2manyListmany2many_checkboxesSmall fixed set
FloatNumber inputpercentageShow as %
FloatNumber inputprogressbarVisual progress
CharText inputemailClickable email
CharText inputphoneClickable phone
CharText inputurlClickable link
BinaryFile uploadimageDisplay as image
TextMulti-linehtmlRich text editor

Security Decision

Access Rights vs Record Rules

QuestionAccess RightsRecord Rules
Can user access the model at all?
Which records can user see?
CRUD permissions
Data filtering
Performance impactLowHigher (evaluated per record)

Record Rules vs Domains

ScenarioUse Record RuleUse Domain
Salesperson sees only their leads✅ Security
Default filter shows "Open" items✅ UX
Multi-company data isolation✅ Security
Dropdown shows only active items✅ Field domain
Privacy/legal requirement✅ Security
Helpful default filter✅ UX

Automation Decision

Choosing the Right Automation Type

RequirementServer ActionScheduled ActionAutomated Action
User triggers manually
Runs at specific time
Responds to record changes
Batch processing
Immediate response needed
Daily/weekly reports
Lead assignment on create
Bulk update selected records

Automation Trigger Decision

When should it trigger?Use This Trigger
When record is createdOn Create
When record is updatedOn Update
When specific field changesOn Update + Trigger Fields
When stage/status changesStage is set to / State is set to
X days before/after a dateBased on date field
At regular intervalsScheduled Action
When email is receivedOn incoming message
From external systemOn webhook

Integration Decision

Choosing Integration Approach

Integration NeedRecommended ApproachWhen to Use
B2B document exchangeEDI/UBL (Peppol BIS 3)Sales ↔ Purchase order automation
Generate text contentAI Agents with LLMMarketing, support, content
Extract data from documentsAI Digitization (OCR + LLM)Invoices, receipts, contracts
Real-time external syncXML-RPC / JSON-RPC APICustom integrations, webhooks
Lead scoringPredictive Lead Scoring (PLS)Sales pipeline optimization
Simple field syncAutomated Actions + WebhookLow-code external notification

API Protocol Decision

RequirementXML-RPCJSON-RPCREST (custom)
Standard Odoo operations✅ Native✅ NativeNeeds controller
External system compatibilityGoodBetterBest
PerformanceGoodGoodBest
Ease of useModerateEasyDepends
Binary data handlingSupportedSupportedNative

State vs Stage Decision

CharacteristicUse State (Selection)Use Stage (Many2one)
Fixed workflow
Users can customize
Legal/financial process
Sales pipeline
Requires code to change
Each team has different stages

Quick Decision Summary

"What field type should I use?"

Need to link to ONE record? → Many2one
Need to show child records? → One2many
Need multiple tags? → Many2many (or intermediate if extra data)
Need calculated value? → Computed
Need value from linked record? → Related
Fixed choices? → Selection
Yes/No? → Boolean
Money? → Monetary
Everything else? → Char, Text, Integer, Float, Date, Datetime

"Should this field be stored?"

In list view? → Store it
In Group By? → Store it
In search/filter? → Store it
In reports? → Store it
Context-dependent? → DON'T store
Only on form? → Probably don't need to store

"Manual action or automatic?"

User decides when? → Server Action
At specific times? → Scheduled Action
On record change? → Automated Action

Knowledge Check

Q1: User needs to group orders by customer country. What's needed?

Answer: A stored related field for country

Create a stored related field: partner_country_id = fields.Many2one(related='partner_id.country_id', store=True). Non-stored related fields can't be used for Group By.

Q2: Product can have multiple suppliers with different prices. Many2many or intermediate?

Answer: Intermediate model (product.supplierinfo)

Many2many can't store additional data like price per supplier. You need an intermediate model with Many2one to both product and supplier, plus price fields.

Q3: Send email when lead is won. Which automation type?

Answer: Automated Action with "Stage is set to" trigger

Automated Actions respond to record changes. Use the "Stage is set to" trigger with the Won stage to fire when leads are marked as won.

Q4: Daily report at 9 AM. Which automation type?

Answer: Scheduled Action

Scheduled Actions run at specified intervals. Configure to run daily at 9 AM with a Server Action that generates and sends the report.

Q5: Users should only see their own records. Record Rule or Domain?

Answer: Record Rule

Security requirements that users should NEVER bypass require Record Rules. Domains are for convenience filtering that users can change.