Odoo integration

Open-source ERP: CRM, invoicing, accounting, inventory, HR, manufacturing, projects

Help CentreConnectors

Overview

Odoo is an open-source ERP with CRM, accounting, inventory, HR, and 100+ other modules. The Automize Odoo connector exposes Odoo's generic model interface – search, read, create, update, delete on any model (res.partner, account.move, crm.lead, etc.) plus convenience endpoints for common modules.

  • Regions: Odoo Cloud (yourcompany.odoo.com) and self-hosted Community/Enterprise are both supported. Configure the base URL per connection.
  • Plans: Community is free + self-hosted. Enterprise has a SaaS + on-prem option. API access is the same on both.

Setting up the connection

Auth type: Bearer Token.

  1. In Odoo, ensure the connecting user has 'Settings → Users → Access Rights' enabled for the modules you'll automate.
  2. Generate an API key via Odoo user preferences (newer versions) – or use database + username + password.
  3. In Automize, open Settings → Connectors → Odoo → Add connection. Enter Odoo URL + database name + API key (or username + password).

Find your credentials at https://yourcompany.odoo.com/web/database/manager.


Rate limits

Self-hosted Odoo: no built-in rate limits. Cloud: rate limits per account, typically generous. Performance is bound by the database tier.


Data model

Odoo's data model is generic – every entity is a 'model' with records.
Cross-cutting fields exist on most models (create_date, write_date,
state, company_id).

    Standard models:
      res.partner       – contacts (customers, suppliers, employees)
      res.users         – Odoo user accounts
      account.move      – invoices + bills + journal entries
      sale.order        – sales orders
      purchase.order    – purchase orders
      product.product   – products
      crm.lead          – leads + opportunities
      hr.employee       – employees

Domain filters are nested lists: [['field', '=', value], ['field2', '!=', other]].

Available operations

14 operations available. Click any row to jump to its detail.

OperationCategoryWhat it does
Create RecordGeneralCreate a new record in any model
Get FieldsGeneralGet field definitions for a model (introspection)
List EmployeesGeneralList employees (hr.employee)
List InvoicesGeneralList invoices (account.move)
List CRM LeadsGeneralList CRM leads/opportunities (crm.lead)
List Partners/ContactsGeneralList contacts/customers/suppliers (res.partner)
List ProductsGeneralList products (product.product)
List Purchase OrdersGeneralList purchase orders (purchase.order)
List Sale OrdersGeneralList sale orders (sale.order)
Read RecordsGeneralRead specific records by IDs
Count RecordsGeneralCount records matching a domain filter
Search & ReadGeneralSearch records by domain filter and return fields (works on any model)
Delete RecordGeneralDelete records by IDs
Update RecordGeneralUpdate existing records by IDs

Operations

Create Record

Create a new record in any model

ParameterRequiredTypeDescription
Model modelYestext
Values valuesYestextarea

Tips

  • model + values dict. Returns the new record's ID.
  • Many-to-many fields: [[6, 0, [list_of_ids]]] (special replace command).

Get Fields

Get field definitions for a model (introspection)

ParameterRequiredTypeDescription
Model modelYestext
Attributes attributesYestext

Tips

  • Introspection – returns field definitions for a model. Use to discover what fields exist + their types.
  • attributes: ['type', 'string', 'required', 'help'] to control what's returned.

List Employees

List employees (hr.employee)

ParameterRequiredTypeDescription
Domain domainYestext
Fields fieldsYestextarea
Limit limitYesnumber

Tips

  • hr.employee. Filter by department_id, parent_id (manager), active.

List Invoices

List invoices (account.move)

ParameterRequiredTypeDescription
Domain domainYestext
Fields fieldsYestextarea
Limit limitYesnumber

Tips

  • account.move model. Filter by move_type ('out_invoice' = customer invoice, 'in_invoice' = vendor bill).
  • state: 'draft', 'posted', 'cancel'.

