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

# Orbit

> Keep contacts and companies in two-way sync with Orbit, bring in form submissions, meetings and deals, and use Orbit as a trigger and a step in your workflows.

## What Orbit adds to Halo

| Feature | What it does |
| - | - |
| **Two-way sync** | Contacts and companies stay in step between Halo and Orbit. You map fields on both sides, choose which way each one flows, and choose who wins when both sides changed. |
| **Forms and meetings** | Form submissions and booked meetings become contacts, timeline entries and lead alerts, in real time. |
| **Workflow triggers** | Orbit events start Halo workflows and series: a form submitted, a lead qualified by Orbit's AI, a meeting booked, a deal won, a tag added, and more. |
| **Orbit workflow step** | A Halo workflow can update the Orbit contact, tag them, create a deal, task or note, enroll them in an Orbit sequence, or run an Orbit workflow. |
| **Halo in Orbit workflows** | An Orbit workflow can start a Halo workflow, update a Halo contact, send Halo an event or add a note as one of its steps. |
| **Agent actions** | Your AI agents can share scheduling links, check availability and book meetings in the chat ([scheduling](https://docs.haloagents.ai/agents/scheduling.md)). |

Connect Orbit at **Settings > Integrations > Orbit**.

## Connecting

Click **Connect with OrbitForms** and approve the consent screen in Orbit. Halo connects to the Orbit workspace you choose, and the Orbit card on your Orbit Integrations page then shows **Installed**.

Halo asks for these permissions:

| Scope | Used for |
| - | - |
| `forms:read`, `submissions:read` | Forms in the sales agent's picker; submissions as contacts |
| `contacts:read`, `contacts:write` | The two-way sync, tag triggers, and the Orbit workflow step |
| `companies:read`, `companies:write` | The two-way sync of companies |
| `crm:read` | Your workspace's fields (the Orbit side of the mapping table) and pipelines |
| `deals:read`, `deals:write` | Deal triggers; creating deals from a workflow |
| `tasks:read`, `tasks:write`, `notes:write` | Creating tasks and notes from a workflow |
| `sequences:read`, `sequences:write` | Enrolling contacts in an Orbit sequence from a workflow |
| `workflows:read`, `workflows:write` | Running an Orbit workflow from a Halo workflow |
| `scheduling:read`, `meetings:read`, `meetings:write` | Scheduling links, availability and booking in the chat |
| `webhooks:read`, `webhooks:write` | The real-time subscription that delivers Orbit's events |
| `team:read` | Your workspace's id, which tells Halo's own changes apart |

> [!NOTE]
>
> Connected before the two-way sync existed? Reconnect once. The integration page lists any permission the connection is still missing, with a **Reconnect** button.

After you approve, Halo subscribes to the events your permissions allow and imports the last submissions and meetings quietly: contacts and timeline entries are created, but no alerts, series or workflows fire for old activity.

## Two-way sync

Turn it on under **Two-way sync** on the integration page. A change on either side shows up on the other within about a minute.

### The mapping table

Each object, **Contacts** and **Companies**, has its own table. A row has four parts:

| Column | What it means |
| - | - |
| **Halo field** | A built-in field (name, phone, a contact's company) or any custom field from **Settings > Data** |
| **Direction** | **Both ways**, **Orbit → Halo** (Orbit is the source) or **Halo → Orbit** (Halo is the source) |
| **Orbit field** | A built-in Orbit field or any custom field in your Orbit workspace, read live from your workspace |
| **When both change** | For rows that flow both ways: **Orbit wins**, **Halo wins** or **Latest change wins**. **Default** follows the workspace default above the table |

New setups start with name ⇄ full name, phone ⇄ phone and the contact's company ⇄ the Orbit company, plus name, domain, industry and employee count for companies. Add or remove rows as you need.

Fields that one side computes (Halo's health score, MRR, renewal date; Orbit's call count, last call, do-not-call) can only flow out of that side. Mapping Halo's health score to an Orbit custom field is a good way to show account health to your sales team in Orbit.

### How a change syncs

Halo keeps, for every linked record and field, the value last synced on each side and when each side last changed it. When a record changes:

* **Only one side changed:** its value goes to the other side (unless the row flows the other way).
* **Both sides changed:** the row's rule decides. **Latest change wins** compares when each side's change happened, field by field.
* **A one-way row** overwrites its target whenever the source changes. Edits on the target side stay until the source next changes.

Values are compared the way each side stores them, so a phone saved as `(415) 555-0100` in Halo and `+14155550100` in Orbit, or a number stored as text on one side, is not treated as a change.

### Matching and creating records

* **Contacts** are matched by email, **companies** by domain. Once matched, they stay linked by id, so later email or domain changes don't break the link. Halo also records its id on the Orbit record.
* **Create in Halo:** Orbit records with no match in Halo are added (contacts as leads with source `orbitforms`).
* **Create in Orbit:** Halo records with no match in Orbit are added. For contacts, choose leads only, product users only, or every contact with an email. Anonymous visitors are never sent.

### The first sync

Turning the sync on runs a full sync in the background. Halo reads every Orbit record and links it, imports unmatched Halo records into Orbit in bulk, then links those too. When both sides already hold different values for a field, the **First sync** setting decides which to keep. Empty fields are always filled from the side that has a value, and a first sync never empties a field.

Adding rows to a running sync runs a full sync again, so existing records pick up the new fields. **Run full sync** does the same on demand.

### Deletes, loops and missed events

* Deleting a record in **Orbit** stops the sync from writing to it (it is not deleted in Halo). Restoring it in Orbit resumes the sync.
* Deleting a record in **Halo** stops it syncing (it is not deleted in Orbit).
* Halo ignores the change events its own writes cause, so the two systems never overwrite each other in a loop.
* Every 15 minutes Halo reads Orbit's changes feed to catch anything a webhook missed.

The integration page shows linked records, Halo changes waiting to be sent, the last activity, and any row that couldn't sync with the reason (for example, an Orbit dropdown that doesn't have the value Halo sent).

### Limits

Orbit allows connected apps 300 writes a minute per workspace and caps single contact creates per hour. Halo waits when Orbit asks it to, so a large backlog of new contacts reaches Orbit over a few hours rather than failing. The first sync uses Orbit's bulk import, which isn't affected.

## Forms and meetings

* Each **form submission** becomes a lead contact (or updates the known contact), with the answers as contact fields, first-touch attribution, a timeline entry and a lead alert. A form embedded in the sales agent's chat is attached to that conversation ([sales agent](https://docs.haloagents.ai/agents/sales-agent.md)).
* **Meetings** booked, rescheduled or cancelled in Orbit arrive in real time and are shown on the contact's timeline. The hourly sync re-reads recent meetings as a safety net.

## Workflow and series triggers

Orbit events are ready-made triggers. In a workflow's trigger menu, or a [series](https://docs.haloagents.ai/outreach/overview.md) set to **Triggers an event**, pick the Orbit event. Each one fires for the Halo contact it belongs to, and its details are available as `{{trigger.payload.*}}` tokens in later steps.

| Trigger | Fires when | Tokens include |
| - | - | - |
| Form submitted | A form submission arrives | form title, UTM source/medium/campaign, referrer, country |
| Lead qualified by AI | An Orbit workflow's AI qualification marks the submitter qualified | qualification status, bucket, reasoning, recommended action |
| Meeting scheduled / rescheduled / cancelled | A booking is created, moved or cancelled | title, start and end time, meeting link, host, scheduling page, cancellation reason |
| Deal created / stage changed / won / lost | The contact's Orbit deal changes (the deal's primary contact) | deal name, amount, currency, pipeline, stage, previous stage, lost reason, link to the deal |
| Tag added / removed | A tag is added to or removed from the contact in Orbit | tag name and slug |

A deal's contact who isn't in Halo yet is added as a lead, since a won deal is usually the moment onboarding starts. Tag events only fire for contacts Halo already has.

**Example:** trigger on **Orbit · Deal won**, then create an onboarding, assign the CSM and send the welcome email. Everything happens in Halo the moment the deal closes in Orbit.

## The Orbit step in Halo workflows

Add an **Orbit** step from the step menu (shown once Orbit is connected). It acts on the enrolled contact's Orbit record, or the deal's primary contact in an onboarding workflow:

| Action | What it does |
| - | - |
| Update contact | Sets Orbit fields, standard or custom, with `{{tokens}}` from the record, the trigger or earlier steps |
| Add tag / Remove tag | Tags the contact; a tag that doesn't exist yet is created |
| Create deal | Opens a deal in the pipeline and stage you pick, with the contact as primary and their linked company |
| Create task | Creates a task for the contact, with a type, due date and assignee |
| Add note | Adds a note to the contact |
| Enroll in sequence | Enrolls the contact in an Orbit email sequence |
| Run workflow | Runs an Orbit workflow for the contact (once per enrollment, even if the step retries) |

The step finds the Orbit contact through the two-way sync's link, then by email. Turn on **Create the contact in Orbit if missing** to add contacts Orbit doesn't have. Test runs preview the request without changing anything in Orbit, and later steps can use the step's outputs (the Orbit contact id, the new deal or task id).

## Halo in Orbit workflows

Once Halo's actions are enabled for your workspace, Orbit's workflow editor lists them under **Installed apps**:

| Step | What it does |
| - | - |
| **Halo AI: Start a Halo workflow** | Enrolls the workflow's contact in an active Halo contact workflow (map the workflow's ID from its URL in Halo) |
| **Halo AI: Update a Halo contact** | Sets a field (name, phone or a custom field) on the contact in Halo |
| **Halo AI: Send event** | Records an event on the contact, as if your product had tracked it. Halo workflows triggered by **Event fired** and series set to **Triggers an event** with that name start, and the optional value is `{{trigger.payload.value}}` |
| **Halo AI: Add a note** | Adds a note to the contact's timeline in Halo |

The contact is the Halo contact the two-way sync linked, else the one with the same email, else a new lead. Each step returns `halo_contact_id` for later steps in the Orbit workflow.

## Disconnecting

Disconnecting removes the webhook subscription from Orbit, turns off the two-way sync and forgets its links, and stops the sync. Contacts, companies and meetings already synced are kept. Reconnecting later starts the two-way sync from a fresh first sync.

Removing Halo from Orbit's side (**Settings > Integrations** in Orbit) has the same effect right away: Orbit tells Halo, the two-way sync turns off, and the Orbit card in Halo shows that the connection was removed in Orbit, with a **Reconnect** button. Your team also gets an email about it. A connection made before Halo recorded which Orbit workspace it belongs to can't be matched to that notice; Halo finds out the next time it uses its Orbit access instead, and reconnecting once fixes it.


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