Widget identify
Best when your app already knows the signed-in user and should push contact and company context into HAL during chat.
Use CRM when founder-led sales or a small revenue motion should influence the operator loop, not live in a separate tool with no connection to support or Work.
Best when your app already knows the signed-in user and should push contact and company context into HAL during chat.
Best when an authenticated HAL user or internal backend manages CRM records directly through account routes.
Currently limited to conversations and contacts under /api/v1; they are not the main write surface for visitor-company sync.
POST /api/widget/identify: identify a visitor and optionally merge contact metadata, company metadata, linked company IDs, and stage contextPOST /api/widget/set-properties: merge additional visitor/contact properties after identifyPOST /api/widget/track: record visitor or company milestone events with a name and optional scalar valuePOST /api/widget/set-stage: update the active or explicitly targeted company stage for an identified visitorPOST /api/widget/set-deal: update deal value and optional stage on the active or explicitly targeted companyPOST /api/contacts and PATCH /api/contacts/:id: create or update contact records directly as an authenticated HAL userPOST /api/companies and PATCH /api/companies/:id: create or update company records directly as an authenticated HAL useradvance_only, so they do not downgrade a later manually-set stagesetStage() and setDeal() require the visitor to already be linked to a contact and company, which usually means identifying with an email firstcompany.id during identify() to establish the active company context for later widget CRM writescompany_id on later company-scoped widget writes when the contact can belong to multiple companies or the user can switch accountstrack() is for point-in-time milestones; use metadata writes for current-state attributesset-properties updates visitor/contact metadata only; it does not update company metadataidentify() includes an email, HAL finds the existing contact by project and email or creates one if neededcompany_id first, then the active company from identify(company.id), then a single linked companyadvance_only compares stage order and skips a write when the company is already in a later stageadvance_only still applies when the requested stage is ahead of the current stage or when no stage is set yetexact writes the requested stage directly, including intentional downgradesPOST /api/contacts creates only the contact; it does not automatically create a companyPOST /api/companies creates only the company; contacts are linked separatelycompany.id or company_ids, HAL links the contact to those existing company recordscompany_ids adds links, but only company.id establishes the active company context for later widget CRM writescompany.name and the contact currently has only a placeholder company, HAL upgrades that placeholder in placeMeaningful stage changes can affect the active focus lane.
HAL can recommend sales actions when warm pipeline is losing momentum.
Support and CRM signals can reinforce each other instead of drifting apart.
See where deal value, metadata, stages, and linking rules live.
Push known visitor, contact, and company context from your app.
Reference identify, track, set-properties, set-stage, and set-deal.
Choose between widget routes, account routes, and the public API surface.