Business Management

Odoo References: What They Are and How to Use Them

J
James Eriksson
··10 min read
Odoo references explained: business PO tracking, developer Reference fields, and 5,000+ customer success stories. Learn what type you need and how to implement them.
TL;DR
  • Odoo references mean three different things: customer PO codes on sales orders, dynamic ORM fields for developers, and 5,000+ customer success stories
  • Reference fields let a single field point to multiple model types, trading simplicity for flexibility
  • Managed Odoo hosting removes DevOps friction so you can focus on building custom modules with Reference fields at scale

"Odoo references" means three different things depending on who you are. For business users, it's a customer's tracking code on a sales order. For developers, it's a dynamic ORM field that links to multiple model types at once. For evaluators, it's the 5,000+ customer success stories on Odoo's website. This guide unpacks all three so you know which one applies to you.

What Are Odoo References? (A Quick Disambiguation)

The term "Odoo references" has caused confusion for years because Odoo uses it in at least three distinct ways. Understanding which one applies to your question is the fastest path to the answer you need.

First, there's the business reference: a customer's external tracking number. If a customer places an order and says "reference ABC-123," Odoo stores that code on the sales order so both sides can match invoices and shipments to the same transaction. It's a simple text field on SO and PO lines.

Second, there's the technical Reference field: an ORM data type in Odoo development. Unlike Many2one (which points to one model) or Many2many (which points to many records of one model), a Reference field can point to different models depending on the value. A single field might link to Sale Orders, Purchase Orders, or Manufacturing Orders. It's a powerful pattern for flexible data relationships.

Third, there's the customer reference catalog at odoo.com/customers: a showcase of 5,000+ verified customer case studies. When companies say "check Odoo's references," they mean the public proof of adoption--who uses it, in which industries, and why.

Most confusion happens because the third meaning (customer proof) is what a non-technical buyer encounters first. The first meaning (PO tracking) is what most users see daily. The second meaning (technical Reference field) is what developers think about when designing custom modules.

Odoo Business Document References: Tracking POs and Customer Orders

In sales and purchase operations, a reference is simply a code your customer gives you. They might say "This order is under PO #ABC-2024-001" or "Please use reference CUST-98765." Odoo captures this on the order document so both teams have a paper trail.

Example scenario: Your customer places an order for 100 units and gives you their internal PO number: PO-54321. You create a Sales Order in Odoo and paste "PO-54321" in the customer reference field. Now when they receive their invoice, they can easily match it back to their purchase. Your accounts team can also match it during reconciliation.

Odoo stores this as a simple text field on the Sales Order form, usually under "Other Information" or "References" tab depending on your version. You can also set a default reference format so it populates automatically for repeat customers.

Why does this matter? Because order matching and accounting reconciliation break down if PO and invoice reference numbers do not align. A mismatch means your customer cannot find the invoice in their system, leading to payment delays. For high-volume sellers, even a 2% mismatch rate becomes hundreds of manual follow-ups per month.

Most ERP systems handle this the same way--it is not an Odoo-specific feature. But Odoo makes it visible by default, which helps even small teams stay organized.

Technical Reference Fields: Dynamic Model Relations for Developers

If you are designing a custom Odoo module, you may encounter a situation where a single field needs to point to different model types. That is where fields.Reference becomes invaluable.

In standard Odoo data relationships, a Many2one field points to one specific model. An Invoice always points to a Customer. A Many2many field can point to multiple records, but all are the same model type. A One2many creates the reverse link--a Customer can have many Invoices.

A Reference field is different. It can store a pointer to any model you specify. Imagine you are building a custom "Task" model. That task should link to a Sales Order (to track fulfillment), a Purchase Order (to track vendor deliverables), or a Manufacturing Order (to track production). Rather than create three separate Many2one fields, you create one Reference field that can point to any of them.

Here is what that looks like in code:

reference_doc = fields.Reference(selection=[
    ('sale.order', 'Sales Order'),
    ('purchase.order', 'Purchase Order'),
    ('mrp.production', 'Manufacturing Order'),
])

When you store data, the field saves a tuple: ('sale.order', 123) means "Sales Order with ID 123." The first part identifies the model; the second is the record ID.

Why is this better than three separate fields? Cleaner data model. Reduced null values. Easier UI--a single "Linked Document" field instead of three fields where only one is used. Why is it riskier? Performance. Querying Reference fields requires separate database joins for each model type. Many2one is simpler and faster.

Creating a Reference Field in Odoo: Step-by-Step

If you need a Reference field in your custom module, here is the basic pattern.

Step 1: Define the Selection List

Decide which models your Reference field can point to:

from odoo import models, fields

class MyCustomTask(models.Model):
    _name = 'my.task'
    
    reference_doc = fields.Reference(
        selection=[
            ('sale.order', 'Sales Order'),
            ('purchase.order', 'Purchase Order'),
            ('account.invoice', 'Invoice'),
        ],
        string='Linked Document'
    )

Step 2: Display in Views

In your form view, add the field:

<field name="reference_doc"/>

The UI will render as a dropdown (to pick model type) plus a record picker (to select which record).

Step 3: Query in Code

If you need to access the linked document programmatically:

task = self.env['my.task'].browse(task_id)
if task.reference_doc:
    model_name, record_id = task.reference_doc.split(',')
    linked_record = self.env[model_name].browse(int(record_id))
    print(f"Linked to {linked_record.name}")

Step 4: Dynamic Selection (Advanced)

If your selection list should change based on context, use a method:

def _get_reference_models(self):
    return [
        ('sale.order', 'Sales Order'),
        ('purchase.order', 'Purchase Order'),
    ]

