HubSpot node reference - all 68 operations, the credential it needs, and a worked example.
Calls the HubSpot CRM API with a private app token across 68 operations, grouped by object family: contacts (create, upsert, get, update, archive, list, search, batch create, merge), companies and deals (the same set), tickets (create, get, update, archive, list, search), any other object type including products, line items, quotes and custom objects (create, get, update, archive, list, search plus batch create/read/update/archive), engagements (note, task, call, meeting, email, SMS/WhatsApp/LinkedIn message), associations (default, labelled, remove, list, list labels), lists (add, remove, memberships, get, get by name, create, delete), metadata reads used to resolve IDs (owners, pipelines, pipeline stages, properties), and marketing (form submission, transactional email, subscription preferences).
Credential: HubSpot private app access token - see Credentials.
Each operation below lists the scope it needs. Scopes are ticked when you create the HubSpot private app. If a run fails with a permission error, the node names the missing scope in the error - grant it and re-run; you do not need to rebuild the workflow.
| Operation | What it does | Scope |
|---|
upsertContact | Create or update contact | crm.objects.contacts.write |
createContact | Create contact | crm.objects.contacts.write |
getContact | Get contact | crm.objects.contacts.read |
updateContact | Update contact | crm.objects.contacts.write |
archiveContact | Archive contact | crm.objects.contacts.write |
listContacts | List contacts | crm.objects.contacts.read |
searchContacts | Search contacts | crm.objects.contacts.read |
batchCreateContacts | Batch create contacts | crm.objects.contacts.write |
mergeContacts | Merge contacts | crm.objects.contacts.write |
| Operation | What it does | Scope |
|---|
createCompany | Create company | crm.objects.companies.write |
getCompany | Get company | crm.objects.companies.read |
updateCompany | Update company | crm.objects.companies.write |
archiveCompany | Archive company | crm.objects.companies.write |
listCompanies | List companies | crm.objects.companies.read |
searchCompanies | Search companies | crm.objects.companies.read |
batchCreateCompanies | Batch create companies | crm.objects.companies.write |
| Operation | What it does | Scope |
|---|
createDeal | Create deal | crm.objects.deals.write |
getDeal | Get deal | crm.objects.deals.read |
updateDeal | Update deal | crm.objects.deals.write |
archiveDeal | Archive deal | crm.objects.deals.write |
listDeals | List deals | crm.objects.deals.read |
searchDeals | Search deals | crm.objects.deals.read |
batchCreateDeals | Batch create deals | crm.objects.deals.write |
| Operation | What it does | Scope |
|---|
createTicket | Create ticket | tickets |
getTicket | Get ticket | tickets |
updateTicket | Update ticket | tickets |
archiveTicket | Archive ticket | tickets |
listTickets | List tickets | tickets |
searchTickets | Search tickets | tickets |
| Operation | What it does | Scope |
|---|
createObject | Create record | crm.objects.{objectType}.write |
getObject | Get record | crm.objects.{objectType}.read |
updateObject | Update record | crm.objects.{objectType}.write |
archiveObject | Archive record | crm.objects.{objectType}.write |
listObjects | List records | crm.objects.{objectType}.read |
searchObjects | Search records | crm.objects.{objectType}.read |
batchCreateObjects | Batch create records | crm.objects.{objectType}.write |
batchReadObjects | Batch read records | crm.objects.{objectType}.read |
batchUpdateObjects | Batch update records | crm.objects.{objectType}.write |
batchArchiveObjects | Batch archive records | crm.objects.{objectType}.write |
| Operation | What it does | Scope |
|---|
createNote | Create note | crm.objects.contacts.write |
createTask | Create task | crm.objects.contacts.write |
updateTask | Update task | crm.objects.contacts.write |
logCall | Log call | crm.objects.contacts.write |
logMeeting | Log meeting | crm.objects.contacts.write |
logEmail | Log email | crm.objects.contacts.write + sales-email-read |
logCommunication | Log SMS / WhatsApp / LinkedIn message | crm.objects.contacts.write |
| Operation | What it does | Scope |
|---|
createAssociation | Associate records | crm.objects.{fromObjectType}.write + crm.objects.{toObjectType}.write |
createAssociationWithLabel | Associate records with label | crm.objects.{fromObjectType}.write + crm.objects.{toObjectType}.write |
deleteAssociation | Remove association | crm.objects.{fromObjectType}.write + crm.objects.{toObjectType}.write |
listAssociations | List associations for a record | crm.objects.{fromObjectType}.read + crm.objects.{toObjectType}.read |
listAssociationLabels | List association labels | crm.objects.{fromObjectType}.read + crm.objects.{toObjectType}.read |
| Operation | What it does | Scope |
|---|
addToList | Add record to list | crm.lists.write |
removeFromList | Remove record from list | crm.lists.write |
getListMemberships | Get list memberships | crm.lists.read |
getList | Get list | crm.lists.read |
getListByName | Get list by name | crm.lists.read |
createList | Create list | crm.lists.write |
deleteList | Delete list | crm.lists.write |
| Operation | What it does | Scope |
|---|
listOwners | List owners | crm.objects.owners.read |
getOwner | Get owner | crm.objects.owners.read |
listPipelines | List pipelines | crm.objects.{objectType}.read |
listPipelineStages | List pipeline stages | crm.objects.{objectType}.read |
listProperties | List properties | crm.schemas.{objectType}.read |
| Operation | What it does | Scope |
|---|
submitForm | Submit a form | (none — the form submission endpoint is unauthenticated) |
sendTransactionalEmail | Send transactional email | transactional-email |
getSubscriptionDefinitions | List subscription types | communication_preferences.read |
getSubscriptionStatuses | Get subscription preferences | communication_preferences.read |
updateSubscriptionStatus | Update subscription preference | communication_preferences.write |
Create or update the contact behind a new signup
A signup webhook fires and the CRM should end up with exactly one contact for that email address, whether or not it already existed. Upsert keys on email, so re-running the workflow for a returning user updates rather than duplicates.
Set Operation to upsertContact, then fill in:
| Field | Value | Notes |
|---|
email | {{signup.email}} | The upsert key - required; HubSpot matches on the email property |
firstName | {{signup.firstName}} | Written to the firstname property |
lastName | {{signup.lastName}} | Written to the lastname property |
propertiesJson | {"lifecyclestage": "lead"} | Any portal-defined property; the named fields above win on conflict |
Sets {{contact.id}} (the HubSpot contact ID), {{contact.email}} and {{contact.contact}} (the full record). A following Create note node can point at {{contact.id}}. Unlike the other contact operations this one returns contact, not record.