For the complete documentation index, see llms.txt. This page is also available as Markdown.

Events Reference

What every event and attribute in Analytics means, written in plain English. Your decoder ring for the event and attribute pickers.

Analytics names things the way a system names them — lead.created, participant.sc_type, journey.sc_execution_status. One name always means exactly one thing, which is what makes the numbers reliable, but it does mean the pickers need translating.

That's this page. Keep it open next to the query builder.

The picker is the truth, not this page.

The event and attribute pickers only ever show what your organisation has actually produced. If you've never used campaigns, journey.started won't appear. If you've never stored a city attribute on a lead, lead.city won't appear.

So an event missing from your picker isn't broken — it just hasn't happened yet. And a page like this one can only tell you what a name means, never whether you have it.

How to read a name

Event names describe something that happened, in the order thing → what happened to it:

lead.created            a lead was created
lead.status.updated     a lead's status changed
message.receipt.read    a message was read

Attribute names are always area.name. The part before the dot says which area of the product the detail comes from:

lead.sc_status          the lead's status
message.sc_event_sub_type   what kind of message it was
journey.sc_name         the name of the campaign or automation involved

The sc_ in an attribute name simply marks it as a SalesChat-defined field. Attributes you send never have it — yours appear as lead.city, lead.tier, lead.policy_number.


Events

Leads

Event
What it means
Typical use

lead.created

A new lead was created.

New-lead volume over time, by source, campaign or any attribute you store

lead.assigned

A lead was assigned to an agent — the first time, or on every reassignment.

Workload distribution, how leads get routed, how often leads change hands

lead.status.updated

A lead moved between active, inactive and expired. Carries both the old and the new value.

Churn and expiry, how long leads stay active

lead.attribute.set

A lead's stage or disposition was set — the SalesChat-managed pipeline fields.

Pipeline movement: how many leads reached Interested, Qualified, Won

lead.attribute.updated

One of your own attributes on a lead changed — city, budget, policy_number. Carries every key that changed in that write.

Tracking data quality and CRM sync; spotting which fields get filled in and when

user.attribute.updated

The same, for an attribute on an agent rather than a lead.

Rare; agent-profile changes

Reports built on these: new leads and where they come from · new vs returning · new lead to a real conversation

Messages

Event
What it means
Typical use

message

Every message in a lead's conversation, whoever sent it — the lead, an agent, or an automation. Your highest-volume event by far.

Conversation volume, who is doing the talking, template usage, reply rates

user.message.sent

A message sent by an agent, recorded against the agent rather than the lead.

Agent productivity — use this whenever you want to count agents, not conversations

message.receipt.sent

WhatsApp accepted the message for delivery.

Delivery funnel

message.receipt.delivered

The message reached the lead's phone.

Delivery funnel

message.receipt.read

The lead opened the message.

Read rates by template, campaign or time of day

Reports built on these: who is actually doing the talking · buttons vs typing · delivery health · which template earns its place · messages that never went out

Conversations (sessions)

A session is one continuous conversation with a lead, from the first message to the point it's closed or times out.

Event
What it means
Typical use

lead.session.started

A conversation opened.

Conversation volume, inbound demand by hour or day

lead.session.queued

The conversation went into the queue waiting for an agent.

How much of your inbound has to wait for a human

lead.session.ended

The conversation closed. Carries how long it lasted and why it ended.

Handling time, resolution vs timeout

Reports built on these: how long are our conversations · how much inbound waits for a human · how bad does it get (p90)

Campaigns, automations and inbound rules

Internally, all three are called a journey — one name for "something that ran on its own and did something to a lead". journey.sc_type tells you which kind you're looking at: campaign, automation or inbound.

Event
What it means
Typical use

journey.started

A campaign or automation run began.

How often automations fire; campaign launches

journey.ended

That run finished.

Run duration, completion

journey.execution

One attempt against one lead — the workhorse event. Carries whether it succeeded and, if not, why.

Automation reliability, failure reasons, how many leads an automation actually reached

journey.execution counts runs, not leads. If an automation fires three times for the same lead, that's three executions. To count leads, use the Unique measurement.

Reports built on these: is this automation reliable · how many leads did this campaign reach · which campaign converts best · the full campaign-to-pipeline funnel

AI agent events

If your organisation uses the SalesChat AI agent, you'll also see events beginning ai.. They behave like any other event here — countable in Trends, usable as a funnel step, filterable and breakable-down.

Agent Studio has a purpose-built surface for reading them, explained in AI Analytics. That page tells you what a Verdict or a Goal means; this one tells you what the names are so you can build your own reports.

Event
One row per…
Carries

ai.started

AI conversation, when it begins

Which agent, and what triggered it

ai.ended

