HubSpot

Your HubSpot CRM, in two nodes on one connected credential. The action runs 51 operations — contacts, companies, deals and tickets, links between them (with labels), notes, tasks, calls and meetings, products and quotes, forms, conversations and lists — and can also be an AI toolkit. The trigger fires a flow when a record is created, deleted, merged or restored, any property changes — a deal's stage, a lifecycle stage, your own custom fields — records are linked, a form is submitted, or a conversation gets a message.

Setup

Connect HubSpot under Settings → Credentials, or straight from the node: name the credential, pick your HubSpot account and approve the HostWebhook app. The credential remembers which account it belongs to; reconnecting it to a different account is refused, because every trigger on it would start listening somewhere else.

The app asks for read and write on contacts, companies and deals, read on owners and on their properties — and, optionally, tickets, lists, products, line items, quotes, forms and conversations. An account without one of those products connects anyway, without those operations; the node says so instead of failing with a bare 403.

ℹConnected before October 11, 2026? Your credential was never asked for products, quotes, forms or conversations. Reconnect it once (Settings → Credentials → Reconnect, same HubSpot account) and tick the optional permissions on HubSpot's screen — they come unticked. If they show a lock (“disabled for this app by an admin”), a HubSpot admin has to switch them on first: follow Go to admin settings in that lock's tooltip, turn the permissions on for the HostWebhook app, and reconnect.

Operations

Contacts

ValueIn the dropdownWhat it does
createContactCreate contactCreates a contact. HubSpot refuses a second contact with the same email — use “Create or update” for that.
updateContactUpdate contactChanges the fields you fill in; empty fields stay as they are.
upsertContactCreate or update contact by emailUpdates the contact with this email, or creates it if there is none.
getContactGet contactOne contact by ID or by email, with its properties.
searchContactsSearch contactsFinds contacts by text, by a property, or both. Newest first.
deleteContactDelete contactMoves the contact to HubSpot's recycling bin (restorable for 90 days).
gdprDeleteContactPermanently delete contact (GDPR)Deletes the contact and everything tied to it for good, to honor a GDPR request. It can't be restored. Deleting by email also blocks that email from being added again.

Companies

ValueIn the dropdownWhat it does
createCompanyCreate companyCreates a company. HubSpot fills in what it knows from the domain.
updateCompanyUpdate companyChanges the fields you fill in; empty fields stay as they are.
getCompanyGet companyOne company by ID, with its properties.
searchCompaniesSearch companiesFinds companies by text, by a property, or both. Newest first.
deleteCompanyDelete companyMoves the company to HubSpot's recycling bin (restorable for 90 days).

Deals

ValueIn the dropdownWhat it does
createDealCreate dealCreates a deal in a pipeline and stage, linked to a contact and a company if you give them.
updateDealUpdate dealChanges the fields you fill in — moving it to another stage, for one. Empty fields stay as they are.
getDealGet dealOne deal by ID, with its properties.
searchDealsSearch dealsFinds deals by text, by a property, or both. Newest first.
deleteDealDelete dealMoves the deal to HubSpot's recycling bin (restorable for 90 days).

Tickets

ValueIn the dropdownWhat it does
createTicketCreate ticketCreates a ticket in a pipeline and status, linked to a contact and a company if you give them.
updateTicketUpdate ticketChanges the fields you fill in — its status, for one. Empty fields stay as they are.
getTicketGet ticketOne ticket by ID, with its properties.
searchTicketsSearch ticketsFinds tickets by text, by a property, or both. Newest first.
deleteTicketDelete ticketMoves the ticket to HubSpot's recycling bin (restorable for 90 days).

Associations

ValueIn the dropdownWhat it does
associateRecordsLink two recordsLinks two records — a contact to a company, a deal to a contact… With a label (“Decision maker”, “Billing contact”), the link carries it; the labels already there stay.
removeAssociationUnlink two recordsRemoves every association between two records. Neither record is deleted.
listAssociationLabelsList association labelsThe association labels the account has between two kinds of record (“Decision maker”, “Billing contact”…), with the ID to use in “Link two records”.

