# CRM steps

The fields of the eight CRM steps, how each finds or creates its record, and what each saves.

Updated Oct 28, 2026. Source: https://smallbusinesschatbot.com/docs/workflows/steps/crm-steps

## What this does

The CRM steps read and change records in the CRM of Small Business Chatbot: **Find Contact**, **Upsert Contact**, **Upsert Company**, **Upsert Opportunity**, **Create CRM Note**, **Create CRM Task**, **Add Contact Tag** and **Remove Contact Tag**. Upsert means the step updates the matching record or creates one when none matches. The steps run whatever the **Passive CRM sync** switches say.

- **Where:** **Workflows** › a step's **Node settings** › **Node type**: one of the eight steps
- **Needs:** nothing

IDs come from the trigger or an earlier step, as variables, for example `{{trigger.contact.contact_id}}` or `{{node_outputs_by_name.upsert_contact.contact_id}}`.

## Find Contact

Looks up one contact. When none matches, the step still succeeds, with `found` set to `false`.

| Field | What it does | Default or options |
|---|---|---|
| **Contact field** | Which field **Lookup value** is matched against. | Phone. Options: Phone, Email, Contact ID |
| **Lookup value** | The value to look for. When it is filled, the three fields below are ignored. | Empty |
| **Contact ID** | Looks up by ID. | Empty |
| **Phone** | Looks up by phone. | Empty |
| **Email** | Looks up by email. | Empty |

Saves `found` (`true` or `false`), `contact_id`, `contact` (the contact's fields) and `match_type` (`contact_id`, `phone`, `email` or `none`).

## Upsert Contact

Updates the contact that matches the **Contact ID**, **Phone** or **Email**, or creates a contact when none matches.

| Field | What it does | Default or options |
|---|---|---|
| **Contact ID** | Matches this contact first. | Empty |
| **First name**, **Last name**, **Full name** | The contact's name. | Empty |
| **Email**, **Phone** | Used to match and saved on the contact. | Empty |
| **Website**, **LinkedIn URL**, **Business name** | Saved on the contact. | Empty |
| **Status** | Saved as typed. | Empty |
| **Source** | Saved as the contact's source. On an existing contact it replaces the current source. | `workflow` |
| **Tags** | Tags to add, separated by commas. Saved in lowercase. | Empty |

![An Upsert Contact step filled with variables from an inbound webhook and the tag website form](https://smallbusinesschatbot.com/static/images/docs/workflows/crm-steps-ref-upsert-contact-2026-10-28.webp)
*Workflows › Upsert Contact, October 2026*

A blank field keeps the contact's current value. Tags are added to the contact's existing tags; to remove one, use **Remove Contact Tag**. Saves `contact`, `contact_id`, `created` (`true` for a new contact) and `matched_by`.

## Upsert Company

| Field | What it does | Default or options |
|---|---|---|
| **Company ID** | Updates this company. | Empty |
| **Company name** | Required. With no ID, a company with the same name is updated, otherwise a new one is created. | Empty |
| **Website**, **Company email**, **Company phone**, **Industry** | Saved on the company. | Empty |

Saves `company_id`, `record` and `created`.

## Upsert Opportunity

| Field | What it does | Default or options |
|---|---|---|
| **Opportunity ID** | Updates this opportunity. | Empty |
| **Opportunity name** | Required. | Empty |
| **Primary contact ID** | Required. The contact must exist. | Empty |
| **Primary company ID** | The company must exist when filled. | Empty |
| **Pipeline ID**, **Stage ID** | Required. The stage must be an active stage of that pipeline. | Empty |
| **Status** | The opportunity's status. | Open. Options: Open, Won, Lost, Abandoned |
| **Monetary value** | Saved as a whole number. | 0 |

Saves `opportunity_id`, `record` and `created`.

## Create CRM Note

| Field | What it does | Default or options |
|---|---|---|
| **Note** | Required. The note's text. | Empty |
| **Contact ID**, **Company ID**, **Opportunity ID** | The records the note is on. Each must exist when filled. | Empty |

Saves `note_id` and `record`.

## Create CRM Task

| Field | What it does | Default or options |
|---|---|---|
| **Task title** | Required. | Empty |
| **Description** | The task's details. | Empty |
| **Contact ID**, **Company ID**, **Opportunity ID** | The records the task is on. Each must exist when filled. | Empty |
| **Due at** | The due date and time, such as `2026-08-10T14:00:00Z`. A time with no time zone is read as UTC. | Empty |
| **Priority** | The task's priority. | Normal. Options: Low, Normal, High, Urgent |

New tasks are open. Saves `task_id` and `record`.

## Add Contact Tag and Remove Contact Tag

| Field | What it does | Default or options |
|---|---|---|
| **Contact ID**, **Phone**, **Email** | Find the contact to change. | Empty |
| **Tag** | Required. The tag to add or remove, saved in lowercase. | Empty |

The contact must exist. Saves `contact`, `contact_id`, `tag` and `tags`, the contact's tags after the change.

## When a CRM step fails

| You see in **Last error** | Why |
|---|---|
| "requires review because an identifier matches multiple contacts" | The phone or email belongs to more than one contact. Merge them under **CRM › Contacts** or use **Contact ID**. |
| "requires review because the supplied identifiers match different contacts" | The ID, phone and email point at different contacts. |
| "could not find a CRM contact to update" | **Add Contact Tag** or **Remove Contact Tag** found no contact. |
| "node requires:" and a field name | A required field is empty. |
| "was not found" | An ID points at a contact, company or opportunity that doesn't exist. |

## After a CRM step runs

After **Find Contact**, **Upsert Contact**, **Add Contact Tag** or **Remove Contact Tag**, the run knows its contact. **Executions** shows it, and replies and [Remove From Cadence](https://smallbusinesschatbot.com/docs/workflows/steps/remove-from-workflow) match the run by it.

Records and tags these steps create start no other workflows. The one exception: with **Automatically create and link companies** on, a company that **Upsert Contact** creates from **Business name** fires **Company created**.

## Guides that use it

- [Contacts](https://smallbusinesschatbot.com/docs/user-guides/crm/contacts)
- [Companies and opportunities](https://smallbusinesschatbot.com/docs/user-guides/crm/companies-and-opportunities)
- [Inbound webhooks](https://smallbusinesschatbot.com/docs/integrations/automation/inbound-webhooks): a webhook run often starts with **Upsert Contact**.
