Reference · Tools

Odoo

Interact with the Odoo ERP platform via its JSON-RPC 2.0 API to manage contacts, opportunities, notes, and custom resources

Action Data & Storage v1

The Odoo node reaches into an Odoo ERP instance over JSON-RPC to manage contacts, opportunities, notes and custom resources — including the models specific to your own installation. A typical build is creating an opportunity in Odoo when a qualified lead arrives from a form.

Node type
Action
Parameters
38
Outputs
Output, Error
Credentials
Odoo API

Odoo

Manage contacts, opportunities, notes, and custom resources in Odoo ERP

Overview

Odoo is an open-source ERP and CRM platform. This tool uses the Odoo JSON-RPC 2.0 API to perform CRUD operations on Odoo models. It supports built-in resources (Contact, Opportunity, Note) as well as any custom Odoo model. Authentication uses the Odoo login endpoint to obtain a user ID, which is then included in all subsequent data operation requests. The tool supports filtering for list operations on custom resources, and field selection to limit returned data.

Category: Data & Storage
Tool Name: odoo
Version: 1

Appearance: Icon: si-odoo | Color: #714B67

Node Type

Action — processes input items and produces output

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires Odoo API credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Contactcontact
Custom Resourcecustom
Notenote
Opportunityopportunity

Operations

Each resource carries its own operation selector, and all four offer the same five operations. Choose the resource first, then the operation.

ResourceOperationValueDescription
ContactCreatecreateCreate a contact
ContactDeletedeleteDelete a contact by ID
ContactGetgetRead one contact by ID
ContactGet ManygetAllSearch contacts and return the matches
ContactUpdateupdateUpdate a contact by ID
Custom ResourceCreatecreateCreate a record in any Odoo model
Custom ResourceDeletedeleteDelete a record by ID
Custom ResourceGetgetRead one record by ID
Custom ResourceGet ManygetAllSearch records and return the matches
Custom ResourceUpdateupdateUpdate a record by ID
NoteCreatecreateCreate a note
NoteDeletedeleteDelete a note by ID
NoteGetgetRead one note by ID
NoteGet ManygetAllSearch notes and return the matches
NoteUpdateupdateUpdate a note by ID
OpportunityCreatecreateCreate a CRM opportunity
OpportunityDeletedeleteDelete an opportunity by ID
OpportunityGetgetRead one opportunity by ID
OpportunityGet ManygetAllSearch opportunities and return the matches
OpportunityUpdateupdateUpdate an opportunity by ID

Parameters

Collection sub-fields carry their internal name in backticks, because that name — not the label — is the key you write in a JSON configuration.

Contact: Create

ParameterTypeRequiredDefaultDescription
Name (contactName)stringYesThe name of the contact to create. Supports expressions like {{ $json.name }}.
Additional FieldscollectionNo{}Additional fields for the new contact.
— Address (address)fixedCollectionNo{}The contact’s address. Each sub-field below is written to Odoo as its own address field on the contact.
— — City (city)stringNoCity name.
— — Country ID (country_id)numberNoNumeric ID of the country in Odoo. Find in Odoo: Contacts > Configuration > Localization > Countries.
— — State ID (state_id)numberNoNumeric ID of the state/province in Odoo. Find in Odoo: Contacts > Configuration > Localization > Fed. States.
— — Street (street)stringNoFirst address line.
— — Street 2 (street2)stringNoSecond address line.
— — Zip Code (zip)stringNoPostal code.
— Email (email)stringNoEmail address.
— Internal Notes (comment)stringNoFree-text notes stored on the contact.
— Job Position (function)stringNoJob title.
— Mobile (mobile)stringNoMobile phone number.
— Phone (phone)stringNoPhone number.
— Tax ID (vat)stringNoTax identification (VAT) number.
— Website (website)stringNoWebsite URL.

Contact: Delete

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe numeric ID of the contact. Supports expressions like {{ $json.contactId }}.