Activity

ValueIn the dropdownWhat it does
createNoteCreate noteAdds a note to the timeline of a contact, company, deal or ticket.
createTaskCreate taskCreates a task for someone on your team, linked to a contact, company, deal or ticket.
logCallLog callRecords a call that already happened on the timeline of a contact, company, deal or ticket — from your phone system, for one.
logMeetingLog meetingRecords a meeting — held or booked — on the timeline of a contact, company, deal or ticket.

Products & line items

ValueIn the dropdownWhat it does
createProductCreate productAdds a product to the account's product library, ready to put on deals and quotes.
updateProductUpdate productChanges the fields you fill in; empty fields stay as they are.
getProductGet productOne product by ID, with its properties.
searchProductsSearch productsFinds products by text, by a property, or both. Newest first.
deleteProductDelete productArchives the product in the library. Deals and quotes that already have it keep their line items.
addLineItemToDealAdd line item to dealPuts a product (or a one-off item) on a deal, with its quantity and price. The deal's amount follows its line items.
listDealLineItemsList deal line itemsThe products and items on a deal, with quantity, price and amount.
deleteLineItemRemove line itemTakes a line item off its deal and deletes it. The product stays in the library.

Quotes

ValueIn the dropdownWhat it does
createQuoteCreate quoteCreates a draft quote for a deal and its buyer, with a copy of the deal's line items and the account's default quote template. Needs Revenue Hub Professional or Enterprise.
getQuoteGet quoteOne quote by ID: status, amount, expiry and its public link.
searchQuotesSearch quotesFinds quotes by text, by a property, or both. Newest first.

Forms

ValueIn the dropdownWhat it does
listFormsList formsThe account's forms, with their IDs.
getFormSubmissionsGet form submissionsThe latest submissions of a form, newest first, with what each person filled in.

Conversations

ValueIn the dropdownWhat it does
listThreadsList conversationsConversations of the inbox, most recent activity first.
getThreadMessagesGet conversation messagesThe messages of a conversation, oldest first, with who sent each one.
replyToThreadReply to conversationSends a reply in a conversation, on the channel the customer used (email, chat…), to whoever wrote last.
updateThreadStatusClose or reopen conversationMarks a conversation closed, or opens it again.

Lists

ValueIn the dropdownWhat it does
listListsList static listsThe static contact lists of the account (the ones you can add contacts to by hand), with their IDs. HubSpot shows lists as Segments.
addToListAdd contact to listAdds contacts to a static list. Lists that fill themselves from filters can't be changed by hand.
removeFromListRemove contact from listTakes contacts out of a static list. The contacts stay in HubSpot.

Owners & pipelines

ValueIn the dropdownWhat it does
listOwnersList ownersThe people in the HubSpot account who can own records, with their owner IDs.
listPipelinesList pipelines and stagesThe deal or ticket pipelines of the account, each with its stages and their IDs.

Picked from your account

Owner, Pipeline, Stage, List, the association Label, the Product, the Form, the Inbox, the values of properties like Lifecycle stage or Lead status, and the properties you filter by or add are picked from the connected account — your own pipelines and custom properties included. Typing an ID or a template ({{payload.ownerId}}) is in the picker's footer. Changing the pipeline clears the stage, which only exists in its own pipeline, and changing From or To clears the label, which belongs to that pair.

Other properties takes any property by its internal name — one per line (city: {{payload.city}}) or as JSON — and wins over the fields above if it repeats one. Empty fields are not sent: in an update, what you leave empty stays as it is in HubSpot.

IDs are HubSpot's record IDs (numbers), usually from the trigger ({{payload.objectId}}). The output keeps HubSpot's own shape — { id, properties, createdAt, updatedAt } — so its API reference applies as it is. Searches come back as { contacts: [...], count, total, hasMore } (or companies, deals, tickets), newest first, and the next node runs once per record.

