HubSpot integration: what HeyLead syncs, from the code
Last updated 28 September 2026
HeyLead (heylead.dev) syncs LinkedIn outreach to HubSpot: contacts matched on the LinkedIn id, deals at closed-won or qualified-to-buy with the amount, the conversation as a note, and a pull that reads closed-won deals back as revenue. HubSpot is the only CRM it syncs with. Every line below is what crm_sync does today.
What a push sends
| HubSpot object | What HeyLead writes |
|---|---|
| Contact | First and last name, email when the record has one, job title, company, and the LinkedIn profile URL in the LinkedIn id field. An existing contact with the same LinkedIn id is updated, not duplicated. |
| Deal | One deal named after the person and the campaign, at the closed won stage with the amount when a won deal has a value, or at qualified to buy for a hot lead. Associated with the contact. |
| Note | The conversation so far, attached to the contact, timestamped at the sync. |
Which people go: filter='won' (the default) sends won deals; 'hot_leads' sends people whose replies read as interest; 'all' sends both. HeyLead records each contact and deal it sent, so a second push adds nothing twice.
What a pull reads
crm_sync(action='pull') reads the deals of the contacts you pushed and looks for HubSpot's own closed-won flag on any pipeline. A closed-won deal marks the person won in HeyLead and records the amount and currency, so the revenue you close in HubSpot shows in HeyLead's analytics without retyping.
What it needs
- In HubSpot: Settings, Integrations, Private Apps. Create a private app with the CRM scopes for contacts, deals and notes, and copy the access token.
- In your AI client, once:
crm_sync(hubspot_api_key='your-private-app-token')The token is saved for the next calls. Then crm_sync() pushes, crm_sync(campaign_id='...') pushes one campaign, and crm_sync(action='pull') reads deals back.
The sync runs from the local client with the full tool set, HEYLEAD_TOOLS=all (47 tools; the default profile registers 22). See the tool reference.
What it never does
- It does not read your HubSpot contacts to find people to write to. Prospects come from LinkedIn search on your seat and from your ICP.
- It does not sync every prospect. Nothing reaches HubSpot until a person is won or replies with interest, and only when you run the sync.
- It does not sync with any other CRM. HubSpot is the only one; meetings book on Google Calendar only.
Questions people ask
Does HeyLead integrate with HubSpot?
Yes, and HubSpot is the only CRM it syncs with. crm_sync(action='push') creates or updates a contact matched on the LinkedIn id, creates a deal at closed-won or qualified-to-buy with the amount when known, and adds the conversation as a note. crm_sync(action='pull') reads closed-won deals back and records the revenue. It runs from the local client with HEYLEAD_TOOLS=all.
What does HeyLead need to connect HubSpot?
A HubSpot private-app access token with the CRM scopes for contacts, deals and notes. Pass it once as crm_sync(hubspot_api_key='...') and it is saved for the next calls. No OAuth app, no marketplace listing.
Does HeyLead send every prospect to HubSpot?
No. The default push is won deals only; 'hot_leads' pushes people who replied with interest, and 'all' pushes both. Each contact and deal is recorded after it is sent, so a second push adds nothing twice.
Does HeyLead sync with Salesforce or Pipedrive?
No. HubSpot is the only CRM sync. For another CRM, export from the dashboard or read the campaign with the analytics and contacts tools from your AI client.