reference_doc = fields.Reference(
    selection=_get_reference_models,
    string='Linked Document'
)

Common mistakes: Forgetting to save the Reference field value as a tuple. Querying without checking if the linked record exists (deletions can orphan references). Using Reference fields for high-frequency lookups when performance will degrade.

Customer Case Study References: Why Odoo Customers Matter

The third meaning of "Odoo references" is what you see when evaluating whether Odoo is right for your company: the customer success stories.

Odoo publishes a public catalog at odoo.com/customers with 5,000+ verified customer case studies. You can filter by industry (Retail, Manufacturing, Distribution) and geography. Each entry includes a brief overview of how the customer uses Odoo, sometimes with quantified results.

Why does this matter as an evaluation tool? Because Odoo is highly configurable. A generic feature list does not tell you whether the tool works for your use case. Customer references do. If you run a mid-market manufacturer in Germany, you can search and see other German manufacturers using Odoo. Their successes are far more relevant than Odoo's marketing claims.

Odoo has 28+ million users globally across all instances. But the customer references showcase is smaller--5,000+ case studies--because only satisfied customers agree to be listed. This selection bias works in your favor: you are seeing proof of successful implementation, not the average customer.

Some customers also publish detailed blog posts on their implementations, often more honest about challenges than official case studies. When evaluating Odoo, ask for reference customers in your industry and size. A reference call (speaking directly to another customer) is one of the fastest ways to validate fit.

When to Use Reference Fields vs. Other Relational Fields

If you are writing custom Odoo code, you need to pick the right relational field for your data model.

Use Many2one when a record belongs to exactly one parent (a Sales Order belongs to one Customer). It is the fastest join and simplest to query. Use it when the relationship is stable and the parent model does not change frequently.

Use Many2many when a record can link to many others, and vice versa (a Project has many Team Members, and a Team Member works on many Projects). Use it for flexible, symmetric relationships.

Use One2many when you need the reverse of a Many2one (a Customer has many Sales Orders). Use it when you rarely query both sides with the same frequency.

Use Reference when a single field must point to different model types (a Task can link to SO, PO, or MO). Use it when you cannot predict the model type at design time and can accept the performance cost. Use it when the linked record is optional or rarely queried in bulk.

Decision framework: Start with Many2one. Only move to Reference if you have three or more possible parent models and no way to consolidate them.

Next Steps: Running Odoo and Leveraging References in Production

Now that you understand what Odoo references are, the next question is how to actually run Odoo so you can use them.

Odoo can run three ways: Odoo.sh (official SaaS, $25-50/user/month depending on modules) gives you zero DevOps overhead. Self-hosted on your own servers gives you full control but requires DevOps expertise. Managed hosting (like Opsily's Odoo hosting) runs Odoo on your behalf, giving you custom code freedom without DevOps burden.

For most growing companies, managed hosting sits between Odoo.sh and self-hosted. You do not pay per user, so costs are predictable. You avoid hiring a full-time DevOps engineer. And you keep the ability to build custom Reference fields without waiting for Odoo to release a feature.

The choice matters most if you plan to build custom modules with complex data relationships like Reference fields. Self-hosted leaves all tuning to you. Managed hosting optimizes for custom development so you can focus on business logic.

When you do decide to host Odoo, the platform you choose shapes how easily you can implement and scale features like Reference fields. Platforms optimized for custom Odoo development make it frictionless to deploy Reference fields at scale. Platforms that discourage customization will slow you down.

Frequently Asked Questions

Who are Odoo's top clients? Odoo publishes 5,000+ customer case studies on odoo.com/customers, but does not officially rank them. Notable mentions include manufacturers, retailers, and distributors in Europe and North America. The company does not disclose its largest customer by revenue.

What does Odoo stand for? Odoo stands for nothing--it is simply "Odoo," a rebranding from "OpenERP" (Open Enterprise Resource Planning) in 2012. The name change reflected the move toward a broader, more modular platform.

What is the disadvantage of using Odoo? Odoo's main trade-off is customization complexity. Out-of-the-box it covers most business processes. But heavy customization (like building Reference field relationships across many models) requires Python development and can become expensive. Odoo is also less widely adopted in North America than in Europe or Africa, so local consulting support is harder to find depending on region.

Is Odoo a billion-dollar company? Odoo SA is private and does not disclose revenue or valuation. Based on reported growth and funding announcements, it is likely valued in the hundreds of millions, but there is no public confirmation it has crossed a billion-dollar valuation.

Is Odoo popular in the USA? Odoo has a growing US presence but remains more popular in Europe, Africa, and Asia. Larger US companies often prefer SAP or Oracle. Mid-market US companies are increasingly adopting Odoo. The gap is narrowing as Odoo improves vertical solutions for manufacturing and retail.

Who is the CEO of Odoo? Fabien Pinckaers is the founder and CEO of Odoo. He founded the company (originally OpenERP) in 2005 and remains its public face and strategic leader.

The Bottom Line

"Odoo references" has three meanings: a business code on a purchase order, a flexible ORM field for developers, and a catalog of customer success stories. Which one applies to you depends on whether you are a business user, developer, or evaluator.

If you are building custom modules with Reference fields at scale, your hosting choice matters. A platform optimized for custom Odoo development will handle the complexity better than a generic server.

Start by exploring Odoo's customer references to validate that the tool fits your needs, then contact us to discuss running Odoo efficiently.

Get Odoo Running Without DevOps
Opsily handles Odoo hosting, updates, and scaling so you focus on business logic and custom development.
Get Started Free

Ready to self-host your own apps?

One server. Multiple apps. No per-app fees.

Get started →
Odoo References: What They Are and How to Use Them