Labels, calls, products, quotes, forms and conversations

  • Link two records takes an optional Label (“Decision maker”, “Billing contact”) between those two kinds of record. The labels the two records already had stay. List association labels gives the IDs (USER_DEFINED:36).
  • Log call and Log meeting put an activity that already happened — or a booked meeting — on the timeline of a contact, company, deal or ticket. A call's duration goes in seconds. A meeting needs an Owner: HubSpot doesn't create meetings without one.
  • Add line item to deal puts a product from your library (or a one-off item with a name and a price) on a deal; the deal's amount follows its line items.
  • Create quote makes a draft quote for a deal and its buyer with a copy of the deal's line items — HubSpot asks that quotes don't reuse the deal's own — and the account's default template. The deal needs line items first.
  • Get form submissions reads a form's latest submissions, newest first, with the values by field name: {{item.values.email}}.
  • Reply to conversation answers on the channel the customer used — email, chat — to whoever wrote last. It's sent as the HubSpot user in Send as, or, empty, as whoever the conversation is assigned to.
⚠Writes run for real, Run Test too. Deleting moves the record to HubSpot's recycling bin, where it can be restored for 90 days — except Permanently delete contact (GDPR), which erases the contact and its activity for good; by email, HubSpot also blocks that address from being added again. A reply in a conversation reaches the customer. Create contact fails if the email is already taken — use Create or update contact by email when the contact may exist.

AI toolkit mode

Once the credential is picked, the node asks for a Mode. AI toolkit turns it into 51 tools that an AI Node — or an MCP client, through one of your MCP servers — calls by name: a sales assistant that finds a contact, moves the deal to the next stage and leaves a note on its timeline.

ToolArguments
create_hubspot_contactemail? · first_name? · last_name? · phone? · company? · job_title? · lifecycle_stage? · lead_status? · owner_id? · company_id? · properties?
update_hubspot_contactcontact_id · email? · first_name? · last_name? · phone? · company? · job_title? · lifecycle_stage? · lead_status? · owner_id? · properties?
upsert_hubspot_contactemail · first_name? · last_name? · phone? · company? · job_title? · lifecycle_stage? · lead_status? · owner_id? · properties?
get_hubspot_contactlookup_by? · contact_id · properties_to_return?
search_hubspot_contactsquery? · filter_property? · filter_operator? · filter_value? · properties_to_return? · limit?
delete_hubspot_contactcontact_id — blocked by default
delete_hubspot_contact_permanentlylookup_by? · contact_id — blocked by default
create_hubspot_companyname · domain? · phone? · city? · country? · lifecycle_stage? · owner_id? · properties?
update_hubspot_companycompany_id · name? · domain? · phone? · city? · country? · lifecycle_stage? · owner_id? · properties?
get_hubspot_companycompany_id · properties_to_return?
search_hubspot_companiesquery? · filter_property? · filter_operator? · filter_value? · properties_to_return? · limit?
delete_hubspot_companycompany_id — blocked by default
create_hubspot_dealdeal_name · pipeline_id · stage_id · amount? · close_date? · owner_id? · contact_id? · company_id? · properties?
update_hubspot_dealdeal_id · deal_name? · pipeline_id? · stage_id? · amount? · close_date? · owner_id? · properties?
get_hubspot_dealdeal_id · properties_to_return?
search_hubspot_dealsquery? · filter_property? · filter_operator? · filter_value? · properties_to_return? · limit?
delete_hubspot_dealdeal_id — blocked by default
create_hubspot_ticketsubject · content? · pipeline_id · stage_id · priority? · owner_id? · contact_id? · company_id? · properties?
update_hubspot_ticketticket_id · subject? · content? · pipeline_id? · stage_id? · priority? · owner_id? · properties?
get_hubspot_ticketticket_id · properties_to_return?
search_hubspot_ticketsquery? · filter_property? · filter_operator? · filter_value? · properties_to_return? · limit?
delete_hubspot_ticketticket_id — blocked by default
associate_hubspot_recordsfrom_object · from_id · to_object · to_id · label_id?
remove_hubspot_associationfrom_object · from_id · to_object · to_id
list_hubspot_association_labelsfrom_object · to_object
create_hubspot_notebody · contact_id? · company_id? · deal_id? · ticket_id? · owner_id? · timestamp?
create_hubspot_tasksubject · body? · due_date? · task_type? · priority? · owner_id? · contact_id? · company_id? · deal_id? · ticket_id?
log_hubspot_calltitle? · body? · direction? · status? · duration_seconds? · from_number? · to_number? · recording_url? · contact_id? · company_id? · deal_id? · ticket_id? · owner_id? · timestamp?
log_hubspot_meetingtitle · start_time · end_time? · body? · outcome? · location? · internal_notes? · contact_id? · company_id? · deal_id? · ticket_id? · owner_id
create_hubspot_productname · price? · sku? · description? · billing_frequency? · properties?
update_hubspot_productproduct_id · name? · price? · sku? · description? · billing_frequency? · properties?
get_hubspot_productproduct_id · properties_to_return?
search_hubspot_productsquery? · filter_property? · filter_operator? · filter_value? · properties_to_return? · limit?
delete_hubspot_productproduct_id — blocked by default
add_hubspot_line_itemdeal_id · product_id? · name? · quantity · price? · discount_percent? · properties?
list_hubspot_deal_line_itemsdeal_id
delete_hubspot_line_itemline_item_id — blocked by default
create_hubspot_quotetitle · deal_id · contact_id · expiration_date · properties?
get_hubspot_quotequote_id · properties_to_return?
search_hubspot_quotesquery? · filter_property? · filter_operator? · filter_value? · properties_to_return? · limit?
list_hubspot_formsname?
get_hubspot_form_submissionsform_id · limit?
list_hubspot_conversationsinbox_id? · status? · contact_id? · limit?
get_hubspot_conversation_messagesconversation_id · limit?
reply_to_hubspot_conversationconversation_id · text · send_as?
update_hubspot_conversation_statusconversation_id · status
list_hubspot_listsname?
add_to_hubspot_listlist_id · contact_ids
remove_from_hubspot_listlist_id · contact_ids
list_hubspot_ownersemail?
list_hubspot_pipelinesobject_type

