AutomationFlowsWeb Scraping › Automated Call Summary Transfer From Chorus AI to Hubspot CRM

Automated Call Summary Transfer From Chorus AI to Hubspot CRM

ByRivers Colyer @riverscolyer on n8n.io

SALES teams and AGENCIES that want to automatically send call summaries to their CRM.

Cron / scheduled trigger★★★★☆ complexity18 nodesHTTP Request
Web Scraping Trigger: Cron / scheduled Nodes: 18 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #8680 — we link there as the canonical source.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "M3e7JbXymYbkSURp",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Chorus -> HubSpot - Transfer Summarization of Calls",
  "tags": [],
  "nodes": [
    {
      "id": "590ade85-9a23-4136-b70b-3fc282d2efd3",
      "name": "Get Chorus Engagement per last day",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -48,
        -96
      ],
      "parameters": {
        "url": "https://chorus.ai/v3/engagements",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          },
          "pagination": {
            "pagination": {
              "parameters": {
                "parameters": [
                  {
                    "name": "continuation_key",
                    "value": "={{ $response.body.continuation_key }}"
                  }
                ]
              },
              "maxRequests": 15,
              "requestInterval": 250,
              "limitPagesFetched": true,
              "completeExpression": "={{ $response.body.engagements?.length === 0 }}",
              "paginationCompleteWhen": "other"
            }
          }
        },
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "min_date",
              "value": "={{ $now.minus(1, 'day').toUTC().toISO() }}"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "e703addd-f6ab-4762-b1fc-129c28c6d952",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -256
      ],
      "parameters": {
        "width": 656,
        "height": 400,
        "content": "## Chorus.AI\nThis part of code will ask Chorus AI about new engagements per last 1 day and load it with pagination and filter items which not contains information about summary.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "feb3bf00-ad3a-4636-8a71-02a8c036ccfb",
      "name": "Merge paginated engagements",
      "type": "n8n-nodes-base.code",
      "position": [
        160,
        -96
      ],
      "parameters": {
        "jsCode": "let engagements = []\n\nfor (const item of $input.all()) {\n  engagements = engagements.concat(item.json.engagements)\n  console.log(engagements)\n}\n\nreturn engagements;"
      },
      "typeVersion": 2
    },
    {
      "id": "9aaef85b-d612-4842-9373-232d3eb0e7d3",
      "name": "Filter items with empty meeting_summary",
      "type": "n8n-nodes-base.filter",
      "position": [
        352,
        -96
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "04f7da95-b5b4-47a8-8f46-bb715b8bdbe6",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.meeting_summary }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a9678b63-5230-4339-af34-236bc8c5ac60",
      "name": "Search Company In HubSpot By Name",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        944,
        -176
      ],
      "parameters": {
        "url": "https://api.hubapi.com/crm/v3/objects/companies/search",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"filterGroups\": [{\n    \"filters\": [{\n      \"propertyName\": \"name\",\n      \"operator\": \"EQ\",\n      \"value\": \"{{ $json.account_name }}\"\n    }]\n  }],\n  \"properties\": [\"name\", \"domain\", \"hs_object_id\"],\n  \"limit\": 1\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "hubspotAppToken"
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2,
      "waitBetweenTries": 3000
    },
    {
      "id": "01b8ba7d-fa0b-4d5b-a273-89548f625d68",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        -576
      ],
      "parameters": {
        "width": 1760,
        "height": 752,
        "content": "## HubSpot \nHere we will search company in HubSpot by full equal name between Chorus.AI account_name and HubSpot Company Name.\nIf matched company exists, we will check if current engagement already present in notes.\nIf such engagement not present in notes, we creating it.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "66a686e5-2dca-459c-bd2d-f01150f4d9fc",
      "name": "If company exists",
      "type": "n8n-nodes-base.if",
      "position": [
        1136,
        -176
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "13106367-6866-44c3-8404-9767e67753b4",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.results[0].id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a2c7b0fc-3b9b-4700-92cb-8a54609dc53c",
      "name": "Search notes",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1424,
        -240
      ],
      "parameters": {
        "url": "https://api.hubapi.com/crm/v3/objects/notes/search",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n    \"filterGroups\": [{\n      \"filters\": [\n        {\n          \"propertyName\": \"hs_note_body\",\n          \"operator\": \"CONTAINS_TOKEN\",\n          \"value\": \"{{ $('Loop Over Engagements').item.json.engagement_id }}\"\n        },\n        {\n          \"propertyName\": \"associations.company\",\n          \"operator\": \"EQ\",\n          \"value\": \"{{ $json.results[0].id }}\"\n        }\n      ]\n    }],\n    \"properties\": [\"hs_note_body\",\"hs_timestamp\"],\n    \"limit\": 25\n  }",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "hubspotAppToken"
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2
    },
    {
      "id": "9176cd7a-8133-4e3d-bad2-ba4d7a6c61ae",
      "name": "Loop Over Engagements",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        720,
        -192
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "a6582225-17c5-4e69-aad5-1c8288ad63ae",
      "name": "If note not exist",
      "type": "n8n-nodes-base.if",
      "position": [
        1632,
        -176
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "8897f49e-83ba-4d8d-950b-b2317958f9fb",
              "operator": {
                "type": "array",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.results }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a80f3f6b-18b4-4d2f-a1e6-e492b80f904a",
      "name": "Skip, if company not found",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1344,
        -32
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "d1254ac5-fc4e-451b-b611-a8d3e134b327",
      "name": "Skip, if note already exists",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1840,
        -32
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f673fac3-18b7-4294-b6ba-6fb674e9671a",
      "name": "Create Note Payload",
      "type": "n8n-nodes-base.code",
      "position": [
        1840,
        -304
      ],
      "parameters": {
        "jsCode": "const callSecondsDateTime = $('Loop Over Engagements').first().json.date_time;\nvar callDateTime = new Date(callSecondsDateTime * 1000)\n\nconst callSummary = $('Loop Over Engagements').first().json.meeting_summary;\nconst callLink = $('Loop Over Engagements').first().json.url;\nconst callId = $('Loop Over Engagements').first().json.engagement_id;\n\nvar note_body = `\n<b>Call Date/Time: ${callDateTime.toLocaleString()}</b> \n<br><br>\n<b>Summary body:</b><br> ${callSummary}\"\n<br><br>\n<b>Link to call recording:</b> <a href=\"${callLink}\" target=\"_blank\">${callLink}</a>\n<br>\n<b>Chorus Engagement ID:</b> ${callId}\n`\n\nreturn {\n  \"json\": {\n      \"properties\": {\n        \"hs_timestamp\": callDateTime.toISOString(),\n        \"hs_note_body\": note_body,\n      },\n      \"associations\": [\n          {\n            \"to\": {\n              \"id\": $('Search Company In HubSpot By Name').first().json.results[0].id\n            },\n            \"types\": [\n              {\n                \"associationCategory\": \"HUBSPOT_DEFINED\",\n                \"associationTypeId\": 190\n              }\n            ]\n          }\n        ]\n  }  \n};"
      },
      "typeVersion": 2
    },
    {
      "id": "63016a15-dbad-48d3-bae1-b5a30a88e845",
      "name": "Create Note",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2032,
        -304
      ],
      "parameters": {
        "url": "https://api.hubspot.com/crm/v3/objects/notes",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $json }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "hubspotAppToken"
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "9ea518e1-f7c4-4aea-9900-e43d45167f51",
      "name": "Continue",
      "type": "n8n-nodes-base.noOp",
      "position": [
        2192,
        -32
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c9e6cf34-de5b-46b0-beff-662ee49e9bfa",
      "name": "Run every hour",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -432,
        -192
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c12c466a-8acd-4723-8454-57fc87756752",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -432,
        0
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "28c8e238-a8b1-4135-967e-7380d92baa1e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -512,
        -352
      ],
      "parameters": {
        "width": 272,
        "height": 528,
        "content": "## Triggers\nHere we are declaring how this workflow can be started"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "5c4b90f9-61ad-42ab-8592-e688cd689d57",
  "connections": {
    "Continue": {
      "main": [
        [
          {
            "node": "Loop Over Engagements",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Note": {
      "main": [
        [
          {
            "node": "Continue",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search notes": {
      "main": [
        [
          {
            "node": "If note not exist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run every hour": {
      "main": [
        [
          {
            "node": "Get Chorus Engagement per last day",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If company exists": {
      "main": [
        [
          {
            "node": "Search notes",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Skip, if company not found",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If note not exist": {
      "main": [
        [
          {
            "node": "Create Note Payload",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Skip, if note already exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Note Payload": {
      "main": [
        [
          {
            "node": "Create Note",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Engagements": {
      "main": [
        [],
        [
          {
            "node": "Search Company In HubSpot By Name",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Skip, if company not found": {
      "main": [
        [
          {
            "node": "Loop Over Engagements",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge paginated engagements": {
      "main": [
        [
          {
            "node": "Filter items with empty meeting_summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Skip, if note already exists": {
      "main": [
        [
          {
            "node": "Loop Over Engagements",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Company In HubSpot By Name": {
      "main": [
        [
          {
            "node": "If company exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Chorus Engagement per last day": {
      "main": [
        [
          {
            "node": "Merge paginated engagements",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Get Chorus Engagement per last day",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter items with empty meeting_summary": {
      "main": [
        [
          {
            "node": "Loop Over Engagements",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

SALES teams and AGENCIES that want to automatically send call summaries to their CRM.

Source: https://n8n.io/workflows/8680/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

As n8n instances scale, teams often lose track of sub-workflows—who uses them, where they are referenced, and whether they can be safely updated. This leads to inefficiencies like unnecessary copies o

HTTP Request, n8n, N8N Trigger +1
Web Scraping

This workflow is an improvement of this workflow by Greg Brzezinka.

HTTP Request, Email Send, XML +1
Web Scraping

N8N-Workflow-Github-Manager. Uses github, httpRequest, n8n. Scheduled trigger; 38 nodes.

GitHub, HTTP Request, n8n
Web Scraping

This workflow uses KlickTipp community nodes, available for self-hosted n8n instances only.

N8N Nodes Klicktipp, Salesforce, Salesforce Trigger +1
Web Scraping

This workflow acts as an automated engagement bot. It sends a Direct Message (DM) with a link or resource to any follower who replies to your post with a specific target keyword.

HTTP Request