name: hubspot description: >- Query HubSpot CRM for deals, companies, contacts, tickets, owners, and account/deal context.
HubSpot
Use HubSpot for CRM facts: deal status, amount, stage, owner, forecast, associated account context, contacts, companies, and tickets.
hubspot-deals is a legacy-named deal analytics shortcut, not the boundary of
the HubSpot integration. If the user asks for any HubSpot object, endpoint,
association, property, filter, batch read/write, or API version that the typed
actions do not expose, inspect the provider catalog/docs and call
provider-api-request with provider: "hubspot".
Actions
account-deep-dive— first choice for named account/deal deep dives. It searches matching HubSpot deals, loads associated companies, contacts, tickets, notes, and emails, then pairs that CRM context with Gong evidence.hubspot-deals— deals with normalized stage, pipeline, owner, forecast, and NBM fields. For a named customer/deal/account, passquery; do not fetch all deals first. For a deal cohort, use structured filters such asproduct,pipeline,closedStatus,closedDateFrom, andclosedDateTo.hubspot-records— generic HubSpot search/list for contacts, companies, deals, and tickets. Use this to enrich a deep dive with company, contact, or ticket records.hubspot-pipelines/hubspot-metrics— pipeline definitions and aggregate sales metrics.- For HubSpot property metadata (available fields before requesting custom
ones) there is no first-class action — call
provider-api-request(providerhubspot, e.g./crm/v3/properties/deals) viaprovider-api-docs. provider-api-requestwithprovider: "hubspot"— arbitrary HubSpot HTTP API calls when first-class actions are too narrow.
Pipeline Stage Timing — Use Stage-Entry Date Fields
Always use hs_v2_date_entered_{stageId} for deterministic pipeline-stage
timing, not keyword or amount heuristics:
- Each pipeline stage has a unique numeric ID (visible in pipeline definitions).
- The property
hs_v2_date_entered_{stageId}records the exact timestamp when the deal first entered that stage. Use this to filter deals that reached a specific stage within a date window. - Why this matters: heuristic filters (e.g.,
amount > $30K, keyword searches) have been found to diverge from stage-date filters by ~48% — nearly half the deals are different. Stage-entry date fields provide verifiable, auditable results.
To discover stage IDs, call hubspot-pipelines first and read the stageId
fields in the returned pipeline structure.
Example use: to count deals that reached "Qualified Opportunity" stage in Q1:
provider-api-request(
provider: "hubspot",
path: "/crm/v3/objects/deals/search",
method: "POST",
body: {
"filterGroups": [{
"filters": [{
"propertyName": "hs_v2_date_entered_<stageId>",
"operator": "BETWEEN",
"value": "2026-01-01",
"highValue": "2026-03-31"
}]
}],
"properties": ["dealname", "amount", "hs_v2_date_entered_<stageId>"]
}
)
Multi-Dimensional Closed-Lost Analysis
Deals are rarely lost for a single reason. When analyzing closed-lost deals:
- Use a multi-factor matrix with notation: primary factor (★★), contributing factor (★), possible factor (~).
- Track 8-10 common loss factors per deal: Budget, Product Fit, Implementation Friction, Competitive Loss, Security/Compliance, Wrong Persona/Champion, Timeline Mismatch, Support/Success Gaps, etc.
- Identify combination patterns — e.g., "Product Fit + Implementation Friction" may affect multiple deals simultaneously.
- Do not force a single root cause categorization. Real losses are multi-dimensional, and flattening to one reason distorts win/loss patterns.
- Report both the count of deals per single factor AND the top multi-factor combinations.
Patterns
For account or deal deep dives:
- Call
data-source-statusif you are not sure HubSpot is connected. - Call
account-deep-divewithqueryset to the company, domain, deal, or opportunity name. Use its associated companies, contacts, tickets, notes, and emails as the CRM backbone of the answer. - If a specific CRM gap remains, call
hubspot-dealsorhubspot-recordswith bounded filters for that missing object only. - Cite which records you inspected and keep unsupported associations as caveats.
Example:
account-deep-dive(query: "The Knot", days: 180, gongLimit: 10, transcriptLimit: 5)
hubspot-deals(query: "The Knot", limit: 10)
hubspot-records(objectType: "companies", query: "theknot.com", limit: 5)
hubspot-records(objectType: "contacts", query: "theknot.com", limit: 25)
Do not use warehouse copies of HubSpot as a substitute unless the user asks for the warehouse data or the live HubSpot action is unavailable and the user chooses that fallback.
For deal cohorts:
- Translate the cohort definition into structured
hubspot-dealsfilters. Example: "new business deals where products field is Publish, closed won in the last 12 months" meansproduct: "Publish",pipeline: "New Business",closedStatus: "won", and explicit close-date bounds. - Do not use
queryfor property-specific filters.query: "Publish"is a broad HubSpot search across deal text and can include unrelated deals. - Report the cohort count, filters, and date window before synthesizing. If the
count looks too low, inspect deal property metadata
(
/crm/v3/properties/deals) or use stage-entry date fields viaprovider-api-request. - When pairing a cohort with Gong, use returned deal/company/contact evidence to run bounded Gong follow-ups and state Gong coverage separately from the HubSpot cohort size.
If hubspot-deals still cannot express the needed HubSpot query, do not stop
or approximate. Call provider-api-catalog(provider: "hubspot"), fetch the
HubSpot docs/spec with provider-api-docs if needed, then call
provider-api-request(provider: "hubspot", ...) with the exact CRM endpoint,
filters, properties, associations, and pagination body.