Leads & conversions

Olotalk captures visitor intent, scores leads, and closes the attribution loop when those leads convert in your CRM or calendar tool. Outcomes feed back into Olotalk so every conversation can be tied to revenue.


How conversion works

Conversation
Lead → webhook
Your CRM record
Outcome → API
revenue attributes back to the conversation
Olotalk captures and scores the lead and posts it to your webhook; your system creates the CRM record and, on each milestone, calls the outcome API, closing the loop so revenue attributes back to the originating conversation.

When a visitor submits the lead capture form inside the assistant, Olotalk:

  1. Scores the lead (0–100) based on intent type, confidence, company presence, use-case richness, and email domain.
  2. Assigns a status: qualified (≥ 60), new (21–59), or dismissed (≤ 20 — no positive signals).
  3. Dispatches the lead to your notification channels. By default the webhook fires for every submitted lead (both new and qualified, but never dismissed), while the email alert fires only for qualified leads. Both triggers are configurable per channel.
  4. Stores the lead with email, name, company, use case, page URL, intent, score, and an async AI summary of the session.

Webhook delivery is tracked and retried with exponential backoff if the initial dispatch fails.


Lead scoring reference

How it adds up+20Base+30Pricing / demo / integration+15Use case ≥ 20 chars+10Business email
Qualified >= 60
0100
Dismissed<= 20
New21-59
Qualified>= 60
Won= 100
Every submitted lead scores 0–100 from stacked signals. At 60 it flips to qualified, which fires the email alert. A won outcome later forces the score to 100.
SignalPoints
Base (submitted the form at all)20
Intent: pricing, demo, or integration+30
Intent: support+12
Intent confidence ≥ 85%+10
Company name provided+10
Use case ≥ 20 characters+15
Business email domain (non-free)+10

Status thresholds:

ScoreStatusMeaning
≥ 60qualifiedHigh-signal lead; triggers the email alert
21–59newPartial signal; worth reviewing
≤ 20dismissedNo positive signals; base noise

A lead is also flipped to won (score forced to 100) when you report a won outcome via the callback below.


Closed-loop attribution — the outcome callback

meeting
opportunity
WonWon
As a lead progresses you POST outcomes back. meeting and opportunity track the pipeline; only a won outcome (with valueCents) counts toward attributed revenue.

Once a lead converts in your system (meeting booked, opportunity created, revenue won), ping Olotalk to close the attribution loop. This is what turns “webhook delivered” into “revenue attributable.”

Assistant API key

The outcome callback uses a per-assistant API key — not the global dashboard secret. Each assistant has its own key so you can rotate or revoke credentials per integration without affecting anything else.

Generate or rotate a key from the assistant builder: open your assistant from the Assistants nav, go to the Install step, and expand Install domains & API key to find Generate key. The plaintext key is shown once on generation; copy it immediately. Olotalk stores only its SHA-256 hash.

Key format: olk_ followed by 64 hex characters.

Endpoint

POST /public/v1/assistants/{assistantId}/leads/{leadId}/outcome
Authorization: Bearer olk_{your_assistant_api_key}
Content-Type: application/json

Request body

{
  "type": "meeting",
  "occurredAt": "2026-04-15T14:00:00Z",
  "notes": "Demo booked via Calendly",
  "externalId": "evt_cal_abc123"
}
FieldTypeRequiredDescription
type"meeting" | "opportunity" | "won"Conversion milestone type
occurredAtISO 8601 datetimeWhen the conversion happened in your system
valueCentsinteger (USD cents)Revenue value. Only counted toward revenue totals when type is "won" — stored for reference on other types but excluded from metrics.
notesstring (max 1000 chars)Free-text note
externalIdstring (max 255 chars)Idempotency key. Your stable identifier for this event — e.g. a Calendly event UUID or HubSpot activity ID. Olotalk upserts on (assistantId, externalId, type), so retries update the existing record instead of creating a duplicate. Because type is part of the key, a meeting and a won event can share the same externalId (e.g. the same deal ID) and will be stored as separate rows. Strongly recommended for any caller that may retry on failure.

