Why do classic support KPIs need adjusting?

Most customer service KPIs assume a ticket, a known customer and a person answering. A website voice agent works differently: callers are anonymous unless they say who they are, and the agent can’t see their account. A call reaches your team only if you’ve turned on human handover, which is an early release. First contact resolution needs repeat contacts matched to one customer, and CSAT needs a survey, so neither can be read from the agent’s records.

What you can measure is what happened in each conversation: whether it completed, how long it lasted, what the caller asked, whether the agent answered from your knowledge and whether the caller pressed That was helpful.

Which KPIs should you track?

These definitions use the fields each conversation records. Leave out dashboard tests, which the export marks, so your own calls don’t skew the numbers.

Voice agent KPIs and how to work them out
KPIWhat it tells youHow to work it out
ConversationsDemand for spoken help, for each agentCount conversations by agent each week
Completion rateCalls that connected and closed normallyCompleted and Escalated conversations divided by all conversations
Median lengthHow long callers stayMedian length of completed calls. Calls near 10 minutes hit the limit
Answer rateHow often the agent answered from your knowledgeAnswered divided by labelled, from a transcript sample
Gap rateHow often the knowledge base fell shortDidn’t know divided by labelled, from the same sample
Referral rateHow often callers needed your teamReferred divided by labelled
Helpful pressesCallers who chose to say it helpedHelpful ratings divided by completed conversations
Feedback notesBug reports and requests callers asked to pass onConversations with feedback the agent noted, read weekly
Top topicsWhat callers want help withThe Insights tab groups recurring questions from up to your latest 30 completed customer calls per agent in the last 30 days. For a full count, group the export’s topics and summaries by theme

1. Work out the counts from the export.

On the Conversations tab, Export downloads your latest 100 conversations as JSON. Each record has its channel, topic, status, start time, length in seconds, whether it was a dashboard test, the summary and any feedback, but not the transcript. A status of ended is what the dashboard calls Completed. Escalated is a completed call where the caller then chose Talk to a human and a handover to your team started, so the script counts it as completed too. Incomplete is Interrupted: the call didn’t close normally, which includes calls refused as they start, such as after the free conversations are used. Failed and pending calls never connected.

The script below reads one export and prints the counts for each agent, using only Python’s standard library. Run it weekly with the date of your last run, and keep each file, because an export only ever holds the latest 100 conversations.

kpis.py: counts for each agent from an export
"""Voice agent KPIs from a conversations export.

Usage: python3 kpis.py export.json [YYYY-MM-DD]
The optional date keeps conversations started on or after that day.
"""
import json
import statistics
import sys
from collections import Counter

RATING = "Customer rating: helpful"

with open(sys.argv[1], encoding="utf-8") as file:
    calls = json.load(file)
since = sys.argv[2] if len(sys.argv) > 2 else ""
calls = [c for c in calls if not c.get("is_test") and c["created_at"] >= since]

for channel in ("support", "sales"):
    rows = [c for c in calls if c["channel"] == channel]
    if not rows:
        continue
    statuses = Counter(c["status"] for c in rows)
    completed = [c for c in rows if c["status"] in ("ended", "escalated")]
    notes = [c.get("feedback") or "" for c in rows]
    helpful = sum(RATING in note for note in notes)
    to_read = sum(bool(note.replace(RATING, "").strip()) for note in notes)
    print(f"{channel} conversations: {len(rows)} {dict(statuses)}")
    print(f"  completion rate: {len(completed) / len(rows):.0%}")
    if completed:
        median = statistics.median(c["seconds"] for c in completed)
        print(f"  median completed length: {median / 60:.1f} minutes")
    print(f"  marked helpful: {helpful}, feedback notes to read: {to_read}")

2. Measure answer, gap and referral rates from transcripts.

These three come from reading, because Kawl Now doesn’t mark answers as right or wrong. Each week, open a sample of completed conversations, or all of them while volumes are small, and give each one a single label: answered, partly answered, didn’t know, referred, wrong or misheard.

Answer rate is answered divided by the number you labelled. Gap rate is didn’t know divided by the same number, and each one points to an article to write. Keep the labels and the sample size the same each week, so the numbers stay comparable. The conversation review guide has a log to copy and a script that flags likely gaps.

Which classic KPIs need another source?

Some familiar metrics can’t come from the agent’s records alone.

  • CSAT and NPS need a survey. The widget’s only rating is a That was helpful button, with no negative option, so treat helpful presses as a floor and never report them as satisfaction.
  • First contact resolution needs repeat contacts matched to one customer. Callers aren’t identified, so track repeated topics instead: the same question several times a week means the answer is missing or hard to find.
  • Deflection needs your help desk data. Compare ticket volume on the topics the agent covers before and after launch, and treat the result as a rough signal, because releases, seasons and pricing changes also move ticket volume.
  • Cost per conversation can’t be worked out yet, because paid calls aren’t available. Track how many of the workspace’s 50 free conversations you’ve used on the Usage & billing tab instead.

3. Set targets from your own baseline.

Use your first few weeks as the baseline, and set targets from it. Benchmarks from contact centres measure phone queues and human agents, so they don’t transfer to a voice agent on a website.

Watch the direction as much as the level. A falling gap rate after you add articles suggests they’re being found. A rising share of interrupted calls is worth checking in the browsers your customers use, once you’ve ruled out calls refused because the free conversations ran out.

Common questions

Does Kawl Now measure CSAT?

No. Kawl Now records each conversation’s status, length, transcript and feedback, and callers can press That was helpful after a call, but it doesn’t run surveys or calculate CSAT, NPS or resolution rates. Use the export and a transcript review to work out your own KPIs.

Which KPIs matter most for an AI voice agent?

Gap rate and top topics. Gap rate shows how often the knowledge base fell short, and topics show what to write next. Add completion rate and conversation length to spot technical problems, and run your own survey if you need CSAT.

How do you measure deflection for a website voice agent?

Indirectly. Compare your help desk’s ticket volume on the topics the agent answers for the weeks before and after launch, and read transcripts to see whether those questions were answered. Releases, seasons and pricing changes move ticket volume too, so treat the result as a rough signal.