Contact: Get

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe numeric ID of the contact. Supports expressions like {{ $json.contactId }}.
OptionscollectionNo{}Additional options for the request.
— Fields to Include (fieldsList)stringNoComma-separated list of field names to return (e.g. “name,email,phone”). Leave empty to return all fields. Find field names in Odoo Settings > Technical > Database Structure > Models > select model > Fields tab.

Contact: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo50Max number of results to return. (shown when Return All is false)
OptionscollectionNo{}Additional options for the request.
— Fields to Include (fieldsList)stringNoComma-separated list of field names to return (e.g. “name,email,phone”). Leave empty to return all fields. Find field names in Odoo Settings > Technical > Database Structure > Models > select model > Fields tab.

Contact: Update

ParameterTypeRequiredDefaultDescription
Contact IDstringYesThe numeric ID of the contact to update. Supports expressions like {{ $json.contactId }}.
Update Fields (updateFields)collectionNo{}Fields to update on the contact.
— Address (address)fixedCollectionNo{}The contact’s address. Each sub-field below is written to Odoo as its own address field on the contact.
— — City (city)stringNoCity name.
— — Country ID (country_id)numberNoNumeric ID of the country in Odoo.
— — State ID (state_id)numberNoNumeric ID of the state/province in Odoo.
— — Street (street)stringNoFirst address line.
— — Street 2 (street2)stringNoSecond address line.
— — Zip Code (zip)stringNoPostal code.
— Email (email)stringNoEmail address.
— Internal Notes (comment)stringNoFree-text notes stored on the contact.
— Job Position (function)stringNoJob title.
— Mobile (mobile)stringNoMobile phone number.
— Name (name)stringNoNew name for the contact.
— Phone (phone)stringNoPhone number.
— Tax ID (vat)stringNoTax identification (VAT) number.
— Website (website)stringNoWebsite URL.

Custom Resource: Create

ParameterTypeRequiredDefaultDescription
Custom Resource ModelstringYesThe Odoo model name to operate on (e.g. “sale.order”, “product.product”, “account.move”). Find available models in Odoo Settings > Technical > Database Structure > Models. Supports expressions like {{ $json.model }}.
Fields (fieldsToCreateOrUpdate)fixedCollectionNo{}Field name-value pairs for the new record. Field names must match Odoo model field names (e.g. “name”, “email”, “partner_id”).
— Field Name (fieldName)stringNoThe Odoo field name. Find available fields in Odoo: Settings > Technical > Database Structure > Models > select model > Fields tab.
— New Value (fieldValue)stringNoThe value to set for this field.

Custom Resource: Delete

ParameterTypeRequiredDefaultDescription
Custom Resource ModelstringYesThe Odoo model name to operate on (e.g. “sale.order”, “product.product”, “account.move”). Find available models in Odoo Settings > Technical > Database Structure > Models. Supports expressions like {{ $json.model }}.
Custom Resource IDstringYesThe numeric ID of the record. Supports expressions like {{ $json.recordId }}.

Custom Resource: Get

ParameterTypeRequiredDefaultDescription
Custom Resource ModelstringYesThe Odoo model name to operate on (e.g. “sale.order”, “product.product”, “account.move”). Find available models in Odoo Settings > Technical > Database Structure > Models. Supports expressions like {{ $json.model }}.
Custom Resource IDstringYesThe numeric ID of the record. Supports expressions like {{ $json.recordId }}.
OptionscollectionNo{}Additional options for the request.
— Fields to Include (fieldsList)stringNoComma-separated list of field names to return. Leave empty to return all fields. Field names depend on the selected custom resource model.

Custom Resource: Get Many

