Upsert Records
zoho_crm.upsert_records
ActionCRM & salesconnection required
Calls the Zoho CRM API with the connection's credentials.
Insert records into a Zoho CRM module, or update the ones that already exist, matching on the duplicate check fields. Each result says whether it was an insert or an update and on which field it matched.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- OAuth 2.0
- Providers
- Zoho CRM
- Secret shape
- {"client_id": "…", "client_secret": "…", "refresh_token": "…"}
- Config it needs
- data_center, api_domain, accounts_url, api_version
- Resolved by
- config.connection_id, else node.connection_id
Configuration
5 fields, 1 required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
module API name of the module to act on, such as Leads, Contacts, Accounts, Deals, Tasks, Products, Vendors or Invoices. A custom module's API name works too. | string | Yes | — | — | Leads |
record One record as a JSON object keyed by Zoho field API names, for example {"Last_Name": "Doe", "Company": "Acme"}. Use records for a batch. | object | No | — | — | {"Company":"Acme","Last_Name":"Doe"} |
records Several records as a JSON array of objects keyed by Zoho field API names. Zoho accepts at most 100 records per call. | array | No | — | array of object | — |
duplicate_check_fields Field API names Zoho checks for an existing record, in order, as a JSON array. Leave unset to use the module's unique fields. | array | No | — | array of string | — |
trigger Which automations Zoho should run for this write, as a JSON array of workflow, approval, blueprint, pathfinder or orchestration. Leave unset to run them all; send an empty array to run none. | array | No | — | array of string | — |
- At least one of record, records must be set.
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"module": "Leads",
"record": {
"Company": "Acme",
"Last_Name": "Doe"
}
}Output
One shape.
result
| Field | Type | Example |
|---|---|---|
module The module API name the batch was written to. | string | — |
action Which write this was, for example create or upsert. | string | — |
records One status object per input record, in input order. | array | — |
succeeded The status objects Zoho accepted, each with its new id. | array | — |
failed The status objects Zoho refused, each with its error code. | array | — |
ids The ids of the records Zoho wrote, in order. | array | — |
success_count How many records of the batch Zoho wrote. | number | — |
failure_count How many records of the batch Zoho refused. | number | — |
status success when every record was written, partial when some were refused. | string | success |
{
"action": "",
"failed": [],
"failure_count": 0,
"ids": [],
"module": "",
"records": [],
"status": "success",
"succeeded": [],
"success_count": 0
}Notes
- Zoho accepts at most 100 records in one call.
- A partial success is normal: read status, succeeded and failed rather than assuming the whole batch landed. The step fails only when Zoho refused every record in the batch.
See Upsert Records run in a workflow.
In a technical demo we add the Zoho CRM connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.