List CRM Leads

List CRM leads/opportunities (crm.lead)

ParameterRequiredTypeDescription
Domain domainYestext
Fields fieldsYestextarea
Limit limitYesnumber

Tips

  • crm.lead model. Filter by type ('lead' or 'opportunity'), stage_id, user_id (salesperson).

List Partners/Contacts

List contacts/customers/suppliers (res.partner)

ParameterRequiredTypeDescription
Domain domainYestext
Fields fieldsYestextarea
Limit limitYesnumber

Tips

  • Shortcut for search-read on res.partner.
  • Common domains: [['customer_rank', '>', 0]] (customers only), [['supplier_rank', '>', 0]] (suppliers only).

List Products

List products (product.product)

ParameterRequiredTypeDescription
Domain domainYestext
Fields fieldsYestextarea
Limit limitYesnumber

Tips

  • product.product is the variant. product.template is the parent. Use product.product for SKU-level.

List Purchase Orders

List purchase orders (purchase.order)

ParameterRequiredTypeDescription
Domain domainYestext
Fields fieldsYestextarea
Limit limitYesnumber

Tips

  • purchase.order model. state: 'draft', 'sent', 'purchase' (confirmed), 'done', 'cancel'.

List Sale Orders

List sale orders (sale.order)

ParameterRequiredTypeDescription
Domain domainYestext
Fields fieldsYestextarea
Limit limitYesnumber

Tips

  • sale.order model. state: 'draft', 'sent', 'sale' (confirmed), 'done', 'cancel'.

Read Records

Read specific records by IDs

ParameterRequiredTypeDescription
Model modelYestext
Ids idsYestext
Fields fieldsYestextarea

Tips

  • Read specific records by IDs. Cheaper than search-read when you have the IDs.

Count Records

Count records matching a domain filter

ParameterRequiredTypeDescription
Model modelYestext
Domain domainYestext

Tips

  • Count records matching a domain. Faster than search-read when you only need a count.

Search & Read

Search records by domain filter and return fields (works on any model)

ParameterRequiredTypeDescription
Model modelYestext
Domain domainYestext
Fields fieldsYestextarea
Limit limitYesnumber
Offset offsetYestext
Order orderYestext

Tips

  • The workhorse – search records by domain + project fields in one call.
  • domain: e.g. [['state', '=', 'sale'], ['amount_total', '>', 1000]].
  • fields: ['id', 'name', 'partner_id', 'amount_total'].
  • limit + offset for paging. order: 'create_date desc'.

Delete records by IDs

ParameterRequiredTypeDescription
Model modelYestext
Ids idsYestext

Tips

  • Delete records by IDs. Most Odoo records can't be deleted if referenced – cancel them instead.

Update Record

Update existing records by IDs

ParameterRequiredTypeDescription
Model modelYestext
Ids idsYestext
Values valuesYestextarea

Tips

  • Update records by IDs. ids array + values dict.
  • Returns true on success – no record data back.

FAQ

Domain syntax – why is it nested arrays?
Odoo uses Polish-notation logical operators: '|' (OR) and '&' (AND) prefix the operands. Default is AND between conditions. Example: ['|', ['name', '=', 'Acme'], ['email', '=', 'foo@bar.com']] = name OR email match.
Why does write succeed but the record doesn't change?
Odoo's compute fields are read-only – writing to them is silently ignored. Also access rights – your user might not have write on that model/field. Check Get Fields with attributes=['readonly'].
Many2many / One2many fields – how do I update?
Use Odoo's command tuples: (6, 0, [ids]) to replace, (4, id, 0) to add, (3, id, 0) to remove. (5, 0, 0) clears all.
Cloud vs self-hosted – same connector?
Yes. Pass the URL + database name. Cloud customers use yourcompany.odoo.com, self-hosted use your own URL.

Related connectors

See it working on your own data

Everything documented here ships with the platform – try the document tools free, or go live in 7 days.