> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbitforms.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate from HubSpot

> Bring your HubSpot contacts, companies, deals, pipelines and history into Orbit with the built-in import. No code or spreadsheets needed.

Orbit reads your HubSpot portal directly and brings it over in the background. You can keep working in HubSpot while it runs, and run it again later to pick up anything that changed.

> [!NOTE]
>
> Only owners and admins of your Orbit workspace can start an import. In HubSpot, the person who creates the key in step 2 is easiest as a **super admin**.

## What comes over

| HubSpot | Orbit |
| - | - |
| Contacts (with owner, company, job title, phone, creation date, custom properties) | Contacts, linked to their companies; HubSpot lifecycle stage and lead status as custom fields |
| Companies | Companies, matched by domain |
| Deal pipelines and stages | Pipelines with the same stages; closed stages at 100% become won stages, other closed stages lost |
| Deals (amount, close date, owner, company, contacts) | Deals in the matching stage; won and lost deals keep their close date |
| Custom properties | Custom fields, up to 50 per object |
| Notes, emails, calls, meetings, tasks | The record's timeline, with the original time and author |
| Opted-out and bounced contacts | The unsubscribe list, so nobody is emailed by mistake |

Every record keeps its HubSpot id, so running the import again updates records instead of duplicating them.

Not imported: files attached to HubSpot records, and marketing assets such as email templates, sequences and workflows.

## Steps

**1. Invite your team to Orbit**

Records keep their HubSpot owner when that person is an Orbit member with the same email address. Invite everyone who owns records in HubSpot from **Settings → Members** before you import.

**2. Create a service key in HubSpot**

Orbit reads HubSpot with a **service key**, a read-only key you create for this import.

1. In HubSpot, go to **Development → Keys → Service keys**. In some accounts it is under **Settings → Integrations → Service keys**.
2. Click **Create service key** and name it `Orbit import`.
3. Click **Add new scope**, tick each scope below, and click **Update**.
4. Click **Create** and confirm.

```
crm.objects.contacts.read
crm.objects.companies.read
crm.objects.deals.read
crm.objects.owners.read
crm.schemas.contacts.read
crm.schemas.companies.read
crm.schemas.deals.read
sales-email-read
```

Every scope is read-only: Orbit never changes anything in HubSpot. `sales-email-read` brings the content of logged emails.

> [!NOTE]
>
> Creating a service key needs a HubSpot **super admin**, or a user with **Developer tools access**. A key can only be given scopes its creator already has, so if a scope can't be ticked, ask a super admin to create the key.

> [!TIP]
>
> Already have a HubSpot private app from before? Its access token works too. HubSpot stopped creating new legacy private apps in October 2026, which is why new imports use service keys.

**3. Copy the key**

Open the key you just created, click **Show**, then **Copy**. It starts with `pat-`.

**4. Start the import in Orbit**

In Orbit, go to **Settings → Migrate CRM**, pick **HubSpot**, and click **Start import**. The same import is under **Settings → Integrations → HubSpot**.

Paste the key, then choose:

* **What to import**: contacts, companies, deals and pipelines, and history (notes, emails, calls, meetings and tasks).
* **Do-not-contact list**: contacts who opted out or bounced in HubSpot are unsubscribed in Orbit too.
* **Records already in Orbit**: update them with HubSpot's values, or leave them as they are.

Click **Start import**.

**5. Watch it run**

The import runs in the background, so you can leave the page. Come back to **Settings → Migrate CRM** to see its progress: for each object, how many records were read, created, updated, skipped, and how many had errors. Rows with problems are listed under the table.

## After the import

* **Check your pipelines** under **Settings → Pipelines**. They are created from HubSpot's, with the same stage names.
* **Webhooks and connected apps** don't receive imported records unless that is turned on under **Settings → Integrations → Connected apps**, so the import doesn't flood your automations.
* **The key is deleted from Orbit** when the run completes or is cancelled. You can delete the service key in HubSpot too, and create a new one if you import again later.

## Run it again, resume or cancel

* **Run it again** at any time with **Import again**. Records are matched by their HubSpot id, so changes are updated and nothing is duplicated. Choose **Leave them as they are** to only add records that are new since the last run.
* **Cancel** a running import from its status card. Records already imported stay.
* **Resume** a failed or cancelled run and it picks up from the last page it finished. A failed run keeps the key, so you can resume without pasting it again. A cancelled run has deleted it, so paste the key again.
* One import can run per workspace at a time.

## Troubleshooting

> **"HubSpot rejected this key"**
>
> The key was mistyped, deleted, or rotated in HubSpot. Copy it again from **Development → Keys → Service keys** (click **Show**, then **Copy**) and paste it into the import, or resume the run with it.

> **"HubSpot refused to share … the credential lacks the scope for it"**
>
> The key is missing one of the scopes above. Open the key in HubSpot, click **Add new scope**, add the missing scope and save. Then resume the run in Orbit: it continues where it stopped.

> **I can't find Service keys, or can't tick a scope**
>
> Service keys need a HubSpot super admin, or a user with Developer tools access. A key can only be given scopes its creator has. Ask a super admin to create the key and send it to you.

> **Only some custom properties came over**
>
> Up to 50 custom properties per object become Orbit custom fields. HubSpot's built-in, hidden and calculated properties are left out.

> **Records have no owner**
>
> Owners are matched by email. Invite the missing people to your Orbit workspace, then run the import again with **Update them with HubSpot's values**.

> **"Only workspace admins can import from HubSpot"**
>
> Ask an owner or admin of your Orbit workspace to start the import, or to make you an admin under **Settings → Members**.

## Other ways to move over

* **Spreadsheets**: on **Settings → Migrate CRM**, pick HubSpot and choose **Prefer spreadsheets?** for export steps, sample sheets and uploads.
* **From code**: to transform data on the way, or to bring file attachments across, see [Migrating from HubSpot](https://docs.orbitforms.ai/developers/migrating-from-hubspot.md) in the developer docs.
* **Help from our team**: for a large or unusual portal, [contact support](https://docs.orbitforms.ai/support/contact.md) and we'll help you get it in.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.