ParameterTypeRequiredDefaultDescription
Custom Resource ModelstringYesThe Odoo model name to operate on (e.g. “sale.order”, “product.product”, “account.move”). Find available models in Odoo Settings > Technical > Database Structure > Models. Supports expressions like {{ $json.model }}.
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo50Max number of results to return. (shown when Return All is false)
OptionscollectionNo{}Additional options for the request.
— Fields to Include (fieldsList)stringNoComma-separated list of field names to return. Leave empty to return all fields. Field names depend on the selected custom resource model.
FiltersfixedCollectionNo{}Filter conditions for the search. Each filter has a field name, operator, and value.
— Field Name (fieldName)stringNoThe Odoo field name to filter on.
— Operator (operator)optionsNoequalThe comparison operator.
Options: equal (=), notEqual (!=), greaterThen (>), lesserThen (<), greaterOrEqual (>=), lesserOrEqual (<=), like, in, notIn (not in), childOf (child of)
— Value (value)stringNoThe value to compare against.

Custom Resource: Update

ParameterTypeRequiredDefaultDescription
Custom Resource ModelstringYesThe Odoo model name to operate on (e.g. “sale.order”, “product.product”, “account.move”). Find available models in Odoo Settings > Technical > Database Structure > Models. Supports expressions like {{ $json.model }}.
Custom Resource IDstringYesThe numeric ID of the record to update. Supports expressions like {{ $json.recordId }}.
Update Fields (fieldsToCreateOrUpdate)fixedCollectionNo{}Field name-value pairs to update on the record.
— Field Name (fieldName)stringNoThe Odoo field name to update.
— New Value (fieldValue)stringNoThe new value for this field.

Note: Create

ParameterTypeRequiredDefaultDescription
MemostringYesThe content of the note. Supports expressions like {{ $json.body }}.

Note: Delete

ParameterTypeRequiredDefaultDescription
Note IDstringYesThe numeric ID of the note. Supports expressions like {{ $json.noteId }}.

Note: Get

ParameterTypeRequiredDefaultDescription
Note IDstringYesThe numeric ID of the note. Supports expressions like {{ $json.noteId }}.
OptionscollectionNo{}Additional options for the request.
— Fields to Include (fieldsList)stringNoComma-separated list of field names to return (e.g. “memo,create_date”). Leave empty to return all fields.

Note: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo50Max number of results to return. (shown when Return All is false)
OptionscollectionNo{}Additional options for the request.
— Fields to Include (fieldsList)stringNoComma-separated list of field names to return (e.g. “memo,create_date”). Leave empty to return all fields.

Note: Update

ParameterTypeRequiredDefaultDescription
Note IDstringYesThe numeric ID of the note to update. Supports expressions like {{ $json.noteId }}.
MemostringYesThe updated content of the note. Supports expressions like {{ $json.body }}.

Opportunity: Create

ParameterTypeRequiredDefaultDescription
Name (opportunityName)stringYesThe name of the opportunity to create. Supports expressions like {{ $json.dealName }}.
Additional FieldscollectionNo{}Additional fields for the new opportunity.
— Email (email_from)stringNoContact email address for the opportunity.
— Expected Revenue (expected_revenue)numberNo0Expected revenue for the deal.
— Internal Notes (description)stringNoFree-text description stored on the opportunity.
— Phone (phone)stringNoContact phone number.
— Priority (priority)optionsNo1Priority of the opportunity.
Options: 1, 2, 3
— Probability (probability)numberNo0Win probability, from 0 to 100.

Opportunity: Delete

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYesThe numeric ID of the opportunity. Supports expressions like {{ $json.opportunityId }}.

Opportunity: Get

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYesThe numeric ID of the opportunity. Supports expressions like {{ $json.opportunityId }}.
OptionscollectionNo{}Additional options for the request.
— Fields to Include (fieldsList)stringNoComma-separated list of field names to return (e.g. “name,email_from,expected_revenue”). Leave empty to return all fields.

Opportunity: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo50Max number of results to return. (shown when Return All is false)
OptionscollectionNo{}Additional options for the request.
— Fields to Include (fieldsList)stringNoComma-separated list of field names to return (e.g. “name,email_from,expected_revenue”). Leave empty to return all fields.

Opportunity: Update

