# Create HubSpot contacts from qualified leads

URL: https://useembers.com/help/integrations/hubspot/
Category: Integrations
Plan: Solo and above
Updated: 2026-09-12
Last verified: 2026-09-12

> Connect one HubSpot portal with a private-app token and let Embers create or update a contact, with one note, every time a lead qualifies.

Embers can keep HubSpot in step with your LinkedIn pipeline. When a lead qualifies, Embers creates or updates one contact and, the first time it creates that contact, attaches one note explaining why the lead matters.

> **Warning: Solo and above, administrators only**
>
> The Integrations screen requires Solo or above, and only an account administrator can reach it. One HubSpot portal per Embers account.

## Before you start

- Access to a HubSpot portal where you can create a private app.
- The private app needs contact read and write scopes: `crm.objects.contacts.read` and `crm.objects.contacts.write`.
- Nothing else. A private-app token works on its own. The **Connect with HubSpot** OAuth button only appears when the HubSpot app is configured on the Embers API.

## Connect HubSpot

### Create the private app in HubSpot

In your HubSpot portal, create a private app and grant it the two contact scopes above. Copy the access token it gives you. It starts with `pat-`.

### Paste the token into Embers

In the Embers app, go to **Settings**, then **Integrations** (`/settings/integrations`) and find the HubSpot card. Paste the token into **Private app token** and choose **Save token**.

Embers validates the token against HubSpot before storing it, so a bad token fails here rather than silently later. The token is stored encrypted and is never returned by the API or shown again.

### Choose what to send

New leads start on. Everything else is opt-in, using the same toggles as Slack. Live `lead.created`, `lead.engagement.added`, and `lead.status_changed` events write to HubSpot.

### Send a test

Choose **Send test**. The test validates the token and confirms the connection. It uses the `webhook.test` event type, so it does not create a HubSpot contact.

## What Embers writes

One contact, and one note on first create. That is the whole footprint.

| HubSpot property | Where it comes from |
| --- | --- |
| `firstname` and `lastname` | The lead's name, split into two parts |
| `jobtitle` | The lead's title |
| `company` | The lead's company |
| `website` | The lead's LinkedIn profile URL |
| `email` | The stored contact email, when Embers already has one |
| `phone` | The stored contact phone, when Embers already has one |

Empty values are left out rather than written as blanks, so Embers never wipes a field you filled in yourself. Email and phone are never invented: they appear only when Embers already stored them for that person.

The note added on first create carries the score, the ICP verdict, the LinkedIn profile, and a link back into Embers.

`report.generated` events are recorded as delivered without writing anything to HubSpot.

> **Note: No companies, no deals**
>
> Embers does not create or update HubSpot companies, and it does not create deals. Build those with your own HubSpot workflows on top of the contact.

## How duplicates are avoided

Embers keeps its own link between a LinkedIn member and the HubSpot contact it created for them, so repeat events update that same contact.

1. **The stored link first.** If Embers has already created a contact for this LinkedIn member in this account, it updates that contact.
2. **Email second.** If there is no link yet and Embers has an email, it searches HubSpot by email before creating anything.
3. **Otherwise it creates a contact**, and stores the link for next time.

Because the HubSpot contact id is stored on the delivery, a retry updates the same record instead of creating a second one.

## Retries and pauses

HubSpot delivery uses the same schedule as webhooks: the first attempt plus seven retries, from 30 seconds out to roughly 6.3 days. Rate limits and HubSpot server errors are retried.

Authentication failures are terminal and pause the install instead: an invalid or revoked token, a `401`, or a `403`. The card shows **Paused** with the error, and a **Resume** button appears once you have fixed the token. Delivery history is kept for 30 days.

**Disconnect** stops Embers creating or updating contacts and leaves everything already in HubSpot untouched. You can reconnect the same portal later.

## Related

- [HubSpot delivery is paused](/help/troubleshooting/hubspot-delivery-paused/): Fix a revoked token or a rejected request.

- [Integrations overview](/help/integrations/overview/): Every destination, and which plan each one needs.

- [Signed webhooks](/help/integrations/webhooks/): Send the same events to your own endpoint.

## Frequently asked questions

**Does Embers create companies or deals?**

No. Embers creates or updates a contact and attaches one note on first create. Companies and deals are left to you.

**Will a test create a contact in HubSpot?**

No. Tests use the webhook.test event type and only validate the stored token.
