# HubSpot CRM Integration
This integration allows you to connect Botpress with HubSpot CRM, enabling various CRM operations directly through your chatbot.
## Table of Contents
1. [Introduction](#introduction)
2. [Seeing Property IDs](#seeing-property-ids)
3. [Finding Property IDs](#finding-property-ids)
4. [Actions](#actions)
    - [Contacts](#contacts)
    - [Companies](#companies)
    - [Tickets](#tickets)
    - [Deals](#deals)
    - [Other](#other)
5. [Search](#search)
    - [Search for Companies](#search-for-companies)
    - [Search for Contacts](#search-for-contacts)
    - [Search for Tickets](#search-for-tickets)
    - [Search for Deals](#search-for-deals)
6. [Using Actions](#using-actions)
    - [Contacts](#contacts-1)
    - [Companies](#companies-1)
    - [Tickets](#tickets-1)
    - [Example with Multiple Filter Groups](#example-with-multiple-filter-groups-andor-logic)
        - [Example 1: Using AND logic within a filter group](#example-1-using-and-logic-within-a-filter-group)
        - [Example 2: Using OR logic between filter groups](#example-2-using-or-logic-between-filter-groups)
        - [Example 3: Combining AND and OR logic](#example-3-combining-and-and-or-logic)
7. [Properties](#properties)
## Introduction
This guide provides instructions on using HubSpot CRM integration to manage various CRM operations, such as creating, updating, deleting, and searching for contacts, companies, and tickets.
## Seeing Property IDs
To view the internal property names for HubSpot properties, refer to the following link: [Internal HubSpot Property Names](https://community.hubspot.com/t5/APIs-Integrations/Internal-HubSpot-property-name-for-Contact-Owner/m-p/952044).
## Finding Property IDs
You can find the properties and their IDs at this link: [HubSpot Property Settings](https://app.hubspot.com/property-settings/46425249/properties?type=0-1&eschref=%2Fcontacts%2F46425249%2Fobjects%2F0-1%2Frestore).
## Actions
### Contacts
- Get a Contact
- Create a Contact
- Delete a Contact
- Update a Contact
- Search Contacts
### Companies
- Get a Company
- Create a Company
- Delete a Company
- Update a Company
- Search Companies
### Tickets
- Get a Ticket
- Create a Ticket
- Delete a Ticket
- Update a Ticket
- Search Tickets
### Deals
- Get a Deal
- Create a Deal
- Delete a Deal
- Update a Deal
- Search Deal
### Other
- Make an API Call
## Search
### Search for Companies
```json
{
  "filterGroups": [
    {
      "filters": [
        {
          "propertyName": "industry",
          "operator": "EQ",
          "value": "Technology"
        }
      ]
    }
  ],
  "sorts": [
    {
      "propertyName": "createdate",
      "direction": "DESCENDING"
    }
  ],
  "properties": ["name", "industry", "annualrevenue"],
  "limit": 100,
  "after": 0
}
```
### Search for Contacts
```json
{
  "filterGroups": [
    {
      "filters": [
        {
          "propertyName": "email",
          "operator": "EQ",
          "value": "[email protected]"
        }
      ]
    }
  ],
  "sorts": [
    {
      "propertyName": "createdate",
      "direction": "DESCENDING"
    }
  ],
  "properties": ["createdate", "firstname", "lastname", "email"],
  "limit": 100,
  "after": 0
}
```
### Search for Tickets
```json
{
  "filterGroups": [
    {
      "filters": [
        {
          "propertyName": "subject",
          "operator": "EQ",
          "value": "Support Needed"
        }
      ]
    }
  ],
  "sorts": [
    {
      "propertyName": "createdate",
      "direction": "DESCENDING"
    }
  ],
  "properties": ["createdate", "subject", "content", "status"],
  "limit": 100,
  "after": 0
}
```
#### Search for Deals
```json
{
  "filterGroups": [
    {
      "filters": [
        {
          "propertyName": "amount",
          "operator": "GT",
          "value": "10000"
        },
        {
          "propertyName": "dealstage",
          "operator": "EQ",
          "value": "closedwon"
        }
      ]
    }
  ],
  "sorts": ["amount"],
  "limit": 10
}
```
## Using Actions
### Contacts
#### Get a Contact
To get a contact, simply provide the contact ID.
```json
{
  "contactId": "12345"
}
```
#### Create a Contact
When creating a new contact, you should include at least one of the following properties: email, firstname, or lastname. It is recommended to always include email to avoid duplicate contacts in HubSpot.
```json
{
  "properties": {
    "email": "[email protected]",
    "firstname": "Milos",
    "lastname": "Arsik",
    "phone": "(226) 700-0079",
    "company": "HubSpot",
    "hubspot_owner_id": "117816668"
  }
}
```
#### Delete a Contact
To delete a contact, simply provide the contact ID.
```json
{
  "contactId": "12345"
}
```
#### Update a Contact
Perform a partial update of a contact identified by `{contactId}`. `{contactId}` refers to the internal object ID. Provided property values will be overwritten. Read-only and non-existent properties will be ignored.
```json
{
  "contactId": "12345",
  "properties": {
    "phone": "(226) 700-0080",
    "company": "HubSpot Inc."
  }
}
```
### Companies
#### Get a Company
To get a company, simply provide the company ID.
```json
{
  "companyId": "67890"
}
```
#### Create a Company
When creating a new company, include relevant properties.
```json
{
  "properties": {
    "name": "HubSpot",
    "industry": "Technology",
    "annualrevenue": "1000000"
  }
}
```
#### Delete a Company
To delete a company, simply provide the company ID.
```json
{
  "companyId": "67890"
}
```
#### Update a Company
Perform a partial update of a company identified by `{companyId}`. `{companyId}` refers to the internal object ID. Provided property values will be overwritten. Read-only and non-existent properties will be ignored.
```json
{
  "companyId": "67890",
  "properties": {
    "annualrevenue": "1500000"
  }
}
```
### Tickets
#### Get a Ticket
To get a ticket, simply provide the ticket ID.
```json
{
  "ticketId": "54321"
}
```
#### Create a Ticket
When creating a new ticket, include relevant properties.
```json
{
  "properties": {
    "subject": "Need help with integration",
    "content": "Details about the issue...",
    "status": "open"
  }
}
```
#### Delete a Ticket
To delete a ticket, simply provide the ticket ID.
```json
{
  "ticketId": "54321"
}
```
#### Update a Ticket
Perform a partial update of a ticket identified by `{ticketId}`. `{ticketId}` refers to the internal object ID. Provided property values will be overwritten. Read-only and non-existent properties will be ignored.
```json
{
  "ticketId": "54321",
  "properties": {
    "status": "closed"
  }
}
```
### Deals
#### Get a Deal
To get a deal, provide the deal ID.
```json
{
  "dealId": "32032106769"
}
```
#### Create a Deal
```json
{
  "properties": {
    "dealname": "New Deal",
    "amount": "10000",
    "dealstage": "qualifiedtobuy",
    "closedate": "2025-12-31"
  }
}
```
#### Delete a Deal
```json
{
  "dealId": "32032106769"
}
```
#### Update a Deal
```json
{
  "dealId": "32032106769",
  "properties": {
    "dealname": "Updated Deal Name",
    "amount": "15000"
  }
}
```
#### Update Deal Stage
```json
{
  "dealId": "32032106769",
  "stage": "closedwon"
}
```
## Properties
Properties are the specific fields you want to retrieve for each record. You can specify which properties to include in the response. In the examples above, properties like `createdate`, `firstname`, and `lastname` are requested. You can customize this based on the fields available in your HubSpot account.
Example:
```json
"properties": ["createdate", "firstname", "lastname", "email", "phone"]
```
### Example with Multiple Filter Groups (AND/OR logic)
#### Example 1: Using AND logic within a filter group
```json
{
  "filterGroups": [
    {
      "filters": [
        {
          "propertyName": "createdate",
          "operator": "GTE",
          "value": "1622505600000"
        },
        {
          "propertyName": "email",
          "operator": "EQ",
          "value": "[email protected]"
        }
      ]
    }
  ],
  "sorts": [
    {
      "propertyName": "createdate",
      "direction": "DESCENDING"
    }
  ],
  "properties": ["createdate", "firstname", "lastname"],
  "limit": 100,
  "after": 0
}
```
#### Example 2: Using OR logic between filter groups
```json
{
  "filterGroups": [
    {
      "filters": [
        {
          "propertyName": "createdate",
          "operator": "GTE",
          "value": "1622505600000"
        }
      ]
    },
    {
      "filters": [
        {
          "propertyName": "email",
          "operator": "EQ",
          "value": "[email protected]"
        }
      ]
    }
  ],
  "sorts": [
    {
      "propertyName": "createdate",
      "direction": "DESCENDING"
    }
  ],
  "properties": ["createdate", "firstname", "lastname"],
  "limit": 100,
  "after": 0
}
```
#### Example 3: Combining AND and OR logic
```json
{
  "filterGroups": [
    {
      "filters": [
        {
          "propertyName": "createdate",
          "operator": "GTE",
          "value": "1622505600000"
        },
        {
          "propertyName": "email",
          "operator": "EQ",
          "value": "[email protected]"
        }
      ]
    },
    {
      "filters": [
        {
          "propertyName": "firstname",
          "operator": "EQ",
          "value": "Jane"
        }
      ]
    }
  ],
  "sorts": [
    {
      "propertyName": "createdate",
      "direction": "DESCENDING"
    }
  ],
  "properties": ["createdate", "firstname", "lastname"],
  "limit": 100,
  "after": 0
}
```