ParameterTypeRequiredDefaultDescription
Opportunity IDstringYesThe numeric ID of the opportunity to update. Supports expressions like {{ $json.opportunityId }}.
Update Fields (updateFields)collectionNo{}Fields to update on the opportunity.
— Email (email_from)stringNoContact email address for the opportunity.
— Expected Revenue (expected_revenue)numberNo0Expected revenue for the deal.
— Internal Notes (description)stringNoFree-text description stored on the opportunity.
— Name (name)stringNoNew name for the opportunity.
— Phone (phone)stringNoContact phone number.
— Priority (priority)optionsNo1Priority of the opportunity.
Options: 1, 2, 3
— Probability (probability)numberNo0Win probability, from 0 to 100.

All Operations

ParameterTypeRequiredDefaultDescription
Max ConcurrencynumberNo10Maximum number of items to process concurrently.

Output Data

The Odoo record is the output item. Whatever the API returns is merged into the item JSON at the top level, so a record field named email is addressable downstream as {{ $json.email }}. The rest of the input item’s JSON passes through unchanged except where a record field overwrites it, and binary data is forwarded.

OperationFields merged onto the output itemItems produced per input item
createid — the numeric ID Odoo assigned to the new recordOne
getThe record’s fields, or only the ones named in Fields to IncludeOne
getAllEach matching record’s fields, or only the ones named in Fields to IncludeOne per matching record — a Get Many that finds 200 records turns one input item into 200 output items. No matches yields a single item with its JSON unchanged
updateid — the ID of the record that was updatedOne
deletesuccess (true)One

Two things to plan around:

  • Get Many fans out. Every downstream node sees one item per record, not one item holding an array. Set Return All off and use Limit while you are building, then switch it on once the shape of the data is settled.
  • ID parameters are numeric strings. Contact ID, Opportunity ID, Note ID and Custom Resource ID must resolve to a whole number; anything else fails that item before the request is sent.

Usage Examples

  • Create a new contact in Odoo
  • List all CRM opportunities
  • Update an Odoo note by ID
  • Delete a custom resource record
  • Get all contacts with specific fields

Example Configuration

Create a contact with an address and the usual detail fields:

{
  "type": "odoo",
  "parameters": {
    "resource": "contact",
    "operation": "create",
    "contactName": "John Doe",
    "additionalFields": {
      "email": "john.doe@example.com",
      "phone": "+1-555-0123",
      "mobile": "+1-555-0124",
      "function": "Sales Manager",
      "website": "https://example.com",
      "vat": "US123456789",
      "comment": "Important client contact",
      "address": {
        "value": {
          "street": "123 Main St",
          "street2": "Suite 100",
          "city": "New York",
          "state_id": 47,
          "zip": "10001",
          "country_id": 233
        }
      }
    }
  }
}

Read one contact and return only the fields you care about:

{
  "type": "odoo",
  "parameters": {
    "resource": "contact",
    "operation": "get",
    "contactId": "123",
    "options": {
      "fieldsList": "name,email,phone,mobile"
    }
  }
}

List the first 50 contacts:

{
  "type": "odoo",
  "parameters": {
    "resource": "contact",
    "operation": "getAll",
    "returnAll": false,
    "limit": 50,
    "options": {
      "fieldsList": "name,email,phone"
    }
  }
}

Update a contact, including its address:

{
  "type": "odoo",
  "parameters": {
    "resource": "contact",
    "operation": "update",
    "contactId": "123",
    "updateFields": {
      "name": "John Smith",
      "email": "john.smith@example.com",
      "phone": "+1-555-9999",
      "mobile": "+1-555-8888",
      "function": "Senior Sales Manager",
      "website": "https://newsite.com",
      "vat": "US987654321",
      "comment": "Updated contact information",
      "address": {
        "value": {
          "street": "456 Oak Ave",
          "street2": "Floor 5",
          "city": "Boston",
          "state_id": 22,
          "zip": "02101",
          "country_id": 233
        }
      }
    }
  }
}

Delete a contact:

{
  "type": "odoo",
  "parameters": {
    "resource": "contact",
    "operation": "delete",
    "contactId": "123"
  }
}

Create a CRM opportunity:

