Post-Call Metrics

View as Markdown

Post-call metrics let you pull specific insights from conversations after they end. Define what you want to know — satisfaction scores, call outcomes, issue categories — and Atoms analyzes each call to fill in the answers.

Location: Left Sidebar → Post Call Metrics

Post-call metrics list

Post-call metrics dashboard

How It Works

  1. You define metrics — What questions do you want answered about each call?
  2. Call ends — Conversation completes normally
  3. AI analyzes — Atoms reviews the transcript against your metrics
  4. Data populated — Your metrics get filled in automatically
  5. Access anywhere — View in logs, receive via webhook, export

Creating a New Metric

Click the Add Metrics + button to open the configuration panel. You’ll see two options:

Disposition metrics

Create a new metric from scratch

Build a custom metric from scratch. Fill in the Identifier, Data Type, and Prompt — see details below.

Use Add Another + to create multiple metrics at once.

Don’t forget to hit Save in the Disposition tab once you’re done.


Configuring a Metric

Each metric needs three things:

FieldRequiredDescription
IdentifierYesUnique name for this metric. Lowercase, numbers, underscores only.
Data TypeYesWhat kind of value: String, Number, or Boolean
PromptYesThe question you want answered about the call

Identifier

This is the key used to reference the metric in exports, webhooks, and the API.

customer_satisfaction
call_outcome
follow_up_needed

Naming rules: Lowercase letters, numbers, and underscores only. No spaces or special characters.

Data Type

TypeUse forExample values
StringFree text, categories”resolved”, “escalated”, “billing issue”
BooleanYes/no questionstrue, false
IntegerWhole numbers, scores1, 5, 10
EnumFixed set of optionsOne of: “low”, “medium”, “high”
DatetimeDates and times”2024-01-15T10:30:00Z”

Prompt

This is the question the AI answers by analyzing the transcript. Be specific.

Good prompts:

  • “Did the agent acknowledge and respond to customer concerns effectively?”
  • “Rate customer satisfaction from 1 to 5 based on tone and words used.”
  • “What was the primary reason for this call? Options: billing, technical, account, other”

Vague prompts to avoid:

  • “Was it good?”
  • “Customer happy?”

Start with 3-5 metrics. Too many can slow analysis and clutter your data. Add more as you learn what insights matter most.


Example Metrics

FieldValue
Identifiercall_outcome
Data TypeString
Prompt”What was the outcome of this call? Options: resolved, escalated, transferred, abandoned, callback_scheduled”

Configuring via API

Post-call metrics are set through the agent versioning flow: edit a draft’s config, publish it as a new version, and activate the version. There is no standalone post-call-analytics endpoint — configuration lives on the agent’s active version.

Full flow

1import os
2import requests
3
4API_KEY = os.environ["SMALLEST_API_KEY"]
5AGENT_ID = "YOUR_AGENT_ID"
6BASE = "https://api.smallest.ai/atoms/v1"
7HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
8
9# 1. Get the currently active version
10agent = requests.get(f"{BASE}/agent/{AGENT_ID}", headers=HEADERS).json()
11active_version_id = agent["data"]["activeVersionId"]
12
13# 2. Create a draft from that version
14draft = requests.post(
15 f"{BASE}/agent/{AGENT_ID}/drafts",
16 headers=HEADERS,
17 json={"sourceVersionId": active_version_id, "draftName": "post-call-metrics-update"},
18).json()
19draft_id = draft["data"]["draftId"]
20
21# 3. Write your post-call metrics config onto the draft
22requests.patch(
23 f"{BASE}/agent/{AGENT_ID}/drafts/{draft_id}/config",
24 headers=HEADERS,
25 json={
26 "postCallAnalyticsConfig": {
27 "dispositionMetrics": [
28 {
29 "identifier": "call_resolved",
30 "dispositionMetricPrompt": "Was the customer issue resolved by the end of the call?",
31 "dispositionMetricType": "BOOLEAN",
32 },
33 {
34 "identifier": "satisfaction_score",
35 "dispositionMetricPrompt": "Rate the customer satisfaction from 1 to 5",
36 "dispositionMetricType": "INTEGER",
37 },
38 {
39 "identifier": "call_outcome",
40 "dispositionMetricPrompt": "What was the outcome of the call?",
41 "dispositionMetricType": "ENUM",
42 "choices": ["resolved", "escalated", "callback_scheduled", "no_action"],
43 },
44 {
45 "identifier": "summary",
46 "dispositionMetricPrompt": "Provide a brief summary of the call",
47 "dispositionMetricType": "STRING",
48 },
49 ],
50 "useInternalAnalyticsModel": True,
51 "useReasoningModel": False,
52 }
53 },
54).raise_for_status()
55
56# 4. Publish the draft as a new version and activate it
57requests.post(
58 f"{BASE}/agent/{AGENT_ID}/drafts/{draft_id}/publish",
59 headers=HEADERS,
60 json={"label": "Added post-call metrics", "activate": True},
61).raise_for_status()

Disposition metric schema

Each entry in dispositionMetrics takes four fields:

FieldRequiredDescription
identifierYesMachine name. Lowercase letters, digits, and underscores only.
dispositionMetricPromptYesThe question evaluated against the transcript.
dispositionMetricTypeYesOne of STRING, BOOLEAN, INTEGER, ENUM, DATETIME.
choicesOnly when type is ENUMAllowed values.

Two analytics flags apply globally:

FieldDefaultDescription
useInternalAnalyticsModeltrueUse the internal analytics model. When false, the agent’s own LLM evaluates metrics.
useReasoningModelfalseRoute evaluation through the reasoning model — higher quality, higher latency/cost.

Reading current metrics

$curl -H "Authorization: Bearer $SMALLEST_API_KEY" \
> "https://api.smallest.ai/atoms/v1/agent/$AGENT_ID" \
> | jq '.data._resolvedConfig.postCallAnalyticsConfig'

The active version’s metrics are surfaced under _resolvedConfig.postCallAnalyticsConfig. Each entry round-trips exactly as sent: identifier, dispositionMetricPrompt, dispositionMetricType, and choices (when the type is ENUM).