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

> Node: Freshworks CRM (`freshworks_crm`) · Action · v1
> Category: Marketing · Credentials: Freshworks CRM API (`freshworksCrmApi`)
> Updated: 2026-08-16

# Freshworks CRM

> Manage accounts, contacts, deals, appointments, notes, tasks, and search in Freshworks CRM.

## Overview

Freshworks CRM (formerly Freshsales) is a cloud sales platform for tracking leads, contacts, accounts, deals, appointments, notes, tasks and sales activities. This node gives a workflow full create, read, update and delete access to each of those records, plus cross-entity search and lookup, so you can keep your CRM in step with the rest of your pipeline — enrol new signups as contacts, push closed-won deals forward, file notes against an account, or pull a saved view of deals into a report. It authenticates with an API key and your Freshworks account domain.

**Category:** Marketing  
**Tool Name:** `freshworks_crm`  
**Version:** 1

**Appearance:** Icon: `lucide-CircleDollarSign` | Color: `#EE5A24`

## Node Type

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

## Input / Output

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

## Credentials

This tool requires **Freshworks CRM API** credentials.
See the [Credentials Guide](https://busybot.net/credentials/freshworks-crm-api/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Account | `account` |
| Appointment | `appointment` |
| Contact | `contact` |
| Deal | `deal` |
| Note | `note` |
| Sales Activity | `salesActivity` |
| Search | `search` |
| Task | `task` |

### Operations

The available operations depend on the resource you select.

**Account**

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new account. |
| Delete | `delete` | Delete an account. |
| Get | `get` | Retrieve one account by ID. |
| Get Many | `getAll` | Retrieve accounts from a saved view. |
| Update | `update` | Update an existing account. |

**Appointment**

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new appointment. |
| Delete | `delete` | Delete an appointment. |
| Get | `get` | Retrieve one appointment by ID. |
| Get Many | `getAll` | Retrieve appointments. |
| Update | `update` | Update an existing appointment. |

**Contact**

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new contact. |
| Delete | `delete` | Delete a contact. |
| Get | `get` | Retrieve one contact by ID. |
| Get Many | `getAll` | Retrieve contacts from a saved view. |
| Update | `update` | Update an existing contact. |

**Deal**

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new deal. |
| Delete | `delete` | Delete a deal. |
| Get | `get` | Retrieve one deal by ID. |
| Get Many | `getAll` | Retrieve deals from a saved view. |
| Update | `update` | Update an existing deal. |

**Note**

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Attach a new note to a contact, deal or account. |
| Delete | `delete` | Delete a note. |
| Update | `update` | Update an existing note. |

**Sales Activity**

| Operation | Value | Description |
|-----------|-------|-------------|
| Get | `get` | Retrieve one sales activity by ID. |
| Get Many | `getAll` | Retrieve sales activities. |

**Search**

| Operation | Value | Description |
|-----------|-------|-------------|
| Query | `query` | Search across entity types for a term. |
| Lookup | `lookup` | Find records by an exact field value. |

**Task**

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new task. |
| Delete | `delete` | Delete a task. |
| Get | `get` | Retrieve one task by ID. |
| Get Many | `getAll` | Retrieve tasks. |
| Update | `update` | Update an existing task. |

### Parameters

#### Account: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Name | `string` | Yes | — | Name of the account. |
| Additional Fields | `collection` | No | `{}` | Optional account fields to set when the account is created. |
| — Address | `string` | No | — | Address of the account. |
| — Annual Revenue | `number` | No | `0` | Annual revenue of the account. |
| — Business Type ID | `string` | No | — | ID of the business type. Find via GET /selector/business_types. |
| — City | `string` | No | — | City of the account. |
| — Country | `string` | No | — | Country of the account. |
| — Facebook | `string` | No | — | Facebook username. |
| — Industry Type ID | `string` | No | — | ID of the industry type. Find via GET /selector/industry_types. |
| — LinkedIn | `string` | No | — | LinkedIn account URL or username. |
| — Number of Employees | `number` | No | `0` | Number of employees. |
| — Owner ID (`owner_id`) | `string` | No | — | ID of the user the account is assigned to. Find via GET /selector/owners. |
| — Parent Sales Account ID | `string` | No | — | Parent account ID. |
| — Phone | `string` | No | — | Phone number. |
| — State | `string` | No | — | State. |
| — Territory ID | `string` | No | — | ID of the territory. Find via GET /selector/territories. |
| — Twitter | `string` | No | — | Twitter username. |
| — Website | `string` | No | — | Website URL. |
| — Zipcode | `string` | No | — | Zipcode. |

#### Account: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Account ID | `string` | Yes | — | ID of the account. |

#### Account: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Account ID | `string` | Yes | — | ID of the account. |

#### Account: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| View ID | `string` | Yes | — | ID of a saved account view/filter. Find via GET /sales_accounts/filters. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of results to return. _(shown when Return All is `false`)_ |

#### Account: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Account ID | `string` | Yes | — | ID of the account to update. |
| Update Fields | `collection` | No | `{}` | Account fields to change. Supply at least one, or the node reports an error for that item. |
| — Address | `string` | No | — | Address of the account. |
| — Annual Revenue | `number` | No | `0` | Annual revenue of the account. |
| — Business Type ID | `string` | No | — | ID of the business type. |
| — City | `string` | No | — | City of the account. |
| — Country | `string` | No | — | Country of the account. |
| — Facebook | `string` | No | — | Facebook username. |
| — Industry Type ID | `string` | No | — | ID of the industry type. |
| — LinkedIn | `string` | No | — | LinkedIn username. |
| — Name | `string` | No | — | Name of the account. |
| — Number of Employees | `number` | No | `0` | Number of employees. |
| — Owner ID (`owner_id`) | `string` | No | — | ID of the user assigned. |
| — Parent Sales Account ID | `string` | No | — | Parent account ID. |
| — Phone | `string` | No | — | Phone number. |
| — State | `string` | No | — | State. |
| — Territory ID | `string` | No | — | ID of the territory. |
| — Twitter | `string` | No | — | Twitter username. |
| — Website | `string` | No | — | Website URL. |
| — Zipcode | `string` | No | — | Zipcode. |

#### Appointment: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Title | `string` | Yes | — | Title of the appointment. |
| Start Date (`fromDate`) | `string` | Yes | — | Start date/time of the appointment in ISO 8601 format. |
| End Date (`endDate`) | `string` | Yes | — | End date/time of the appointment in ISO 8601 format. |
| Attendees | `json` | No | `[]` | JSON array of attendees. Each: { "type": "contact"\|"user", "contactId": "...", "userId": "..." }. |
| Additional Fields | `collection` | No | `{}` | Optional appointment fields to set when the appointment is created. |
| — Creator ID | `string` | No | — | ID of the user who created the appointment. |
| — Is All-Day | `boolean` | No | `false` | Whether it is an all-day appointment. |
| — Latitude | `string` | No | — | Latitude of the location. |
| — Location | `string` | No | — | Location of the appointment. |
| — Longitude | `string` | No | — | Longitude of the location. |
| — Outcome ID | `string` | No | — | ID of the outcome. Find via GET /selector/sales_activity_outcomes. |
| — Target ID | `string` | No | — | ID of the target entity. |
| — Target Type (`targetable_type`) | `options` | No | `Contact` | Type of the entity the appointment is linked to. |
| | | | | Options: `Contact`, `Deal`, `SalesAccount` |
| — Time Zone | `string` | No | — | Timezone for the appointment (e.g. America/New_York). |

#### Appointment: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Appointment ID | `string` | Yes | — | ID of the appointment. |

#### Appointment: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Appointment ID | `string` | Yes | — | ID of the appointment. |

#### Appointment: 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 | `50` | Max number of results to return. _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Narrow the appointments that are returned. |
| — Include | `options` | No | `creater` | Related records to include with each appointment. |
| | | | | Options: `appointment_attendees`, `creater` (Creator), `targetable` (Target) |
| — Time | `options` | No | `upcoming` | Which appointments to return. |
| | | | | Options: `past`, `upcoming` |

#### Appointment: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Appointment ID | `string` | Yes | — | ID of the appointment to update. |
| Update Fields | `collection` | No | `{}` | Appointment fields to change. Supply at least one, or the node reports an error for that item. |
| — Attendees | `json` | No | `[]` | JSON array of attendees. Each: { "type": "contact"\|"user", "contactId": "...", "userId": "..." }. |
| — Creator ID | `string` | No | — | ID of the creator user. |
| — End Date (`end_date`) | `string` | No | — | End date/time (ISO 8601). |
| — Is All-Day | `boolean` | No | `false` | Whether it is all-day. |
| — Latitude | `string` | No | — | Latitude. |
| — Location | `string` | No | — | Location. |
| — Longitude | `string` | No | — | Longitude. |
| — Outcome ID | `string` | No | — | Outcome ID. |
| — Start Date (`from_date`) | `string` | No | — | Start date/time (ISO 8601). |
| — Target ID | `string` | No | — | Target entity ID. |
| — Target Type (`targetable_type`) | `options` | No | `Contact` | Type of the entity the appointment is linked to. |
| | | | | Options: `Contact`, `Deal`, `SalesAccount` |
| — Time Zone | `string` | No | — | Timezone. |
| — Title | `string` | No | — | Title. |

#### Contact: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| First Name (`firstName`) | `string` | Yes | — | First name of the contact. |
| Last Name (`lastName`) | `string` | Yes | — | Last name of the contact. |
| Email Address | `string` | Yes | — | Email address of the contact. |
| Additional Fields | `collection` | No | `{}` | Optional contact fields to set when the contact is created. |
| — Address | `string` | No | — | Address. |
| — Campaign ID | `string` | No | — | Campaign ID. Find via GET /selector/campaigns. |
| — City | `string` | No | — | City. |
| — Contact Status ID | `string` | No | — | Contact status ID. Find via GET /selector/contact_statuses. |
| — Country | `string` | No | — | Country. |
| — External ID | `string` | No | — | External ID. |
| — Facebook | `string` | No | — | Facebook username. |
| — Job Title | `string` | No | — | Job title. |
| — Keywords | `string` | No | — | Keywords. |
| — Lead Source ID | `string` | No | — | Lead source ID. |
| — Lifecycle Stage ID | `string` | No | — | Lifecycle stage ID. Find via GET /selector/lifecycle_stages. |
| — LinkedIn | `string` | No | — | LinkedIn. |
| — Medium | `string` | No | — | Medium. |
| — Mobile Number | `string` | No | — | Mobile number. |
| — Owner ID (`owner_id`) | `string` | No | — | Owner user ID. |
| — Sales Account IDs | `string` | No | — | Comma-separated sales account IDs. First is marked as primary. |
| — State | `string` | No | — | State. |
| — Subscription Status | `string` | No | — | Subscription status. |
| — Subscription Types | `string` | No | — | Subscription types. |
| — Territory ID | `string` | No | — | Territory ID. |
| — Time Zone | `string` | No | — | Timezone. |
| — Twitter | `string` | No | — | Twitter username. |
| — Work Number | `string` | No | — | Work phone number. |
| — Zipcode | `string` | No | — | Zipcode. |

#### 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 |
|-----------|------|----------|---------|-------------|
| View ID | `string` | Yes | — | ID of a saved contact view/filter. Find via GET /contacts/filters. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of results to return. _(shown when Return All is `false`)_ |

#### Contact: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Contact ID | `string` | Yes | — | ID of the contact to update. |
| Update Fields | `collection` | No | `{}` | Contact fields to change. Supply at least one, or the node reports an error for that item. |
| — Address | `string` | No | — | Address. |
| — Campaign ID | `string` | No | — | Campaign ID. |
| — City | `string` | No | — | City. |
| — Contact Status ID | `string` | No | — | Contact status ID. |
| — Country | `string` | No | — | Country. |
| — External ID | `string` | No | — | External ID. |
| — Facebook | `string` | No | — | Facebook username. |
| — First Name (`first_name`) | `string` | No | — | First name. |
| — Job Title | `string` | No | — | Job title. |
| — Keywords | `string` | No | — | Keywords. |
| — Last Name (`last_name`) | `string` | No | — | Last name. |
| — Lead Source ID | `string` | No | — | Lead source ID. |
| — Lifecycle Stage ID | `string` | No | — | Lifecycle stage ID. |
| — LinkedIn | `string` | No | — | LinkedIn. |
| — Medium | `string` | No | — | Medium. |
| — Mobile Number | `string` | No | — | Mobile number. |
| — Owner ID (`owner_id`) | `string` | No | — | Owner user ID. |
| — Sales Account IDs | `string` | No | — | Comma-separated sales account IDs. |
| — State | `string` | No | — | State. |
| — Subscription Status | `string` | No | — | Subscription status. |
| — Subscription Types | `string` | No | — | Subscription types. |
| — Territory ID | `string` | No | — | Territory ID. |
| — Time Zone | `string` | No | — | Timezone. |
| — Twitter | `string` | No | — | Twitter username. |
| — Work Number | `string` | No | — | Work phone number. |
| — Zipcode | `string` | No | — | Zipcode. |

#### Deal: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Name | `string` | Yes | — | Name of the deal. |
| Amount | `number` | Yes | `0` | Value of the deal. |
| Additional Fields | `collection` | No | `{}` | Optional deal fields to set when the deal is created. |
| — Base Currency Amount | `number` | No | `0` | Value in base currency. |
| — Campaign ID | `string` | No | — | Campaign ID. |
| — Currency ID | `string` | No | — | Currency ID. Find via GET /selector/currencies. |
| — Deal Payment Status ID | `string` | No | — | Payment status ID. Find via GET /selector/deal_payment_statuses. |
| — Deal Pipeline ID | `string` | No | — | Pipeline ID. Find via GET /selector/deal_pipelines. |
| — Deal Product ID | `string` | No | — | Product ID. Find via GET /selector/deal_products. |
| — Deal Reason ID | `string` | No | — | Reason ID (for lost deals). Find via GET /selector/deal_reasons. |
| — Deal Stage ID | `string` | No | — | Stage ID. Find via GET /selector/deal_stages. |
| — Deal Type ID | `string` | No | — | Type ID. Find via GET /selector/deal_types. |
| — Lead Source ID | `string` | No | — | Lead source ID. |
| — Owner ID (`owner_id`) | `string` | No | — | Owner user ID. |
| — Probability | `number` | No | `0` | Probability 0-100. |
| — Sales Account ID | `string` | No | — | Sales account ID. |
| — Territory ID | `string` | No | — | Territory ID. |

#### 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 |
|-----------|------|----------|---------|-------------|
| View ID | `string` | Yes | — | ID of a saved deal view/filter. Find via GET /deals/filters. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of results to return. _(shown when Return All is `false`)_ |

#### Deal: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Deal ID | `string` | Yes | — | ID of the deal to update. |
| Update Fields | `collection` | No | `{}` | Deal fields to change. Supply at least one, or the node reports an error for that item. |
| — Amount | `number` | No | `0` | Value of the deal. |
| — Base Currency Amount | `number` | No | `0` | Value in base currency. |
| — Campaign ID | `string` | No | — | Campaign ID. |
| — Currency ID | `string` | No | — | Currency ID. |
| — Deal Payment Status ID | `string` | No | — | Payment status ID. |
| — Deal Pipeline ID | `string` | No | — | Pipeline ID. |
| — Deal Product ID | `string` | No | — | Product ID. |
| — Deal Reason ID | `string` | No | — | Reason ID. |
| — Deal Stage ID | `string` | No | — | Stage ID. |
| — Deal Type ID | `string` | No | — | Type ID. |
| — Lead Source ID | `string` | No | — | Lead source ID. |
| — Name | `string` | No | — | Name of the deal. |
| — Owner ID (`owner_id`) | `string` | No | — | Owner user ID. |
| — Probability | `number` | No | `0` | Probability 0-100. |
| — Sales Account ID | `string` | No | — | Sales account ID. |
| — Territory ID | `string` | No | — | Territory ID. |

#### Note: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Content | `string` | Yes | — | Content of the note. |
| Target Type (`targetableType`) | `options` | Yes | `Contact` | Type of the entity for which the note is created. |
| | | | | Options: `Contact`, `Deal`, `SalesAccount` |
| Target ID | `string` | Yes | — | ID of the entity for which the note is created. |

#### Note: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Note ID | `string` | Yes | — | ID of the note to delete. |

#### Note: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Note ID | `string` | Yes | — | ID of the note to update. |
| Update Fields | `collection` | No | `{}` | Note fields to change. Supply at least one, or the node reports an error for that item. |
| — Content | `string` | No | — | Content of the note. |
| — Target ID | `string` | No | — | Target entity ID. |
| — Target Type (`targetable_type`) | `options` | No | `Contact` | Target entity type. |
| | | | | Options: `Contact`, `Deal`, `SalesAccount` |

#### Sales Activity: Get

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

#### Sales Activity: 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 | `50` | Max number of results to return. _(shown when Return All is `false`)_ |

#### Search: Query

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Search Term | `string` | Yes | — | Term used for searching entities. |
| Search on Entities | `string` | Yes | — | Comma-separated entity types to search: contact, deal, sales_account, user. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `25` | Max number of results to return. _(shown when Return All is `false`)_ |

#### Search: Lookup

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Search Field | `options` | Yes | `email` | Field to search against. |
| | | | | Options: `email`, `name`, `customField` |
| Field Value | `string` | Yes | — | Value to search for. _(shown when Search Field is `email`, `name`)_ |
| Custom Field Name | `string` | Yes | — | Name of the custom field to search against. _(shown when Search Field is `customField`)_ |
| Custom Field Value | `string` | Yes | — | Value of the custom field to search for. _(shown when Search Field is `customField`)_ |
| Options | `collection` | No | `{}` | Extra options for the lookup. |
| — Entities | `string` | No | — | Comma-separated entity types: contact, deal, sales_account. |

#### Task: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Title | `string` | Yes | — | Title of the task. |
| Due Date | `string` | Yes | — | Due date/time in ISO 8601 format. |
| Owner ID (`ownerId`) | `string` | Yes | — | ID of the user the task is assigned to. Find via GET /selector/owners. |
| Target Type (`targetableType`) | `options` | Yes | `Contact` | Type of entity for the task. |
| | | | | Options: `Contact`, `Deal`, `SalesAccount` |
| Target ID | `string` | Yes | — | ID of the target entity. |
| Additional Fields | `collection` | No | `{}` | Optional task fields to set when the task is created. |
| — Creator ID | `string` | No | — | ID of the user who created the task. |
| — Outcome ID | `string` | No | — | Outcome ID. |
| — Task Type ID | `string` | No | — | Task type ID. |

#### Task: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Task ID | `string` | Yes | — | ID of the task. |

#### Task: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Task ID | `string` | Yes | — | ID of the task. |

#### Task: 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 | `50` | Max number of results to return. _(shown when Return All is `false`)_ |
| Filters | `collection` | No | `{}` | Narrow the tasks that are returned. |
| — Include | `options` | No | `owner` | Related records to include with each task. |
| | | | | Options: `owner`, `targetable` (Target), `users` |
| — Status | `options` | No | `open` | Which tasks to return. |
| | | | | Options: `completed`, `due_today`, `due_tomorrow`, `open`, `overdue` |

#### Task: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Task ID | `string` | Yes | — | ID of the task to update. |
| Update Fields | `collection` | No | `{}` | Task fields to change. Supply at least one, or the node reports an error for that item. |
| — Creator ID | `string` | No | — | Creator user ID. |
| — Due Date | `string` | No | — | Due date/time (ISO 8601). |
| — Outcome ID | `string` | No | — | Outcome ID. |
| — Owner ID (`owner_id`) | `string` | No | — | Owner user ID. |
| — Target ID | `string` | No | — | Target entity ID. |
| — Target Type (`targetable_type`) | `options` | No | `Contact` | Target entity type. |
| | | | | Options: `Contact`, `Deal`, `SalesAccount` |
| — Task Type ID | `string` | No | — | Task type ID. |
| — Title | `string` | No | — | Title of the task. |

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Max Concurrency | `number` | No | `10` | Maximum number of items to process concurrently. |

## Output Data

Every input item produces exactly one output item — the node never fans out, so a list of 200 deals arrives as one item holding an array, not 200 items. Binary data on the input item is forwarded unchanged.

For single-record operations the API response is **merged onto the input item JSON** (`{ ...itemJson, ...record }`), so upstream fields you were carrying stay available alongside the record's own fields. List operations are the exception: their result **replaces** the item JSON with `items` and `count`.

| Operations | What lands on the output item |
|------------|-------------------------------|
| `create`, `get`, `update` on account, appointment, contact, deal, note and task; `get` on salesActivity | The record's own fields, merged onto the input item JSON |
| `delete` on any resource | `success: true`, merged onto the input item JSON |
| `getAll` on account, appointment, contact, deal, salesActivity and task; `query` on search | `items` (the array of records) and `count` — these **replace** the input item JSON |
| `lookup` on search | The lookup response, merged onto the input item JSON |

A list result looks like this (each entry trimmed here to a single field):

```json
{
  "count": 2,
  "items": [
    { "name": "Acme Corporation" },
    { "name": "Globex" }
  ]
}
```

To turn a list into one item per record, put a Split Out node on `items` immediately after this node. Reference the values downstream by expression, e.g. `{{ $json.count }}` or `{{ $json.items[0].name }}`.

A delete leaves only the confirmation flag on top of the incoming JSON:

```json
{
  "success": true
}
```

Beyond `items`, `count` and `success`, the fields on a record are whatever the Freshworks API returns for that entity — the node unwraps the API's single-record envelope and puts the record itself on the item. Run the node once and inspect the output before writing downstream expressions against a specific field.

## Usage Examples

- Create a new contact in Freshworks CRM
- Get all deals from a Freshworks CRM view
- Update an account in Freshworks CRM
- Search contacts by email in Freshworks CRM
- Create a task assigned to a user in Freshworks CRM

## Example Configuration

Create a contact from an upstream signup item:

```json
{
  "type": "freshworks_crm",
  "parameters": {
    "resource": "contact",
    "operation": "create",
    "firstName": "{{ $json.firstName }}",
    "lastName": "{{ $json.lastName }}",
    "emails": "{{ $json.email }}",
    "additionalFields": {
      "job_title": "{{ $json.jobTitle }}",
      "mobile_number": "{{ $json.phone }}",
      "sales_accounts": "{{ $json.accountId }}"
    }
  }
}
```

Pull the first 50 deals from a saved view:

```json
{
  "type": "freshworks_crm",
  "parameters": {
    "resource": "deal",
    "operation": "getAll",
    "view": "{{ $json.viewId }}",
    "returnAll": false,
    "limit": 50
  }
}
```

Update an account with enriched firmographics:

```json
{
  "type": "freshworks_crm",
  "parameters": {
    "resource": "account",
    "operation": "update",
    "accountId": "{{ $json.accountId }}",
    "updateFields": {
      "annual_revenue": 2500000,
      "number_of_employees": 120,
      "website": "{{ $json.website }}"
    }
  }
}
```

Create a follow-up task against a deal and assign it to an owner:

```json
{
  "type": "freshworks_crm",
  "parameters": {
    "resource": "task",
    "operation": "create",
    "title": "Follow up on {{ $json.dealName }}",
    "dueDate": "{{ $json.dueDate }}",
    "ownerId": "{{ $json.ownerId }}",
    "targetableType": "Deal",
    "targetable_id": "{{ $json.dealId }}",
    "additionalFields": {
      "task_type_id": "{{ $json.taskTypeId }}"
    }
  }
}
```

Fetch every overdue task with its owner record attached:

```json
{
  "type": "freshworks_crm",
  "parameters": {
    "resource": "task",
    "operation": "getAll",
    "returnAll": true,
    "filters": {
      "filter": "overdue",
      "include": "owner"
    }
  }
}
```

Look a contact up by exact email address before deciding whether to create one:

```json
{
  "type": "freshworks_crm",
  "parameters": {
    "resource": "search",
    "operation": "lookup",
    "searchField": "email",
    "fieldValue": "{{ $json.email }}",
    "options": {
      "entities": "contact"
    }
  }
}
```

### 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

Manage CRM data (accounts, contacts, deals, tasks, etc.) in Freshworks CRM via its REST API.

### Important Notes

1. **Collection parameters are flat objects.** `Additional Fields`, `Update Fields`, `Filters` and `Options` each take a plain object of field name to value — no array wrappers and no placeholder keys around the entries.
2. **Dates are ISO 8601.** Give `Start Date`, `End Date` and `Due Date` values such as `2026-01-15T10:00:00Z`. Set a `Time Zone` on the appointment if you need the record stamped to a specific zone.
3. **Relationship fields take IDs, not names.** Owner, territory, pipeline, stage, lead source and similar fields expect the ID of the related record in your Freshworks account.
4. **Parameters are scoped to a resource and operation.** Changing either one changes which fields the node shows, so pick the resource first and the operation second.
5. **`Max Concurrency` is your rate-limit lever.** Lower it when a large batch of items starts drawing throttling responses from the Freshworks API.
6. **`Update Fields` cannot be empty.** Every update operation fails the item if you supply no fields to change.
7. **`Get Many` on accounts, contacts and deals needs a View ID.** These lists are read through a saved Freshworks view, so create the view in the CRM first and paste its ID into `View ID`.