What you control

  • Blocked tools. The seven deletes start blocked — the four CRM records, products, line items and the permanent GDPR delete. Unblock only what the agent really needs, under Block these tool calls.
  • Characters per call sent to the model. 20,000 by default, anything from 1,000 to 200,000.

New tools reach your agents

When the HubSpot toolkit gains a tool — the 21 that arrived on October 11, 2026, for one — an AI Node that already used this node gets it without anyone adding it, unless it's blocked on the node. The AI Node's Tools tab lists the ones that arrived that way; remove one there and it won't come back to that agent.

What goes back to the model

The same response as the operation. Searches return 20 unless the model asks for more, up to 100. Pipeline, stage, owner, list, label and form IDs belong to the account, so the model is told to look them up with list_hubspot_pipelines, list_hubspot_owners, list_hubspot_lists, list_hubspot_association_labels and list_hubspot_forms instead of guessing them. Records that don't fit the characters limit are left out whole, with a notes field saying how many. Arguments are used as written: a {{payload.x}} the model writes is not resolved against the flow.

Testing a tool

⚠Only a tool call picks the tool. In AI toolkit mode, only an AI Node, an MCP client or a voice agent chooses which tool the node runs. Run Test, a flow or a webhook run the operation saved on the node: an operation in their payload that names another tool is refused.
✦To try a tool, call it from an AI Node or from an MCP client. Its arguments look like this:
jsonA tool call
{ "operation": "search_hubspot_contacts", "query": "sam.rivera@example.com" }
⚠A node in toolkit mode is not part of the pipeline. Events arriving through connections made before you switched are refused — the node only runs the tool it is asked for.

The trigger

Pick HubSpot as the service on a Trigger node and a HubSpot credential. Installing the HostWebhook app already sends the account's CRM changes to HostWebhook, so activating changes nothing in HubSpot and never expires: the trigger simply starts picking the events you chose, for that account.

What fires it