Response

201 Created

{
  "ok": true,
  "outcome": {
    "id": "cm9...",
    "type": "meeting",
    "valueCents": null,
    "occurredAt": "2026-04-15T14:00:00.000Z",
    "createdAt": "2026-04-15T14:01:00.000Z",
    "externalId": "evt_cal_abc123"
  }
}
StatusMeaning
201Outcome recorded (or updated, if externalId matched an existing row)
400Validation error — check details in the response body
401Missing or invalid API key
404Lead not found, or does not belong to this assistant
429Rate limit exceeded — retry after 60 seconds

Multiple outcomes per lead

A lead can accumulate outcomes over time. Call the endpoint once per conversion event; Olotalk stores them all.

# Step 1 — meeting booked
curl -X POST https://api.olotalk.com/public/v1/assistants/ast_oltk_7Kd2mQxRv9TbNhLpW3Zsy/leads/cm9xyz/outcome \
  -H "Authorization: Bearer olk_your_assistant_api_key" \
  -H "Content-Type: application/json" \
  -d '{"type":"meeting","occurredAt":"2026-04-15T14:00:00Z","externalId":"evt_cal_abc123"}'

# Step 2 — revenue won (3 weeks later)
# A distinct externalId is fine; even reusing the meeting's externalId is safe
# because `type` is part of the uniqueness key, so this records a new won row
# rather than overwriting the meeting above.
curl -X POST https://api.olotalk.com/public/v1/assistants/ast_oltk_7Kd2mQxRv9TbNhLpW3Zsy/leads/cm9xyz/outcome \
  -H "Authorization: Bearer olk_your_assistant_api_key" \
  -H "Content-Type: application/json" \
  -d '{"type":"won","occurredAt":"2026-05-06T09:00:00Z","valueCents":480000,"externalId":"deal_hs_789xyz"}'

Outcome attribution (in the dashboard)

Your Analytics page rolls these outcomes up for you — conversions by type (meeting / opportunity / won), total revenue, and a per-assistant breakdown. Revenue totals sum only won outcome values; pipeline estimates recorded on opportunity outcomes are stored but excluded. Everything here is driven by the outcome callback above — you POST outcomes with your assistant’s API key, and the dashboard renders the rollups.


Lead attribution (in the dashboard)

Your Leads page lists every captured lead — filterable by status (new / qualified / dismissed), intent (pricing / demo / integration / support / general), and assistant. Alongside the list it shows an attribution breakdown: leads by intent (total and qualified), your top pages by lead count, and a per-assistant qualified funnel, over a rolling 30-day window.


HubSpot integration

Olotalk has a native HubSpot integration. When connected, a visitor who confirms the Create HubSpot contact & deal CTA gets a HubSpot contact and deal created automatically — no Zapier, no manual export. (This is one of the CTA action types; it fires only when the assistant proposes that action and the visitor confirms it, not automatically on every lead.)

Connect HubSpot

  1. Go to Integrations in the dashboard and find HubSpot.
  2. Click Connect HubSpot. You’ll be redirected to the HubSpot OAuth screen.
  3. Authorise Olotalk in the portal you want to write to.
  4. You’ll be redirected back to your assistant with a hubspot=connected confirmation.

The connection is per-assistant. Each assistant can point to a different HubSpot portal, or multiple assistants can share the same portal. HubSpot connect/disconnect for an assistant lives on its Behavior step in the builder.

What happens when the CTA fires

Visitor confirms CTA
Upsert contact
Create deal
Associate
Patch amount on won
On CTA confirmation Olotalk upserts a HubSpot contact keyed by email, creates a deal, and associates them. When you later report a won outcome with a value, it patches the deal amount.

When a visitor confirms the hubspot_create_contact_deal CTA, Olotalk:

  1. Upserts a HubSpot contact — keyed by email address. If a contact already exists, its ID is reused (no duplicate is created).
  2. Creates a HubSpot deal — associated to the contact. The deal name is derived from the assistant name and the lead’s email.
  3. Associates the deal to the contact via HubSpot’s association API.

