Skip to main content

Overview

The HubSpot tools integrate with the HubSpot CRM API to manage contacts and read deals from your workflows. The contact tools key on the email address, so you can reconcile records without going through the Search API and its rate limit. The deal tools fetch a deal by ID or search deals by name, stage, owner, close or creation date, or any other property. The company and owner tools resolve the IDs a deal carries (its associated company, its hubspot_owner_id) into names, domains, and email addresses, and the note and task tools attach engagements to a deal without modifying the deal itself.

Key Features

  • HUBSPOT_UPSERT_CONTACT
    • Create a contact, or update the existing one with the same email address. Supports custom properties.
  • HUBSPOT_GET_CONTACT
    • Fetch a contact by object ID or by email address. Returns found: false instead of failing when no contact matches.
  • HUBSPOT_GET_DEAL
    • Fetch a deal by object ID, optionally with associated contact and company IDs. Returns found: false instead of failing when no deal matches.
  • HUBSPOT_SEARCH_DEALS
    • Search deals by name, stage, pipeline, owner, or close / creation date range, with free-text and custom property filters. Paged.
  • HUBSPOT_GET_COMPANY
    • Fetch a company by object ID, optionally with associated contact and deal IDs. Returns found: false instead of failing when no company matches.
  • HUBSPOT_GET_OWNER
    • Fetch an owner by owner ID or by email address, returning their name, email, and user ID. Returns found: false instead of failing when no owner matches.
  • HUBSPOT_LIST_OWNERS
    • List the owners in the account, optionally filtered by email or limited to archived owners. Paged.
  • HUBSPOT_CREATE_NOTE
    • Create a note and attach it to a deal, contact, or company, with an optional timestamp and author.
  • HUBSPOT_CREATE_TASK
    • Create a task with a due date, status, priority, and assignee, and attach it to a deal, contact, or company.

Authentication

For setup instructions, see the HubSpot credentials page.

Example: Look Up a Contact, Then Create or Update It

Example: List Deals Closing This Month for One Owner

Example: Resolve a New Deal’s Owner and Company

Example: Log a Meeting Summary and a Follow-up Task on a Deal

Inputs

HUBSPOT_UPSERT_CONTACT

A named input left blank is skipped, not sent — HubSpot reads an empty string as “clear this property”, so clearing has to be asked for explicitly through properties ({"firstname": null}). Named inputs win over the same key inside properties. Setting properties.email to something other than the email input is rejected. A difference in letter case alone is treated as the same address. Returns result.id, result.created, result.properties, and the raw result.contact.

HUBSPOT_GET_CONTACT

Returns result.found, result.id, result.properties, result.associations, and the raw result.contact.

HUBSPOT_GET_DEAL

Returns result.found, result.id, result.properties, result.associations, and the raw result.deal.

HUBSPOT_SEARCH_DEALS

All inputs are optional. Named filters are combined with AND. Returns result.deals (each with id and properties), result.count, result.total, and result.next_after (null on the last page).

HUBSPOT_GET_COMPANY

Returns result.found, result.id, result.properties, result.associations, and the raw result.company.

HUBSPOT_GET_OWNER

Returns result.found, result.id, result.email, result.first_name, result.last_name, result.user_id, result.archived, and the raw result.owner.

HUBSPOT_LIST_OWNERS

All inputs are optional. Returns result.owners (each with id, email, first_name, last_name, user_id, and archived), result.count, and result.next_after (null on the last page).

HUBSPOT_CREATE_NOTE

Returns result.id, result.properties, and the raw result.note.

HUBSPOT_CREATE_TASK

Returns result.id, result.properties, and the raw result.task.

Notes

  • Not found is not an error: HUBSPOT_GET_CONTACT, HUBSPOT_GET_DEAL, HUBSPOT_GET_COMPANY, and HUBSPOT_GET_OWNER return result.found = false on a missing record, so “look up, and create it if missing” can be an ordinary condition step.
  • Notes and tasks do not edit the deal: engagements are separate records associated with the deal, contact, or company you pass. None of the deal’s own fields are written; HubSpot only refreshes its activity-derived properties (such as last activity date), which any workflow keyed on those will see. The Engagements API documents crm.objects.contacts.write for creating them, not crm.objects.deals.write.
  • Engagement timestamps: timestamp and due_date accept ISO 8601 or epoch milliseconds. A date without a time is read as midnight UTC, so pass an explicit time with an offset (2026-10-08T09:00:00+09:00) when the hour matters.
  • Creates are not retried by the tool: the HTTP call behind a note or task create is never repeated by the tool itself, whatever the failure, because a repeat could create the record twice. A step-level retry you configure still re-runs the step after a definitive rejection such as a 429, but the step opts out of it when the failure is ambiguous (the request timed out inside the tool, the connection dropped, or HubSpot answered 5xx). One gap remains: a step-level timeout that fires mid-request is raised by the runner, not the tool, so it is retried like any other error — keep retry off such steps, or set the step timeout well above the tool’s own 30 seconds. Check HubSpot for the record before re-running the step.
  • Owner IDs vs user IDs: hubspot_owner_id is not the user ID shown under Settings → Users. Use HUBSPOT_GET_OWNER to turn an owner ID into a name and email address, or HUBSPOT_LIST_OWNERS to find the owner ID for a given person.
  • Search limits: HubSpot allows at most 6 filters per search (named fields and filters entries combined), returns at most 200 deals per page and 10,000 per query, and rate-limits the Search API separately at 5 requests per second per account. The search index can lag a few seconds behind writes, so a deal created moments earlier may not appear yet.
  • Date properties: closedate and createdate are date-times in HubSpot. The range inputs are converted to epoch milliseconds for you; values in filters are sent as-is, so prefer epoch milliseconds there.
  • Incremental pickup: create_date_from is inclusive (>=). If you pass the createdate of the newest deal from the previous run, that deal is returned again, so de-duplicate by id downstream.
  • Concurrent writes are last-write-wins: HubSpot’s CRM API has no optimistic locking, so overlapping updates resolve per property. Do not use HUBSPOT_UPSERT_CONTACT for read-modify-write accumulation (reading a score, adding to it, writing it back) across runs that may overlap — use a HubSpot calculated property instead.
  • Archived contacts: a contact in HubSpot’s recycle bin still reserves its email address, so an upsert against it cannot succeed. Restore it from the recycle bin, or use a different address.
  • Timeouts: every request has a 30-second timeout, with automatic retries on rate limits and transient server errors (except note and task creates — see above).