Skip to content
Integrations

HubSpot Connector

Armbrain's HubSpot connector is a read-only, per-client mind CRM ingest. Connect it from an active client or prospect mind with:

connectors action=connect source_type=hubspot

The tool returns an Armbrain-generated HubSpot OAuth URL. Do not send customers into HubSpot's App Marketplace Claude integration or HubSpot's direct Claude connector; that is a different product path and does not connect Armbrain's auto-ingest pipeline.

After OAuth succeeds, discovery runs on the normal connector poll cadence, defaulting to 15 minutes. The first sync starts a historical backfill, defaulting to two years of HubSpot CRM history, before settling into incremental updates.

Beta Customer Setup Script

Use this copy when walking a beta customer through setup:

1. In Armbrain, switch to the client/prospect mind that should receive HubSpot data.
   Example: switch to CLIENT

2. Ask Armbrain to create the HubSpot OAuth link:
   connectors action=connect source_type=hubspot

3. Open the returned auth_url in your browser and approve Armbrain's read-only HubSpot app.

4. Return to Armbrain and check:
   connectors action=status

Expected result: the connector moves from pending_setup to active, syncing, or backfilling. Backfill can take time on large portals; normal incremental polling runs about every 15 minutes.

Do not ask the customer for a HubSpot private app token, personal access key, developer API key, service key, client secret, or direct Claude connector install. The v1 connector is OAuth-only and read-only.

OAuth Scopes

The connector requests read scopes for the v1 CRM ingest:

HubSpot's current notes, calls, meetings, and tasks APIs authorize read access

through the already-required crm.objects.contacts.read scope. Armbrain does

not send a separate optional_scope parameter for those activity types. If a

portal still rejects one activity endpoint, that type is skipped and recorded

in connectors action=status under hubspot_diagnostics.optional_skipped

instead of failing the core CRM connector.

It does not request sales email scopes and does not write back to HubSpot.

The HubSpot user approving OAuth must be allowed to install apps and grant the CRM read scopes above. If app installation is restricted, a HubSpot admin needs to approve the Armbrain app.

What Gets Ingested

The initial backfill reads:

After backfill completes, each incremental sync reads:

If full-property hydration fails for an account, the connector falls back to the required search properties and records the error in connector logs.

Activity and Note Ingestion (v2)

Once the historical CRM backfill has finished, each incremental sync also reads recent HubSpot notes, calls, meetings, and tasks (engagement objects), each associated back to their deals, contacts, and companies:

If a HubSpot API call for notes, calls, meetings, or tasks fails, that object type is skipped for the poll; it does not block contacts/companies/deals sync. See hubspot_diagnostics.optional_skipped in connectors action=status.

Scheduled Marketing Synthesis

Per-record HubSpot ingest still runs on the normal connector poll cadence, defaulting to every 15 minutes. Strategic HubSpot synthesis runs slower so memory search is not spammed:

Scheduled synthesis reads from the normalized HubSpot reporting store (hubspot_crm_objects and associations), scoped to the current connector. Weekly/monthly cadence controls refresh timing; the memory text is explicitly labeled as all synced HubSpot CRM history through the refresh date. It recomputes:

Backfill progress is reported by connectors action=status in the hubspot_backfill object:

The same status response also includes hubspot_diagnostics for each HubSpot connector:

If OAuth approval returns to Armbrain but the token exchange fails, the connector remains pending_setup and status surfaces last_error plus hubspot_diagnostics.setup_error instead of silently showing no error detail.

Troubleshooting Setup

If the customer sees:

This account is not eligible to connect to Claude

they are in HubSpot's direct Claude integration flow, not the Armbrain HubSpot connector flow. Send them back to Armbrain and have them open the auth_url returned by connectors action=connect source_type=hubspot.

connectors action=connect source_type=hubspot and connectors action=status include setup_help with the correct flow, permission requirements, and the exact wrong-flow error text for support handoffs.

Memory Mapping

HubSpot records are not sent through generic text extraction. They are mapped directly to readable memories:

HubSpot signalMemory typeSensitivity
Closed-won dealcampaign_outcomesensitive
Closed-lost deal with loss reasonobjection or pain_pointsensitive
Late-stage open dealbuying_signalsensitive
Contactstakeholderopen
Companyfactopen
Aggregate channel mixfactsensitive
Aggregate geography / lead leaks / loss themesfactsensitive
Strategy synthesisfactsensitive
Note/call/meeting/task mentioning a concern, competitor, or hesitationobjectionsensitive
Note/call/meeting/task mentioning budget/timeline/resourcing frictionpain_pointsensitive
Note/call/meeting/task mentioning sign-off, next steps, or renewalbuying_signalsensitive
Other meaningful note/call/meeting/task contentfactsensitive

Memory text uses resolved labels for stages, lifecycle stages, lead statuses, source values, and owners. Raw HubSpot enum IDs should not appear in memory content.

Filtering

The provider drops internal/test contacts before queueing memories when either condition matches:

Simple property filters can be stored in connectors.config.hubspot_property_filters or connectors.config.hubspot_filters, either as a flat property map or scoped by object type:

{
  "hubspot_property_filters": {
    "deals": { "pipeline": "default" },
    "contacts": { "hs_lead_status": ["NEW", "OPEN"] }
  }
}

CRM Report Date Basis

memory defaults revenue-style reports to HubSpot closedate, which matches normal closed-won revenue reporting. The response includes the selected basis in period.date_basis, period.date_basis_label, and period.hubspot_property; detailed deal rows include both close_date and report_date.

Use date_basis=hs_lastmodifieddate when validating deals that were edited recently but may have been backdated into an earlier close-date period. Supported values are:

CRM Report Trust Metadata

Every memory response includes a trust block before revenue/source conclusions. It records the synced HubSpot reporting store as the data source, whether live fallback was used, portal IDs, connector IDs, client mind/customer IDs, last successful sync, report range, date basis, configured filters, record counts, freshness status, and backfill completeness.

If HubSpot sync is stale or historical backfill is still running, the first entries in audit.caveats say so before the report conclusions. Use those warnings when answering whether the report reflects the latest HubSpot activity.

Disconnect

connectors action=disconnect connector_id=<id> revokes the stored HubSpot token best-effort, clears encrypted credentials, marks the connector inactive, and stops future polling. Existing memories are preserved.