Documentation

Webhooks

Orbit pushes CRM events to any HTTPS endpoint you own. Configure endpoints in the app under Lead Sync → Outbound webhooks: pick the events you want, and Orbit signs and delivers each one, keeping a delivery log with the response status and body. See also the API reference.

Events available today

Orbit emits 44 events across 7 areas of the product. Events are emitted at the database layer, so they fire regardless of whether the change came from the UI, the API, an import, an automation or an AI action.

Contacts

contact.created

A contact is created

contact.updated

Any contact field changes

contact.deleted

A contact is deleted

contact.status_changed

A contact moves pipeline stage

contact.hot_lead

A contact is flagged as a hot lead

contact.icp_scored

A contact receives or changes its ICP score

lead.received

An inbound lead arrives via API, form or Beam

Tasks and follow-ups

task.created

A task is created

task.updated

A task changes

task.completed

A task is completed

task.deleted

A task is deleted

follow_up.created

A follow-up is scheduled

follow_up.completed

A follow-up is completed

Proposals

proposal.created

A proposal is created

proposal.updated

A proposal changes

proposal.sent

A proposal is sent

proposal.viewed

A recipient opens a proposal

proposal.accepted

A proposal is accepted

proposal.rejected

A proposal is rejected

proposal.signed

A proposal is signed

Invoices and contracts

invoice.created

An invoice is created

invoice.sent

An invoice is issued

invoice.paid

An invoice is paid

contract.created

A contract is created

contract.sent

A contract is sent for signature

contract.signed

A contract is signed

signature.created

A signature is captured

Events

event.created

An event is created

event.updated

An event changes

event.published

An event goes live

event_registration.created

Someone registers for an event

event_registration.confirmed

A registration is confirmed

event_registration.attended

An attendee is checked in

Quests

quest.created

A quest is created

quest.published

A quest goes live

quest_completion.completed

Someone completes a quest

quest_completion.reviewed

A quest submission is approved or rejected

Goals, meetings and Orbit Sync

goal.created

A goal is created

goal.updated

Goal progress changes

goal.achieved

A goal hits its target

meeting.created

A meeting is booked

meeting.completed

A meeting is completed

meeting.summarised

AI produces a meeting summary

sync_session.completed

An Orbit Sync check-in is completed

Delivery format

Every delivery is a POST with a JSON body and these headers:

POST https://your-endpoint.example.com/orbit
Content-Type: application/json
X-Orbit-Event: contact.created
X-Orbit-Signature: sha256=<hex digest>

The body always has the same envelope:

{
  "event": "contact.created",
  "tenant_id": "b3f0c9e2-...",
  "timestamp": 1765412345678,
  "data": {
    "id": "0f0b1f2c-...",
    "contact_id": "0f0b1f2c-...",
    "name": "Ada Lovelace",
    "email": "ada@example.com",
    "company": "Analytical Engines",
    "title": "Head of Engineering",
    "lead_source": "Website form",
    "deal_value": 12000,
    "tags": ["inbound", "enterprise"],
    "status": "new"
  }
}

data carries the object the event is about. Treat it as additive: new fields may appear over time, so parse defensively rather than asserting an exact shape.

Verifying the signature

Each endpoint has its own secret, shown when you create it. Orbit computes an HMAC-SHA256 of the exact raw request body using that secret and sends it as X-Orbit-Signature. Compute the same digest over the raw body and compare in constant time — always before parsing.

import { createHmac, timingSafeEqual } from "crypto";

export function verifyOrbit(rawBody: string, header: string, secret: string) {
  const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(header ?? "");
  const b = Buffer.from(expected);
  return a.length === b.length && timingSafeEqual(a, b);
}

Responses, retries and logs

  • Return a 2xx as quickly as you can and process asynchronously. Anything non-2xx is recorded as a failure.
  • Orbit stores every attempt — event type, response status, and the first 500 characters of the response body — visible in the delivery log next to the endpoint.
  • Each endpoint tracks its last delivery time, last status and consecutive failure count so you can spot a broken receiver quickly.
  • Deliveries may arrive more than once during transient failures. Make your handler idempotent by keying on data.id plus event.
  • Endpoints can be disabled without deleting them, which pauses delivery while keeping the history.

Coverage

Every event in the table above is emitted today, including invoice and contract lifecycle, event registrations, quest submissions and reviews, and meeting and transcript events. Events are raised at the database layer, so they fire regardless of whether the change came from the app, the API, a CSV import, an automation or an AI action. If you need an event that is not listed, tell us and we will add it.