{
  "type": "odoo",
  "parameters": {
    "resource": "opportunity",
    "operation": "create",
    "opportunityName": "Big Sales Deal",
    "additionalFields": {
      "email_from": "client@bigcompany.com",
      "phone": "+1-555-0200",
      "expected_revenue": 50000,
      "probability": 75,
      "priority": "2",
      "description": "Major client interested in our enterprise solution"
    }
  }
}

Read one opportunity:

{
  "type": "odoo",
  "parameters": {
    "resource": "opportunity",
    "operation": "get",
    "opportunityId": "456",
    "options": {
      "fieldsList": "name,expected_revenue,probability,stage_id"
    }
  }
}

Move an opportunity forward:

{
  "type": "odoo",
  "parameters": {
    "resource": "opportunity",
    "operation": "update",
    "opportunityId": "456",
    "updateFields": {
      "name": "Confirmed Big Sales Deal",
      "expected_revenue": 75000,
      "probability": 90,
      "priority": "3",
      "description": "Deal confirmed, moving to final negotiations"
    }
  }
}

Create a note:

{
  "type": "odoo",
  "parameters": {
    "resource": "note",
    "operation": "create",
    "memo": "Important meeting notes from client call on 2024-01-15"
  }
}

Replace a note’s content:

{
  "type": "odoo",
  "parameters": {
    "resource": "note",
    "operation": "update",
    "noteId": "789",
    "memo": "Updated meeting notes with additional action items"
  }
}

Create a record in a model that has no built-in resource — here a sales order:

{
  "type": "odoo",
  "parameters": {
    "resource": "custom",
    "customResource": "sale.order",
    "operation": "create",
    "fieldsToCreateOrUpdate": {
      "fields": [
        { "fieldName": "partner_id", "fieldValue": "123" },
        { "fieldName": "date_order", "fieldValue": "2024-01-15" },
        { "fieldName": "amount_total", "fieldValue": "1500.00" }
      ]
    }
  }
}

Search a custom model with two filter conditions:

{
  "type": "odoo",
  "parameters": {
    "resource": "custom",
    "customResource": "product.product",
    "operation": "getAll",
    "returnAll": false,
    "limit": 20,
    "options": {
      "fieldsList": "name,default_code,list_price,categ_id"
    },
    "filterRequest": {
      "filter": [
        { "fieldName": "active", "operator": "equal", "value": "true" },
        { "fieldName": "list_price", "operator": "greaterThen", "value": "100" }
      ]
    }
  }
}

Update a record in a custom model:

{
  "type": "odoo",
  "parameters": {
    "resource": "custom",
    "customResource": "account.move",
    "operation": "update",
    "customResourceId": "999",
    "fieldsToCreateOrUpdate": {
      "fields": [
        { "fieldName": "ref", "fieldValue": "INV/2024/001" },
        { "fieldName": "invoice_date", "fieldValue": "2024-01-15" },
        { "fieldName": "state", "fieldValue": "posted" }
      ]
    }
  }
}

Error Handling

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes failed items to Error output port

Tips

Manage contacts, opportunities, notes, and custom resources in the Odoo ERP platform via JSON-RPC.

Error Prevention

  • Always verify field names match Odoo model definitions
  • Ensure numeric IDs are passed as strings for ID parameters
  • Use proper data types for field values (strings for text, numbers for numeric fields)

Frequently asked questions

Can it work with custom Odoo models?

Yes — alongside contacts, opportunities and notes it supports custom resources, which matters because most Odoo installations carry models unique to that business.

Why is my field being rejected?

Field names must match the Odoo model definitions exactly. Verify against the model rather than assuming the label shown in the Odoo interface is the field name.

How should IDs and values be typed?

Numeric IDs need to be passed as strings for ID parameters, and field values should use the proper type — strings for text, numbers for numeric fields.

Which credential does it need?

An Odoo API credential with the instance URL, database and user details.

Build with the Odoo node

Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Odoo API credentials first.

Open BusyBot

Last updated . Spotted something wrong? Tell us.