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.
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 readAttribute 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 involvedThe 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
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
lead.attribute.updated does not fire when an attribute is deleted. Removing an attribute is currently invisible to Analytics.
Reports built on these: new leads and where they come from · new vs returning · new lead to a real conversation
Messages
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
Don't add message and user.message.sent together.
When an agent sends a message, both events are recorded — one about the conversation, one about the agent. Counting both means counting that message twice. Pick the one that matches your question:
"How many messages went out?" →
message, filtered toparticipant.sc_type = user"How many agents sent something?" →
user.message.sent, counted as unique
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.
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.
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
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.
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
Grain is the thing that goes wrong here. These five events count different objects, and a report built at the wrong one is wrong without looking wrong.
ai.ended counts conversations. ai.turn counts turns. ai.tool_call counts calls. ai.goal counts conversation-and-goal pairs, so a conversation with three goals contributes three rows — and "how many goals were met" is a different number from "how many conversations met all their goals".
Pick the event that counts the object your question is about, then filter.
About the conversation — recorded on ai.ended
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:
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
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
Per turn — recorded on ai.turn
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
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
Counting tool failures: pick your grain deliberately. These three questions give three different numbers, and only one of them is usually what someone means:
How many calls failed? →
ai.tool_call, filterai.sc_result_statusistool_errorHow many turns had a failure? →
ai.turn, filterai.sc_had_tool_failureistrueHow many leads were affected? → the same query, measurement Unique leads (see counting leads once)
Failures cluster, so the first number is reliably larger than the second. Counting conversations with a failure is not available yet: ai.sc_had_tool_failure is recorded on turns, not on ai.ended, and Unique leads de-duplicates by lead rather than by conversation.
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.
About the lead — lead.*
Recorded on every event about a lead.
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:
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:
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.*
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.*
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.*
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.*
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
journey.* is also carried on message events, so you can attribute messages back to the campaign or automation that produced them.
The conversation — session.*
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.*
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
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.
"is not" excludes the blanks too.
journey.sc_type is not campaign matches only events that have a journey type and it isn't campaign. Events with no journey at all are not matched. If you want those as well, use is not set as a second condition.
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