<!-- BusyBot node reference — https://busybot.net/tools/zoho/ -->

> Node: Zoho CRM (`zoho`) · Action · v1
> Category: Sales · Credentials: Zoho OAuth2 (`zohoOAuth2`)
> Updated: 2026-08-16

# Zoho CRM

> Manage Zoho CRM records: accounts, contacts, deals, leads, invoices, products, purchase orders, quotes, sales orders, vendors.

## Overview

Zoho CRM is a cloud-based customer relationship management platform. This tool provides full CRUD and upsert operations across 10 CRM modules (accounts, contacts, deals, leads, invoices, products, purchase orders, quotes, sales orders, vendors) using the Zoho CRM API v2. Supports regional data centers (.com, .eu, .in, .com.au, .jp), OAuth2 authentication with automatic token refresh, pagination for listing operations, custom fields, address field flattening, and date formatting. All write operations wrap payloads in the Zoho data array format. Pagination uses page-based approach with per_page=200.

**Category:** Sales  
**Tool Name:** `zoho`  
**Version:** 1

**Appearance:** Icon: `si-zoho` | Color: `#CE2232`

## Node Type

**Action** — processes input items and produces output

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Output`, `Error` |

## Credentials

This tool requires **Zoho OAuth2** credentials.
See the [Credentials Guide](https://busybot.net/credentials/zoho-oauth2/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Account | `account` |
| Contact | `contact` |
| Deal | `deal` |
| Invoice | `invoice` |
| Lead | `lead` |
| Product | `product` |
| Purchase Order | `purchaseOrder` |
| Quote | `quote` |
| Sales Order | `salesOrder` |
| Vendor | `vendor` |

### Operations

Which operations are available depends on the selected resource — see the parameter subsections below.

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Add a new record to the selected module. |
| Create or Update | `upsert` | Create the record, or update the existing one when Zoho finds a match. |
| Delete | `delete` | Remove a record by its ID. |
| Get | `get` | Retrieve a single record by its ID. |
| Get Many | `getAll` | List records from the module, with optional field selection, sorting and paging. |
| Update | `update` | Change fields on an existing record, identified by its ID. |
| Get Fields | `getFields` | Retrieve the module's field definitions. Offered by the Lead resource only. |

### Parameters

Which parameters appear depends on the resource and the operation you pick. `Lead: Get Fields` takes no parameters of its own — see All Operations.

Every field below takes a literal value. To drive a record's name, subject, stage or ID from the incoming data instead, leave that field blank: the node then reads the matching key from the input item's JSON — an empty **Deal ID** picks up `dealId`, an empty **Account Name** picks up `accountName`, and so on. This fallback covers the per-resource name, subject, stage and ID fields only. **Products**, **Additional Fields**, **Update Fields**, **Return All**, **Limit** and **Options** always use the value configured on the node.

#### Account: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Account Name | `string` | Yes | — | Name of the account. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Account: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Account Name | `string` | Yes | — | Name of the account. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Account: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Account ID | `string` | Yes | — | ID of the account. Can be found at the end of the URL. |

#### Account: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Account ID | `string` | Yes | — | ID of the account. Can be found at the end of the URL. |

#### Account: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Account: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Account ID | `string` | Yes | — | ID of the account. Can be found at the end of the URL. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Contact: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Last Name | `string` | Yes | — | Last name of the contact. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Contact: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Last Name | `string` | Yes | — | Last name of the contact. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Contact: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Contact ID | `string` | Yes | — | ID of the contact. |

#### Contact: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Contact ID | `string` | Yes | — | ID of the contact. |

#### Contact: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Contact: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Contact ID | `string` | Yes | — | ID of the contact. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Deal: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Deal Name | `string` | Yes | — | Name of the deal. |
| Stage | `string` | Yes | — | Stage of the deal. Find available stages in Zoho CRM Settings > Customization > Stage-Probability Mapping. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Deal: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Deal Name | `string` | Yes | — | Name of the deal. |
| Stage | `string` | Yes | — | Stage of the deal. Find available stages in Zoho CRM Settings > Customization > Stage-Probability Mapping. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Deal: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Deal ID | `string` | Yes | — | ID of the deal. |

#### Deal: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Deal ID | `string` | Yes | — | ID of the deal. |

#### Deal: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Deal: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Deal ID | `string` | Yes | — | ID of the deal. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Invoice: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Subject | `string` | Yes | — | Subject or title of the invoice. |
| Products | `json` | No | `[]` | Array of product detail objects. Each must include "id" (product ID) and "quantity". Example: [{"id":"123","quantity":2,"list_price":100}] |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

At least one product is required — an invoice with an empty **Products** array fails before the request is sent.

#### Invoice: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Subject | `string` | Yes | — | Subject or title of the invoice. |
| Products | `json` | No | `[]` | Array of product detail objects. Each must include "id" (product ID) and "quantity". Example: [{"id":"123","quantity":2,"list_price":100}] |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

At least one product is required here too.

#### Invoice: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Invoice ID | `string` | Yes | — | ID of the invoice. |

#### Invoice: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Invoice ID | `string` | Yes | — | ID of the invoice. |

#### Invoice: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Invoice: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Invoice ID | `string` | Yes | — | ID of the invoice. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Lead: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Company | `string` | Yes | — | Company at which the lead works. |
| Last Name | `string` | Yes | — | Last name of the lead. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Lead: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Company | `string` | Yes | — | Company at which the lead works. |
| Last Name | `string` | Yes | — | Last name of the lead. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Lead: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Lead ID | `string` | Yes | — | ID of the lead. |

#### Lead: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Lead ID | `string` | Yes | — | ID of the lead. |

#### Lead: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Lead: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Lead ID | `string` | Yes | — | ID of the lead. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Product: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Product Name | `string` | Yes | — | Name of the product. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Product: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Product Name | `string` | Yes | — | Name of the product. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Product: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Product ID | `string` | Yes | — | ID of the product. |

#### Product: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Product ID | `string` | Yes | — | ID of the product. |

#### Product: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Product: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Product ID | `string` | Yes | — | ID of the product. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Purchase Order: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Products | `json` | No | `[]` | Array of product detail objects. Each must include "id" (product ID) and "quantity". Example: [{"id":"123","quantity":2,"list_price":100}] |
| Subject | `string` | Yes | — | Subject or title of the purchase order. |
| Vendor ID | `string` | Yes | — | ID of the vendor for the purchase order. Find in Zoho CRM under Vendors. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

At least one product is required — a purchase order with an empty **Products** array fails before the request is sent.

#### Purchase Order: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Products | `json` | No | `[]` | Array of product detail objects. Each must include "id" (product ID) and "quantity". Example: [{"id":"123","quantity":2,"list_price":100}] |
| Subject | `string` | Yes | — | Subject or title of the purchase order. |
| Vendor ID | `string` | Yes | — | ID of the vendor for the purchase order. Find in Zoho CRM under Vendors. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Purchase Order: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Purchase Order ID | `string` | Yes | — | ID of the purchase order. |

#### Purchase Order: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Purchase Order ID | `string` | Yes | — | ID of the purchase order. |

#### Purchase Order: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Purchase Order: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Purchase Order ID | `string` | Yes | — | ID of the purchase order. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Quote: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Products | `json` | No | `[]` | Array of product detail objects. Each must include "id" (product ID) and "quantity". Example: [{"id":"123","quantity":2,"list_price":100}] |
| Subject | `string` | Yes | — | Subject or title of the quote. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

At least one product is required — a quote with an empty **Products** array fails before the request is sent.

#### Quote: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Products | `json` | No | `[]` | Array of product detail objects. Each must include "id" (product ID) and "quantity". Example: [{"id":"123","quantity":2,"list_price":100}] |
| Subject | `string` | Yes | — | Subject or title of the quote. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Quote: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Quote ID | `string` | Yes | — | ID of the quote. |

#### Quote: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Quote ID | `string` | Yes | — | ID of the quote. |

#### Quote: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Quote: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Quote ID | `string` | Yes | — | ID of the quote. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Sales Order: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Products | `json` | No | `[]` | Array of product detail objects. Each must include "id" (product ID) and "quantity". Example: [{"id":"123","quantity":2,"list_price":100}] |
| Account ID | `string` | Yes | — | ID of the account associated with this sales order. |
| Subject | `string` | Yes | — | Subject or title of the sales order. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Sales Order: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Products | `json` | No | `[]` | Array of product detail objects. Each must include "id" (product ID) and "quantity". Example: [{"id":"123","quantity":2,"list_price":100}] |
| Account ID | `string` | Yes | — | ID of the account associated with this sales order. |
| Subject | `string` | Yes | — | Subject or title of the sales order. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Sales Order: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Sales Order ID | `string` | Yes | — | ID of the sales order. |

#### Sales Order: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Sales Order ID | `string` | Yes | — | ID of the sales order. |

#### Sales Order: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Sales Order: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Sales Order ID | `string` | Yes | — | ID of the sales order. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### Vendor: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Vendor Name | `string` | Yes | — | Name of the vendor. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Vendor: Create or Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Vendor Name | `string` | Yes | — | Name of the vendor. |
| Additional Fields | `json` | No | `{}` | Additional fields for the record. Keys should match Zoho CRM API field names (e.g. Email, Phone, Description, Billing_Address, etc). Address fields should be nested objects with address_fields property. |

#### Vendor: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Vendor ID | `string` | Yes | — | ID of the vendor. |

#### Vendor: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Vendor ID | `string` | Yes | — | ID of the vendor. |

#### Vendor: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `5` | Max number of results to return. _(shown when Return All is `false`)_ |
| Options | `json` | No | `{}` | GetAll filter options. Supported keys: fields (comma-separated string or array), sort_by (field API name), sort_order (asc/desc), approved (boolean), converted (boolean), include_child (boolean), territory_id (string). |

#### Vendor: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Vendor ID | `string` | Yes | — | ID of the vendor. |
| Update Fields | `json` | No | `{}` | Fields to update. Keys should match Zoho CRM API field names. At least one field is required. |

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Zoho Account | `credential` | No | — | Connect your Zoho account via OAuth2. |
| Max Concurrency | `number` | No | `10` | Maximum number of items to process concurrently. |

## Output Data

The Zoho response is **merged onto the input item's JSON** — your original fields survive and Zoho's fields are added alongside them, overwriting any key of the same name. Binary data on the input item is forwarded onto every output item.

How many items come out depends on the operation:

| Operation | Output items per input item |
|-----------|-----------------------------|
| `create`, `upsert`, `update` | One — the record details Zoho returns for the write. |
| `delete` | One — the result of the deletion. |
| `get` | One — the requested record. |
| `getAll` | **One per record returned** — a single input item fans out across the whole result set. A result set of zero produces no output item at all, so the input item does not pass through. |
| `getFields` | **One per field definition** in the Lead module's schema. |

`Return All` changes how much `Get Many` fetches, not the shape: on, Zoho is paged through until every record is collected; off, the first `Limit` records are kept. Either way the records leave as separate items, so a `Get Many` that matched nothing leaves that branch empty — test for the presence of items downstream rather than for a "no results" flag.

When a delete returns an empty body, the node reports the deletion itself:

```json
{
  "id": "4876876000000240001",
  "deleted": true
}
```

Every other field is whatever the Zoho CRM API returned for that call — the node does not rename, nest or filter them, so a create carries the record details Zoho supplies for a write and a get carries the record's own fields. Reference them downstream by expression, e.g. `{{ $json.id }}`.

An item whose Zoho call fails carries an `_error` object instead, and its original JSON is not merged onto it.

## Usage Examples

- Create a new contact in Zoho CRM
- List all deals from Zoho CRM
- Update account information in Zoho CRM
- Delete a lead from Zoho CRM
- Upsert a vendor record in Zoho CRM

## Example Configuration

Create an account and set a few extra fields on it:

```json
{
  "type": "zoho",
  "parameters": {
    "resource": "account",
    "operation": "create",
    "accountName": "Acme Corporation",
    "additionalFields": {
      "Phone": "555-123-4567",
      "Website": "https://acme.com",
      "Description": "Leading manufacturer of widgets"
    }
  }
}
```

Fetch one deal by its record ID:

```json
{
  "type": "zoho",
  "parameters": {
    "resource": "deal",
    "operation": "get",
    "dealId": "4876876000000240001"
  }
}
```

Raise an invoice with two line items:

```json
{
  "type": "zoho",
  "parameters": {
    "resource": "invoice",
    "operation": "create",
    "subject": "Q1 Services Invoice",
    "Product_Details": [
      { "id": "4876876000000186029", "quantity": 2, "list_price": 500 },
      { "id": "4876876000000186030", "quantity": 1, "list_price": 1000 }
    ],
    "additionalFields": {
      "Due_Date": "2026-03-31"
    }
  }
}
```

Create the product if it is new, or update it if Zoho already holds a match:

```json
{
  "type": "zoho",
  "parameters": {
    "resource": "product",
    "operation": "upsert",
    "productName": "Premium Widget Pro",
    "additionalFields": {
      "Unit_Price": 299.99,
      "Product_Code": "PWP-001",
      "Product_Category": "Widgets",
      "Description": "Professional grade widget with advanced features"
    }
  }
}
```

List up to 50 contacts, keeping only the fields you need and sorting by surname:

```json
{
  "type": "zoho",
  "parameters": {
    "resource": "contact",
    "operation": "getAll",
    "returnAll": false,
    "limit": 50,
    "options": {
      "fields": ["First_Name", "Last_Name", "Email", "Account_Name"],
      "sort_by": "Last_Name",
      "sort_order": "asc"
    },
    "maxConcurrency": 5
  }
}
```

### Error Handling

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes failed items to Error output port |

## Tips

Zoho CRM tool for CRUD operations on accounts, contacts, deals, leads, invoices, products, purchase orders, quotes, sales orders, and vendors via the Zoho CRM API v2.

### Common Patterns

- **Creating records with relationships.** When creating records that reference other records (like deals referencing accounts), use the ID of the related record.
- **Batch operations.** The tool processes items concurrently up to the `maxConcurrency` limit.
- **Working with address fields.** Address fields should be structured as nested objects — a `Billing_Address` entry inside Additional Fields holding `address_line_1`, `address_line_2`, `city`, `state`, `zip_code` and `country`, for example.
- **Lead-specific operations.** For leads, you can retrieve field schema information with the Get Fields operation.