HubSpot

Ingests HubSpot CRM contacts, companies, deals, meetings, notes, tasks, emails, and the associations between them. Each CRM object becomes a node and association becomes an edge.

variant=info text="CRM / business apps" variant=success text="OAuth" variant=success text="Maps owners"

What gets ingested

Element Mapped to
Contact _Contact
Company _Company
Deal _Deal
Meeting _Meeting
Task _Task
Note _Note
Email engagement _EmailEvent
File / attachment _FileEntry + _Blob
CRM associations (Contact-Company, Deal-Contact, …) Edges between the above
flowchart LR Contact[_Contact] Company[_Company] Deal[_Deal] Meeting[_Meeting] Note[_Note] Owner[_Contact 'Owner'] Contact -- WorksAt --> Company Deal -- AssociatedWith --> Contact Deal -- ForCompany --> Company Meeting -- About --> Deal Note -- Attached --> Deal Owner -- Owns --> Deal

Authentication

  • Type: OAuth 2.0 against HubSpot. The connector stores access_token + refresh_token; refresh is automatic.
  • Scopes are checked per object type, not all-or-nothing: the connector reads the token's granted scopes and skips object types it isn't authorized for instead of failing the whole run.
Ingested element Required HubSpot scope
Contacts crm.objects.contacts.read
Companies crm.objects.companies.read
Deals / deal pipelines crm.objects.deals.read
Meetings, notes, tasks crm.objects.contacts.read
Email engagements sales-email-read
Files / folders files

Access control mapping

Source Carried into the graph?
HubSpot user (OwnerUID) Yes — each record's owner is a _Contact node; the workspace creates a user access group around the connecting hub.
Per-record HubSpot ACLs Workspaces with Sync scope disabled get a broader read; pinning down per-team permissions is a future-work item.

Sync cadence

  • Default cron: every 15 minutes.
  • Incremental sync: LatestFetchedUpdates watermark per object type. Associations are cached in memory during the run for efficient batch linking.

Notable

  • The connector lives in two source files — HubSpotTask.cs (orchestration) and HubSpotTask.Ingestion.cs (per-object emit) — kept separate because the ingestion file is large and updated more often.
© 2026 Curiosity. All rights reserved.