AI conversation, when it finishes

The verdict, how it ended, how long it took, goals hit

ai.turn

Turn within a conversation

Tokens, latency, tool calls made in that turn

ai.tool_call

Tool call. Your highest-volume AI event by far.

Which tool, whether it worked, and why not

ai.goal

Conversation × goal — one row for each goal, for each conversation

That goal's name, whether it was met, and its score

About the conversation — recorded on ai.ended

Attribute
What it is
Values

ai.sc_verdict

What happened to the conversation. See AI Analytics for what each one means.

See the mapping below

ai.sc_end_reason

How the run finished

completed, stopped, handoff

ai.sc_ended_by_type

Who ended it, as distinct from how

ai, human, system

ai.sc_handoff_reason

Why it went to a person. Absent when it didn't.

completion, out_of_scope, escalation, timeout

ai.sc_duration_secs

How long the conversation lasted, in seconds. A number — averageable.

Any number

ai.sc_agent_name

Which agent handled it

Your agent names

ai.sc_trigger_source

What started the run

journey (a campaign, automation or inbound rule), user (a person), playground (testing)

ai.sc_category

What the conversation was about

Your own category labels

ai.sc_goal_achieved

Whether the conversation met its goals — one value for the whole run

true, false

ai.sc_num_goal_achieved

How many goals it met, for the whole run

Any number

ai.sc_message_count_lead / ai.sc_message_count_agent

Messages each side sent. Distinct from turn count — one turn can carry several lead messages.

Any number

ai.sc_resolution_kind

Whether a resolution was confirmed or inferred. Only meaningful when the verdict is a resolution.

confirmed, assumed

ai.sc_qualification_kind

The same, for qualification and disqualification

confirmed, assumed

ai.sc_verdict_reason

Present only when the verdict was not plainly derived

system_failure, backfill

The verdict values are not spelled the way Agent Studio displays them. Build filters with the left column:

Value in the picker
Shown in Agent Studio as

resolution

Resolution

procedure_handoff

Procedural handoff

qualification

Qualified

disqualification

Disqualified

escalated

Escalated

spam

Spam

abandoned

Abandoned

abandoned_no_outcome

No outcome

pending

Pending — a rare bookkeeping value on older sessions

Per goal — recorded on ai.goal

Attribute
What it is
Values

ai.sc_goal_name

Which goal this row is about

Your goal names

ai.sc_goal_met

Whether this goal was met in this conversation

true, false

ai.sc_goal_outcome

The judge's verdict on this goal

Whatever your goals produce — read the values in the picker

ai.sc_goal_score

The judge's score. A number.

Any number

ai.sc_goal_met and ai.sc_goal_achieved look interchangeable and are not. The first is per goal (on ai.goal); the second is per conversation (on ai.ended). Breaking down by ai.sc_goal_name only works on the per-goal event — the run-level rollup has no goal name to group by.

Per turn — recorded on ai.turn

Attribute
What it is
Values

ai.sc_turn_number

Which turn this was, counting from the start

Any number

ai.sc_input_tokens / ai.sc_output_tokens

Tokens in and out. Your cost signal.

Any number

ai.sc_latency_ms

How long the turn took, in milliseconds

Any number

ai.sc_tool_calls_count

Tool calls made in this turn

Any number

ai.sc_had_tool_failure

Whether any tool failed during this turn

true, false

ai.sc_tool_failures_count

How many failed in this turn

Any number

Per tool call — recorded on ai.tool_call

Attribute
What it is
Values

ai.sc_tool_name

Which tool was called

Your tool names

ai.sc_tool_type

What kind of tool

staged, read, mcp, kb (knowledge base), hook

ai.sc_result_status

Whether the call worked

ok, tool_error, dry_run, aborted

ai.sc_failure_domain

Whose fault it was. Kept separate from the reason on purpose: a model producing bad arguments is a different problem from a tool being down, and one combined "failure rate" hides both.

model, tool, infra

ai.sc_failure_reason

Why it failed

timeout, auth, rate_limited, unavailable, upstream_error, not_found, invalid_args, aborted, other

ai.sc_tool_latency_ms

How long the call took

Any number

ai.sc_checkpoint

Where in the run the call happened

turn, run_close

What isn't offered, and why

Raw identifiers — the run id, the goal id — are deliberately absent from the pickers. Nobody breaks a chart down by a UUID, and a report grouped by one produces a bar per conversation. Use the names instead: ai.sc_agent_name, ai.sc_goal_name, ai.sc_tool_name.

For what the verdicts, goals, qualification and categories actually mean — and how to read them without drawing the wrong conclusion — see AI Analytics.


Attributes

Attributes are what you filter and break down by. They fall into groups by the part of the product they come from.

