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
Value
In the dropdown
What it does
createContact
Create contact
Creates a contact. HubSpot refuses a second contact with the same email — use “Create or update” for that.
updateContact
Update contact
Changes the fields you fill in; empty fields stay as they are.
upsertContact
Create or update contact by email
Updates the contact with this email, or creates it if there is none.
getContact
Get contact
One contact by ID or by email, with its properties.
searchContacts
Search contacts
Finds contacts by text, by a property, or both. Newest first.
deleteContact
Delete contact
Moves the contact to HubSpot's recycling bin (restorable for 90 days).
gdprDeleteContact
Permanently 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
Value
In the dropdown
What it does
createCompany
Create company
Creates a company. HubSpot fills in what it knows from the domain.
updateCompany
Update company
Changes the fields you fill in; empty fields stay as they are.
getCompany
Get company
One company by ID, with its properties.
searchCompanies
Search companies
Finds companies by text, by a property, or both. Newest first.
deleteCompany
Delete company
Moves the company to HubSpot's recycling bin (restorable for 90 days).
Deals
Value
In the dropdown
What it does
createDeal
Create deal
Creates a deal in a pipeline and stage, linked to a contact and a company if you give them.
updateDeal
Update deal
Changes the fields you fill in — moving it to another stage, for one. Empty fields stay as they are.
getDeal
Get deal
One deal by ID, with its properties.
searchDeals
Search deals
Finds deals by text, by a property, or both. Newest first.
deleteDeal
Delete deal
Moves the deal to HubSpot's recycling bin (restorable for 90 days).
Tickets
Value
In the dropdown
What it does
createTicket
Create ticket
Creates a ticket in a pipeline and status, linked to a contact and a company if you give them.
updateTicket
Update ticket
Changes the fields you fill in — its status, for one. Empty fields stay as they are.
getTicket
Get ticket
One ticket by ID, with its properties.
searchTickets
Search tickets
Finds tickets by text, by a property, or both. Newest first.
deleteTicket
Delete ticket
Moves the ticket to HubSpot's recycling bin (restorable for 90 days).
Associations
Value
In the dropdown
What it does
associateRecords
Link two records
Links 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.
removeAssociation
Unlink two records
Removes every association between two records. Neither record is deleted.
listAssociationLabels
List association labels
The association labels the account has between two kinds of record (“Decision maker”, “Billing contact”…), with the ID to use in “Link two records”.
Activity
Value
In the dropdown
What it does
createNote
Create note
Adds a note to the timeline of a contact, company, deal or ticket.
createTask
Create task
Creates a task for someone on your team, linked to a contact, company, deal or ticket.
logCall
Log call
Records a call that already happened on the timeline of a contact, company, deal or ticket — from your phone system, for one.
logMeeting
Log meeting
Records a meeting — held or booked — on the timeline of a contact, company, deal or ticket.
Products & line items
Value
In the dropdown
What it does
createProduct
Create product
Adds a product to the account's product library, ready to put on deals and quotes.
updateProduct
Update product
Changes the fields you fill in; empty fields stay as they are.
getProduct
Get product
One product by ID, with its properties.
searchProducts
Search products
Finds products by text, by a property, or both. Newest first.
deleteProduct
Delete product
Archives the product in the library. Deals and quotes that already have it keep their line items.
addLineItemToDeal
Add line item to deal
Puts a product (or a one-off item) on a deal, with its quantity and price. The deal's amount follows its line items.
listDealLineItems
List deal line items
The products and items on a deal, with quantity, price and amount.
deleteLineItem
Remove line item
Takes a line item off its deal and deletes it. The product stays in the library.
Quotes
Value
In the dropdown
What it does
createQuote
Create quote
Creates 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.
getQuote
Get quote
One quote by ID: status, amount, expiry and its public link.
searchQuotes
Search quotes
Finds quotes by text, by a property, or both. Newest first.
Forms
Value
In the dropdown
What it does
listForms
List forms
The account's forms, with their IDs.
getFormSubmissions
Get form submissions
The latest submissions of a form, newest first, with what each person filled in.
Conversations
Value
In the dropdown
What it does
listThreads
List conversations
Conversations of the inbox, most recent activity first.
getThreadMessages
Get conversation messages
The messages of a conversation, oldest first, with who sent each one.
replyToThread
Reply to conversation
Sends a reply in a conversation, on the channel the customer used (email, chat…), to whoever wrote last.
updateThreadStatus
Close or reopen conversation
Marks a conversation closed, or opens it again.
Lists
Value
In the dropdown
What it does
listLists
List static lists
The static contact lists of the account (the ones you can add contacts to by hand), with their IDs. HubSpot shows lists as Segments.
addToList
Add contact to list
Adds contacts to a static list. Lists that fill themselves from filters can't be changed by hand.
removeFromList
Remove contact from list
Takes contacts out of a static list. The contacts stay in HubSpot.
Owners & pipelines
Value
In the dropdown
What it does
listOwners
List owners
The people in the HubSpot account who can own records, with their owner IDs.
listPipelines
List pipelines and stages
The 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.
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:
⚠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.
Contacts
event
When
Contact created
contact.creation
A new contact was created.
Contact email changed
contact.propertyChange:email
The contact's email changed.
Contact first name changed
contact.propertyChange:firstname
The contact's first name changed.
Contact last name changed
contact.propertyChange:lastname
The contact's last name changed.
Contact phone changed
contact.propertyChange:phone
The contact's phone changed.
Contact lifecycle stage changed
contact.propertyChange:lifecyclestage
The contact's lifecycle stage changed.
Contact lead status changed
contact.propertyChange:hs_lead_status
The contact's lead status changed.
Contact owner changed
contact.propertyChange:hubspot_owner_id
The contact's owner changed.
Contact associations changed
contact.associationChange
The contact was linked to or unlinked from another record.
Contacts merged
contact.merge
Two contacts were merged into one.
Contact deleted
contact.deletion
A contact was deleted.
Contact restored
contact.restore
A deleted contact was restored.
Companies
event
When
Company created
company.creation
A new company was created.
Company name changed
company.propertyChange:name
The company's name changed.
Company domain changed
company.propertyChange:domain
The company's domain changed.
Company lifecycle stage changed
company.propertyChange:lifecyclestage
The company's lifecycle stage changed.
Company owner changed
company.propertyChange:hubspot_owner_id
The company's owner changed.
Company associations changed
company.associationChange
The company was linked to or unlinked from another record.
Companies merged
company.merge
Two companies were merged into one.
Company deleted
company.deletion
A company was deleted.
Company restored
company.restore
A deleted company was restored.
Deals
event
When
Deal created
deal.creation
A new deal was created.
Deal deal name changed
deal.propertyChange:dealname
The deal's deal name changed.
Deal stage changed
deal.propertyChange:dealstage
The deal's stage changed.
Deal pipeline changed
deal.propertyChange:pipeline
The deal's pipeline changed.
Deal amount changed
deal.propertyChange:amount
The deal's amount changed.
Deal close date changed
deal.propertyChange:closedate
The deal's close date changed.
Deal owner changed
deal.propertyChange:hubspot_owner_id
The deal's owner changed.
Deal associations changed
deal.associationChange
The deal was linked to or unlinked from another record.
Deals merged
deal.merge
Two deals were merged into one.
Deal deleted
deal.deletion
A deal was deleted.
Deal restored
deal.restore
A deleted deal was restored.
Tickets
event
When
Ticket created
ticket.creation
A new ticket was created.
Ticket subject changed
ticket.propertyChange:subject
The ticket's subject changed.
Ticket pipeline changed
ticket.propertyChange:hs_pipeline
The ticket's pipeline changed.
Ticket status changed
ticket.propertyChange:hs_pipeline_stage
The ticket's status changed.
Ticket priority changed
ticket.propertyChange:hs_ticket_priority
The ticket's priority changed.
Ticket owner changed
ticket.propertyChange:hubspot_owner_id
The ticket's owner changed.
Ticket associations changed
ticket.associationChange
The ticket was linked to or unlinked from another record.
Tickets merged
ticket.merge
Two tickets were merged into one.
Ticket deleted
ticket.deletion
A ticket was deleted.
Ticket restored
ticket.restore
A deleted ticket was restored.
Conversations
event
When
New incoming conversation message
conversation.newMessage:incoming
A customer wrote in a conversation of the inbox (email, chat…).
New outgoing conversation message
conversation.newMessage:outgoing
Someone on your team (or a bot) replied in a conversation.
Forms
event
When
Form submitted
form.submission
Someone 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).
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.