Curiosity

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.

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.