Event Trigger takes one or more; pick at least one. Changing them while the trigger is active counts from the next event, with nothing to apply. The property changes in the list cover the properties that matter most; for any other one — your own custom properties included — open Watch other properties and pick them per object. They fire like the ones in the list, with the whole record and the value before, usually within half a minute (they come through HubSpot's webhooks journal). HubSpot's journal doesn't record changes made by HostWebhook itself, so a flow that changes a watched property doesn't fire this trigger again — changes made in HubSpot, by people or other apps, do.

Form submitted needs the forms it watches: pick them under Forms. HubSpot has no webhook for form submissions, so HostWebhook checks every 5 minutes — and right away when HubSpot says a contact just converted. Submissions made before the trigger was activated — or before you added that form — don't run. New incoming conversation message fires when a customer writes in an inbox conversation (email, chat…); New outgoing conversation message when your team or a bot replies. Internal comments don't fire either.

ContactseventWhen
Contact createdcontact.creationA new contact was created.
Contact email changedcontact.propertyChange:emailThe contact's email changed.
Contact first name changedcontact.propertyChange:firstnameThe contact's first name changed.
Contact last name changedcontact.propertyChange:lastnameThe contact's last name changed.
Contact phone changedcontact.propertyChange:phoneThe contact's phone changed.
Contact lifecycle stage changedcontact.propertyChange:lifecyclestageThe contact's lifecycle stage changed.
Contact lead status changedcontact.propertyChange:hs_lead_statusThe contact's lead status changed.
Contact owner changedcontact.propertyChange:hubspot_owner_idThe contact's owner changed.
Contact associations changedcontact.associationChangeThe contact was linked to or unlinked from another record.
Contacts mergedcontact.mergeTwo contacts were merged into one.
Contact deletedcontact.deletionA contact was deleted.
Contact restoredcontact.restoreA deleted contact was restored.
CompanieseventWhen
Company createdcompany.creationA new company was created.
Company name changedcompany.propertyChange:nameThe company's name changed.
Company domain changedcompany.propertyChange:domainThe company's domain changed.
Company lifecycle stage changedcompany.propertyChange:lifecyclestageThe company's lifecycle stage changed.
Company owner changedcompany.propertyChange:hubspot_owner_idThe company's owner changed.
Company associations changedcompany.associationChangeThe company was linked to or unlinked from another record.
Companies mergedcompany.mergeTwo companies were merged into one.
Company deletedcompany.deletionA company was deleted.
Company restoredcompany.restoreA deleted company was restored.
DealseventWhen
Deal createddeal.creationA new deal was created.
Deal deal name changeddeal.propertyChange:dealnameThe deal's deal name changed.
Deal stage changeddeal.propertyChange:dealstageThe deal's stage changed.
Deal pipeline changeddeal.propertyChange:pipelineThe deal's pipeline changed.
Deal amount changeddeal.propertyChange:amountThe deal's amount changed.
Deal close date changeddeal.propertyChange:closedateThe deal's close date changed.
Deal owner changeddeal.propertyChange:hubspot_owner_idThe deal's owner changed.
Deal associations changeddeal.associationChangeThe deal was linked to or unlinked from another record.
Deals mergeddeal.mergeTwo deals were merged into one.
Deal deleteddeal.deletionA deal was deleted.
Deal restoreddeal.restoreA deleted deal was restored.
TicketseventWhen
Ticket createdticket.creationA new ticket was created.
Ticket subject changedticket.propertyChange:subjectThe ticket's subject changed.
Ticket pipeline changedticket.propertyChange:hs_pipelineThe ticket's pipeline changed.
Ticket status changedticket.propertyChange:hs_pipeline_stageThe ticket's status changed.
Ticket priority changedticket.propertyChange:hs_ticket_priorityThe ticket's priority changed.
Ticket owner changedticket.propertyChange:hubspot_owner_idThe ticket's owner changed.
Ticket associations changedticket.associationChangeThe ticket was linked to or unlinked from another record.
Tickets mergedticket.mergeTwo tickets were merged into one.
Ticket deletedticket.deletionA ticket was deleted.
Ticket restoredticket.restoreA deleted ticket was restored.
ConversationseventWhen
New incoming conversation messageconversation.newMessage:incomingA customer wrote in a conversation of the inbox (email, chat…).
New outgoing conversation messageconversation.newMessage:outgoingSomeone on your team (or a bot) replied in a conversation.
FormseventWhen
Form submittedform.submissionSomeone submitted one of the forms you pick. Checked every 5 minutes, sooner when HubSpot says a contact converted.

What the trigger sends downstream

HubSpot's event only carries the record's ID, so HostWebhook reads the record before running the flow and puts it in record, with HubSpot's field names: the usual properties (name, email, stage, owner…), the one that changed, and the ones you add under More … properties in the record. A deleted record comes with its ID and record: null. A property change also brings previousValue, from the property's history (null when it was empty before).

{
  "type": "deal.propertyChange",
  "label": "Deal stage changed",
  "object": "deal",
  "objectId": "9201",
  "propertyName": "dealstage",
  "propertyValue": "closedwon",
  "previousValue": "contractsent",
  "occurredAt": "2026-10-10T17:02:11.000Z",
  "changeSource": "CRM_UI",
  "portalId": "12345678",
  "record": {
    "id": "9201",
    "properties": {
      "dealname": "Acme Corp — Pro plan",
      "amount": "1500",
      "dealstage": "closedwon",
      "pipeline": "default",
      "hubspot_owner_id": "75413921",
      "…": "…"
    },
    "createdAt": "2026-10-01T09:30:00.000Z",
    "updatedAt": "2026-10-10T17:02:11.000Z",
    "archived": false
  }
}

A conversation message and a form submission look like this:

{
  "type": "conversation.newMessage",
  "label": "New incoming conversation message",
  "object": "conversation",
  "direction": "incoming",
  "threadId": "8801",
  "messageId": "a1b2c3d4e5",
  "text": "Hi, I reset my password and still cannot log in.",
  "senderName": "Sam Rivera",
  "senderEmail": "sam.rivera@example.com",
  "contactId": "51",
  "message": { "…": "HubSpot's message" },
  "thread": { "…": "HubSpot's conversation" }
}

{
  "type": "form.submission",
  "label": "Form submitted",
  "object": "form",
  "formId": "5f1b7a2e-3c4d-4e5f-8a9b-0c1d2e3f4a5b",
  "formName": "Contact us",
  "submittedAt": "2026-10-10T17:05:40.000Z",
  "values": { "email": "sam.rivera@example.com", "firstname": "Sam", "message": "I would like a demo." },
  "pageUrl": "https://www.example.com/contact"
}
ℹEach event runs once. HubSpot resends what it couldn't deliver — up to 10 times over 24 hours —; HostWebhook recognises the event and doesn't run the flow again. Events arrive signed with the app's secret, and HostWebhook checks the signature before anything runs. If HubSpot doesn't give the record back, the event still runs, with recordError saying why.

Trying it out

The trigger's Test push shows what each event you picked will look like — examples with the exact shape this trigger dispatches, so you can write {{payload.record.properties.email}} in the nodes below it from the start. To see a real one, create a contact or move a deal in your HubSpot account.


Gotchas

  • Tickets, conversations and forms need their permission. They're optional when connecting; a trigger with those events on an account that didn't grant them refuses to activate and says why.
  • Only static lists can be changed by hand. Lists that fill themselves from filters aren't offered. HubSpot now calls lists Segments: create one in More → CRM → Segments, with the type Static.
  • A 429 is retried once. HubSpot allows 110 requests every 10 seconds per account; a flow that creates many records at once can touch it.
  • Searches find new records after a moment. HubSpot indexes them a few seconds after they're created, so a search right after a create may not see it yet.
  • A contact can bring a company along. If the account has HubSpot's setting to create companies from contact email domains turned on, creating a contact with sam@acme.com also creates (or links) the company acme.com — that's HubSpot, not the flow.
  • Quotes need Revenue Hub Professional or Enterprise. On other accounts HubSpot refuses Create quote, and the line item copies it made are removed.
  • A reply needs someone to send it. If the conversation isn't assigned and Send as is empty, the reply is refused and says so.