# Create HubSpot contacts from qualified leads

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

> Connect one HubSpot portal with a private-app token so Embers creates or updates a contact, with one note on the signal, whenever 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 it attaches one note on why the lead matters.

> **Warning: Solo and above, administrators only**
>
> Integrations require Solo or above, and only a workspace admin can connect HubSpot or change what it receives; other members see "Administrator access required". One HubSpot portal per Embers workspace.

## Before you start

- Access to a HubSpot portal where you can create a private app.
- The private app needs the contact read and write scopes: `crm.objects.contacts.read` and `crm.objects.contacts.write`. Nothing else.
- A **Connect with HubSpot** button, for OAuth instead of a token, appears only when Embers has it configured. A private-app token always works.

## Connect HubSpot

### Create a HubSpot private app

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-`.

### Save the token in Embers

Open **Integrations** in the sidebar (`/integrations`) and choose **HubSpot** (`/integrations/hubspot`). On the **Setup** card, paste the token under **Private app token** and choose **Save token**.

Embers validates the token against HubSpot before storing it, so a bad token fails here rather than later. It is stored encrypted and never shown again.

Once connected, the page opens on one sentence, "Sending leads to HubSpot", over a line of facts: the last send, the portal, "private app" or "connected with OAuth", and which events go. **Needs attention** (only when something needs fixing), the **Activity** card, and the setup cards follow; the **Connection** card names the portal and how it is connected.

### Choose what to send

The **What to send** card has two switches:

- **New leads** (on): a lead qualified, so Embers creates or updates the contact.
- **Everything else** (off): a known lead engaged again, changed pipeline status, or had a [company change](/help/leads/company-changes/) such as a new role, which updates the same contact. Report-ready events are included in that switch but write nothing to HubSpot.

### Send a test

Choose **Send test** beside the status at the top of the page (in the **...** menu on a phone). It validates the token and confirms the connection, and it never creates a HubSpot contact: the **Activity** card lists it as **Connection test**, **Passed**. If it fails, **Needs attention** shows "The last test failed" with the reason and **Send test** to try again.

## Send the leads you already have

HubSpot gets a lead when it first qualifies, and a lead qualifies once. So the leads Embers found before you connected HubSpot never reach it on their own, and right after connecting the **Activity** card shows nothing but your test.

While there are such leads, the page shows **Send the 185 leads you already have** (with your own count) above the **Activity** card. Choose **Send existing leads**, then confirm. Embers sends them once, best score first:

- Only leads that match your ICP (or that you approved by hand) are counted, and every one of them is sent, however many there are.
- Your **Who gets delivered** rules apply. A lead they hold back is passed over without a **Held back** row.
- Anyone already in HubSpot through Embers is skipped, so running it again only sends what is missing.
- Each lead is created or updated exactly like a new one, note included, and shows on the **Activity** card as it lands.

While it runs, the card reads "Sending your existing leads to HubSpot" with how many are queued. When it finishes, the card goes away; **Send existing leads** stays in the **...** menu beside the status if you want to run it again later. If it stops part way, the card offers **Try again**, and new leads keep flowing either way. Pausing or turning off delivery stops a run.

## What Embers writes

One contact, and one note when Embers creates it. That is the whole footprint.

| HubSpot property | Where it comes from |
| --- | --- |
| `firstname` and `lastname` | The lead's name, split into two |
| `jobtitle` | The lead's title |
| `company` | The lead's company |
| `website` | The lead's LinkedIn profile URL |
| `country` | The country their LinkedIn location names (HubSpot's Country/Region), when it names one |
| `email` | The stored email, when Embers already has one |
| `phone` | The stored 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, and they are only sent on a paid plan: [contact details](/help/outreach/lead-enrichment-and-contact-info/) are not part of the [free trial](/help/account-and-billing/free-trial/).

The note carries the score, the ICP verdict, up to three signals, the reason for the match, the LinkedIn profile, their company's size, industry, LinkedIn page and website when Embers knows them, and a link to the lead in Embers. It is added only when Embers creates the contact, not when it updates one.

> **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.

## Who gets delivered

The **Who gets delivered** card holds HubSpot's own [delivery rules](/help/integrations/delivery-rules/): a minimum lead score, ICP matches only, the sources that count, and titles and industries to exclude. Choose **Save rules** after changing them, or **Reset** to drop your edits. Many accounts set a higher minimum score here than on [Slack](/help/integrations/slack/).

A lead the rules hold back writes nothing to HubSpot and is not retried on its own. It is listed on the **Activity** card as **Held back**, with the reason; choose **Send anyway** on that row to send it. A manual push with [Send to](/help/leads/send-to-destination/) skips a lead Embers already synced, as `already synced to HubSpot contact`, unless you tick **ignore rules**, which updates that contact.

## How duplicates are avoided

Embers remembers which HubSpot contact it created for each LinkedIn member in your workspace, so repeat events update that contact.

1. **A contact Embers created before**: Embers updates it.
2. **No contact yet, but an email**: Embers searches HubSpot by email and updates the match.
3. **Neither**: Embers creates a contact and remembers it. A retry updates that same record rather than creating a second one.

Without an email, Embers cannot find a contact you created by hand in HubSpot, so the same person can end up with two records. Merge them in HubSpot; Embers keeps updating the one it created.

## Activity, retries, and pauses

The **Activity** card lists the last 30 days of deliveries, newest first: the lead, with a link to the contact in HubSpot once one exists (a test reads **Connection test**, **Passed**), the status (**Delivered**, **Failed**, **Held back**, **Blocked**, **Queued** (not sent yet), or **Retrying** (an attempt failed and it goes again)), the reason, and when. Filter by **All**, **Failed**, or **Held back**. **Retry** re-sends a failed or blocked row, and **Send anyway** a held-back one, while delivery is on and not paused. The newest three failures also sit under **Needs attention** with **Retry**.

HubSpot rate limits and outages are retried: the first attempt plus seven retries, from 30 seconds out to about 6.3 days.

A contact HubSpot refuses for its own values fails on its own and is not retried: a `400` `VALIDATION_ERROR`, such as an invalid email or a value a portal rule rejects, a `409` `CONFLICT`, or a lead with no properties to write. Embers keeps sending every other lead. If five leads in a row are refused like that with none synced in between, the install pauses, because a rule is turning every lead away.

Other failures pause the install at once: a rejected token (`401` or `403`), any other request HubSpot refuses outright, and retries that run out. The status then reads "Delivery to HubSpot is paused", and **Needs attention** shows the reason with **Resume**. [HubSpot delivery is paused](/help/troubleshooting/hubspot-delivery-paused/) walks through each one.

If delivery is turned off, the status reads "Delivery to HubSpot is turned off" and **Needs attention** offers **Turn on**; the portal and what to send stay saved.

**Disconnect HubSpot**, in the **...** menu beside the status, asks you to confirm, then stops Embers creating or updating contacts and leaves everything already in HubSpot untouched. You can reconnect the same portal later.

## Troubleshooting

**Saving the token fails.** The token is wrong or lacks a contact scope. Check both scopes on the private app, copy the token again, and save.

**Needs attention shows a pause with INVALID_AUTHENTICATION.** HubSpot rejected the token, usually because the private app was deleted or its token rotated. The connected page has no token field, so choose **Disconnect HubSpot** in the **...** menu, then save a new token on the **Setup** card. Saving clears the pause and keeps your switches and rules.

**Needs attention shows "HubSpot paused after 5 contacts in a row were rejected."** HubSpot refused five leads in a row for their values, usually because of a portal validation rule or a changed property type. Fix it in HubSpot, then choose **Resume**.

**Needs attention shows "HubSpot paused after receiving HTTP" and a status.** HubSpot refused the request for a reason other than one contact's values, such as a contact it could no longer find. Fix the cause in HubSpot, then choose **Resume**.

**The status reads "Not sending: nothing is selected to send".** Both switches on **What to send** are off. Turn on **New leads**.

**I connected HubSpot but no contacts appeared.** Only leads that qualify after you connect are sent on their own. Choose **Send existing leads** on the HubSpot page to send the ones you already have.

**Contacts arrive without an email.** Embers had not revealed one for that lead, or the workspace is on the trial. Emails are copied, never looked up for HubSpot.

## Related

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

- [Control which leads reach each destination](/help/integrations/delivery-rules/): Decide which leads are worth a CRM record.

- [Reveal a lead's email and phone](/help/outreach/lead-enrichment-and-contact-info/): Where email and phone come from.

## Frequently asked questions

**Does Embers create companies or deals?**

No. Embers creates or updates a contact and attaches one note when it creates the contact. Companies and deals are left to your own HubSpot workflows.

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

No. A test only validates the stored token and confirms the connection. It shows on the Activity card as Connection test, Passed.

**Does connecting HubSpot send the leads I already have?**

Not on its own. HubSpot gets a lead when it first qualifies, so leads found before you connected only get there when you choose Send existing leads on the HubSpot page.

**Can I connect two HubSpot portals?**

No. One HubSpot portal per Embers workspace. An agency connects each client workspace to that client's portal separately.