Not every attribute is on every event — an attribute is only recorded when it's actually relevant to what happened. A message event knows about the channel and the sender; a lead.created event doesn't.

Rather than memorise this: pick your event first, and the attribute picker will only offer you attributes that event actually carries.

About the lead — lead.*

Recorded on every event about a lead.

Attribute
What it is
Values

lead.sc_status

Where the lead stands right now

active, inactive, expired

lead.sc_is_new

Whether the lead was created within 24 hours of this event — new lead vs returning

true, false

lead.sc_is_mock

Whether this is an internal or test lead. The Exclude internal and test leads switch uses this.

true, false

lead.sc_campaign

A campaign label, only if you set one. Store an attribute named sc_campaign on the lead and it lands here.

Whatever you send

lead.<your key>

Every attribute you store on a lead — lead.city, lead.tier, lead.product_interest

Whatever you send

On lead.attribute.set events you also get the pipeline fields:

Attribute
What it is
Values

lead.sc_stage

The stage the lead was moved to

Your own stage vocabulary

lead.sc_disposition

The disposition the lead was given

Your own disposition vocabulary

And on the events that describe a change, the before-and-after:

Attribute
On which event
Values

lead.sc_previous_status / lead.sc_new_status

lead.status.updated

active, inactive, expired

lead.sc_assignment_source

lead.assigned — how the assignment was made

api, user, support

lead.sc_source

lead.status.updated, lead.attribute.updated — who made the change

api, user, support, system

About the message — message.*

Attribute
What it is
Values

message.sc_event_sub_type

What kind of message it was

m.text, m.image, m.video, m.audio, m.file, m.location, sc.template, m.notice, sc.notice, m.emote

message.sc_is_template

Whether it was sent from a template

true, false

message.sc_reply_kind

How the lead replied — by tapping a button or list option, or by typing

interactive, free_flow

message.sc_success

Whether the message actually went out. false means it was blocked before reaching WhatsApp — working hours, moderation, a filtered word or an expired conversation window.

true, false

message.sc_event_type

Whether the message was visible in the chat or sent silently

m.room.message, sc.room.message.silent

Who and where — participant.* and room.*

Attribute
What it is
Values

participant.sc_type

Who sent it. One of the most useful attributes in the whole system.

lead (the customer), user (a human agent), app (a campaign, automation or bot)

room.sc_channel

Which channel the conversation is on

whatsapp, email, call, play, website

The template used — template.*

Attribute
What it is
Values

template.sc_name

The template's name

Your template names

template.sc_template_type

Whether it's a WhatsApp-approved template or an internal quick reply

waba, quick reply

template.sc_waba_template_category

The category Meta approved it under

marketing, utility, authentication, account_update, issue_resolution

The campaign or automation — journey.*

Attribute
What it is
Values

journey.sc_name

The name of the campaign, automation or inbound rule

Your own names

journey.sc_type

Which kind it was

campaign, automation, inbound

journey.sc_execution_status

Whether that attempt worked

success, fail

journey.sc_execution_failure_type

Why it failed. Absent when it succeeded.

GOVERNANCE_FAILED, MESSAGE_GOVERNANCE_FAILED, ACTIVE_CHATROOM_CONFLICT, SKIPPED, ACTION_FAILED, INTERNAL_ERROR

Not every failure is a fault. The two governance values mean the automation deliberately held back — a send limit or a governance rule stopped it — and SKIPPED usually means the lead was already in an AI conversation. Those are the system working as configured. ACTION_FAILED and INTERNAL_ERROR are the ones worth chasing.

journey.* is also carried on message events, so you can attribute messages back to the campaign or automation that produced them.

The conversation — session.*

Attribute
What it is
Values

session.sc_type

Who started it

inbound (the lead), outbound (you)

session.sc_duration_secs

How long it lasted, in seconds. A number — you can average it.

Any number

session.sc_end_reason

Why it closed — closed by the lead, by the agent, or timed out

See the picker

How the lead was routed — assignment_handler.*

Attribute
What it is
Values

assignment_handler.sc_name

The assignment rule that routed the lead to an agent. Absent when no rule was involved.

Your rule names


Filter operators

Operator
What it does

is / is not

Exact match on a single value

is one of / is not one of

Match against a list — whatsapp or website

contains

Partial text match, useful for names like diwali_

>, <, ≥, ≤

Number comparisons, for attributes like session.sc_duration_secs

is set / is not set

Whether the attribute was recorded at all. Use this rather than comparing to an empty value.

Filters apply either to the whole report or to one row of it — Filters explains the difference, and splitting by two things at once is a worked case.


Ready to build something?

Head to Example Reports — real questions, each with the exact clicks, from a first chart through to attribution and exclusions.

Last updated