The resulting hubspotDealId is stored in Olotalk against the action record for traceability.

Closing the loop — patching deal amount on won

When you report a won outcome via the outcome callback with valueCents > 0, Olotalk automatically patches the corresponding HubSpot deal’s amount field — no extra call needed.

# Report a won outcome with revenue value
curl -X POST https://api.olotalk.com/public/v1/assistants/ast_oltk_7Kd2mQxRv9TbNhLpW3Zsy/leads/cm9xyz/outcome \
  -H "Authorization: Bearer olk_your_assistant_api_key" \
  -H "Content-Type: application/json" \
  -d '{"type":"won","occurredAt":"2026-05-06T09:00:00Z","valueCents":480000,"externalId":"deal_hs_789"}'

Olotalk finds the action record that holds the hubspotDealId for that lead, refreshes the HubSpot token if needed, and PATCHes properties.amount on the deal. This is fire-and-forget — if it fails, the outcome is still recorded; a warning is logged server-side.

Token refresh

HubSpot access tokens expire. Olotalk stores both the access and refresh tokens and refreshes automatically before each API call when the token is within 60 seconds of expiry. No manual re-authorisation is needed unless you explicitly disconnect and reconnect.

Disconnect

Go to Integrations, open HubSpot, and click Disconnect. The stored tokens are revoked and the connection is removed. Leads already synced to HubSpot remain in your portal.


Other CRM integrations

HubSpot is the only native CRM integration shipping today. Everything else follows Olotalk’s generic handoff pattern:

  1. Olotalk captures and scores the lead.
  2. Olotalk POSTs the lead payload to your configured webhookUrl when a lead is submitted (the default trigger), or when a confirmed trigger_webhook action fires.
  3. Your integration layer creates or updates the CRM record.
  4. When that CRM record reaches a milestone such as meeting, opportunity, or won, your system calls the outcome callback and passes the CRM record ID as externalId.

That pattern already works with any CRM that exposes contact/lead/deal APIs. In practice, the common fits are:

CRMTypical mapping from Olotalk
SalesforceLead or Contact + Opportunity
PipedrivePerson + Deal
Zoho CRMLead or Contact + Deal
Microsoft Dynamics 365Lead or Contact + Opportunity
AttioPerson + Deal
CloseContact + Opportunity
HighLevelContact + Opportunity
FreshsalesContact + Deal
InsightlyContact + Opportunity
monday Sales CRMContact + Deal board item
Any other CRM with a public APIContact/lead create or update + downstream outcome callback

When a CRM is a good fit

A CRM is a strong candidate for Olotalk if it supports:

  • creating or updating contacts, leads, deals, or opportunities over HTTP
  • OAuth or API-key authentication
  • outbound webhooks or some other event mechanism so you can report meeting, opportunity, or won outcomes back to Olotalk without manual exports

If the CRM lacks outbound events, you can still integrate it. You just need your automation layer to call the outcome callback when the record changes state.

Native roadmap

Per the current integration roadmap, the next native CRM candidates after HubSpot are:

  • Salesforce — enterprise coverage
  • Pipedrive — smaller B2B SaaS teams and a simpler API surface

Until those ship natively, the webhook + outcome-callback pattern is the supported path.


Qualified lead email alerts

Set a Notify email on an assistant to receive an email alert whenever a lead reaches qualified status. Configure it on the assistant builder’s Base step, under Advanced configuration → Action policy (the Qualified-lead notify email field).

The alert is sent fire-and-forget using the same transactional email pipeline as password reset. It includes the lead’s name, company, email, intent, score, and a link to the lead in the dashboard.


Dashboard

The /leads page in the dashboard surfaces all of the above visually:

  • Summary cards — total, qualified, new, dismissed
  • Outcome pipeline — meetings, opportunities, won count, won revenue (last 30 days); only shown when outcomes exist
  • Attribution section — intent bars and top pages
  • Lead list — filterable, paginated, with score bar, AI summary, webhook delivery status, and HubSpot deal link (when connected)