Quantum Automations Quantum Automations
Blog · Voice AI · Lead Systems · Document Automation · Portfolio · Services · Pricing · Contact
← Back to Blog
Guide · Voice AI

Call Analytics Software for Voice Agents: Conversation Intelligence

Published August 2026
By Mahmoud Ghanem
Topic Voice AI · Post-Call Analytics
Reading time 10 min
For UK SME ops leads
On this page
  1. The six conversion signals buried in 10,000 call transcripts
  2. A schema for call records, metadata and searchable outcomes
  3. Sentiment analysis on voice agent calls: what works and where it breaks
  4. Objection pattern detection: the three objections that kill 40% of conversions
  5. How sub-second latency gaps line up with call abandonment
  6. The weekly coaching report that shows where the call flow loses calls
  7. Building call analytics software in n8n: ingestion, scoring and delivery
  8. Retell, VAPI and Deepgram now ship conversation intelligence APIs
  9. Three analytics approaches and what each revealed about a real campaign
  10. FAQ
TL;DR

Call analytics software for a voice agent starts with the transcripts you already have: store each call's JSON in S3, score objections, sentiment and per-turn silence gaps into Postgres, and send a weekly Slack report that names the turns where calls are lost.

  • Transcripts in S3 plus a Postgres metadata row per call need no analytics platform at 10,000 calls a month.
  • Six signals show where a campaign loses calls: trust, objection clusters, turn latency, sentiment trajectory, branch coverage and the turn where calls tip.
  • Silence gaps above 1.2 seconds drove a 31% hang-up rate at that turn, and no provider dashboard shows them.
  • The n8n pipeline costs about £28 a month, against £1,100–1,400 for the off-the-shelf tools we evaluated.

31% of calls in one UK SaaS booking campaign ended within eight seconds of the prospect asking "who is this calling from?" The flow design had no handler for that trust-signal failure, and we only saw it by running call analytics software, in our case a home-built pipeline, over 10,000 outbound transcripts collected across six weeks. The agent's conversion rate sat at 14%. One new state added to the flow JSON recovered nine percentage points. The transcripts had been sitting in an S3 bucket, unread, since launch.

Call analytics, in this sense, means turning stored transcripts into signals about where calls are lost. The data, the insight and the recovery were all there. Someone just had to build the pipeline to surface them, and most teams never do.

The six conversion signals buried in 10,000 call transcripts

When you process transcripts at scale, six signal categories determine where a campaign is losing calls:

Trust signals. How quickly does the prospect identify the caller and the purpose of the call? Calls that exit before turn three almost always have a trust failure. The signal appears in the first 15 seconds of transcript text.

Objection clusters. The same five objections appear in 70–80% of failed calls across every outbound campaign we have run. The exact phrasing shifts by industry, but the semantic cluster is consistent. NLP can surface these in hours from transcript data that would take weeks to review manually.

Turn latency gaps. Silence between the agent's response and the prospect's next utterance. A gap above 1.2 seconds correlates with abandonment at that specific turn, independent of call stage and independent of what was said.

Sentiment trajectory. Not just final sentiment, but the arc across the call. A prospect who starts neutral and turns negative between turns four and six is a different failure mode from one who is negative from the opening utterance. Trajectory reveals the specific moment the call tips.

Script branch coverage. Which branches of the flow JSON were actually taken? Dead branches tell you what the call flow designer assumed versus what actually happens. Branches taken by fewer than 3% of calls are candidates for removal; branches taken by 40% with no downstream refinement are candidates for A/B testing.

Conversion inflection point. The exact turn where a call tips toward booking or exit. In our SaaS campaign, it was consistently turn seven: if the agent had not resolved the trust objection by turn seven, the prospect disengaged 91% of the time. This single data point drove the entire flow redesign.

None of these signals live in your Retell or VAPI dashboard. They live in the transcripts, and only emerge at volume.

A schema for call records, metadata and searchable outcomes

Store raw transcript JSON from Retell or VAPI verbatim in S3 at s3://calls/{{campaign}}/{{date}}/{{call_id}}.json. Add a Postgres row per call for queryable metadata. This is the schema we use:

CREATE TABLE call_records (
  call_id        TEXT PRIMARY KEY,
  agent_id       TEXT NOT NULL,
  campaign       TEXT NOT NULL,
  started_at     TIMESTAMPTZ NOT NULL,
  duration_sec   INTEGER,
  turn_count     INTEGER,
  outcome        TEXT CHECK (outcome IN (
                   'booked','no-answer','hung-up',
                   'disqualified','transferred')),
  sentiment_end  NUMERIC(4,3),   -- -1.0 to 1.0
  sentiment_arc  TEXT,           -- 'pos-neg', 'neutral-pos', etc.
  objection_tags TEXT[],         -- populated by scoring pipeline
  latency_p95_ms INTEGER,        -- 95th percentile silence gap in ms
  s3_path        TEXT NOT NULL,
  scored         BOOLEAN DEFAULT FALSE
);

CREATE INDEX idx_call_outcome  ON call_records (campaign, outcome);
CREATE INDEX idx_call_started  ON call_records (started_at DESC);
CREATE INDEX idx_call_unscored ON call_records (scored) WHERE scored = FALSE;

The objection_tags column is a Postgres text array. Populate it in the scoring pipeline, not at call time. For full-text search across transcript content, add a ts_vector column loaded by a nightly job that fetches from S3. This keeps the ingestion path fast and the search capability available without per-call S3 fetches.

At 10,000 calls per month, a Fly.io Postgres instance and standard S3 costs roughly £8/month combined. No dedicated analytics platform required.

Sentiment analysis on voice agent calls: what works and where it breaks

Short conversational call turns (three to eight words) break most off-the-shelf sentiment models trained on review text. VADER will score "yeah sure I guess" as neutral when it signals soft disengagement in a sales call context.

What works reliably: RoBERTa variants fine-tuned on dialogue, specifically cardiffnlp/twitter-roberta-base-sentiment-latest, handle short utterances better than models trained on Amazon reviews. Apply utterance-level scoring, then weight turns after turn five more heavily. By then the prospect has decided whether to engage and the filler-to-signal ratio improves. Track the trajectory (e.g. pos-neg, neutral-abandoned) rather than a single end-of-call score.

What breaks: models trained on product reviews fail on filler-heavy British English speech. "Fair enough," "not bothered," and "cheers" all confuse review-trained models: the first two are often negative signals in an outbound context, the third is positive. Sentence-level averaging over an entire transcript produces near-neutral scores for almost every call because early filler pulls the mean toward zero.

The counterpoint worth reading: CMU researchers showed acoustic features (pitch, speaking rate, energy) improve sentiment accuracy by around 12% on short dialogue turns over text-only models. For a weekly coaching report, text-only classification is sufficient. For real-time supervisor flagging, acoustic input warrants the added complexity.

Objection pattern detection: the three objections that kill 40% of conversions

Cluster prospect utterances from failed calls using TF-IDF vectorisation, then k-means (k=10–15). In our SaaS booking campaign, three clusters accounted for 41% of non-converted calls:

Cluster Representative utterances % of failed calls
Trust / identity "who gave you my number", "how did you get this number", "who is this calling from" 22%
Timing "not a good time", "call me back", "I'm in a meeting right now" 12%
Already sorted "we use X already", "we've sorted that", "happy with what we've got" 7%

Label each call_records row with its dominant objection tag using an LLM classification call. The prompt we use:

{
  "model": "gpt-4o",
  "messages": [
    {
      "role": "system",
      "content": "Classify objections in outbound sales call transcripts. Label with zero or more types from: [trust_identity, timing, competitor, price, no_decision_maker, no_interest, already_solved]. Return JSON only: {\"tags\": [...], \"primary\": \"...\"}."
    },
    {
      "role": "user",
      "content": "Prospect turns only:\n{{prospect_turns_joined}}"
    }
  ],
  "response_format": { "type": "json_object" }
}

Running this across 10,000 calls at average 480-token inputs costs approximately £19 at current GPT-4o pricing. Once tagged, track how each flow change shifts the objection distribution week on week.

How sub-second latency gaps line up with call abandonment

Retell logs per-turn timestamps in the call detail record. VAPI does the same. Extract the gap between each agent end_time and the following prospect start_time. This silence gap, not the provider's reported processing latency but the perceived pause the prospect experiences, is the metric that matters.

Plot a histogram of silence gaps against call outcome. In every campaign we have measured, the pattern is consistent:

  • Gaps under 400ms: no statistically significant effect on abandonment at that turn
  • Gaps 400–800ms: 8–14% higher hang-up rate at that turn compared to sub-400ms calls
  • Gaps above 1.2 seconds: 31% hang-up rate at that specific turn, independent of what was said

This latency does not appear in provider dashboards. A Retell call can complete without error while a specific turn hit 1.4 seconds. The dashboard reports aggregate call status, not per-turn silence. Transcript timestamps tell you exactly which turn is slow and how often it exceeds threshold.

From this data you can build a targeted fix: identify the top three most-travelled branches, pre-generate their TTS audio, and cache it. The implementation detail is covered in our TTS caching for voice agents post. The latency data tells you which branches justify the caching overhead.

See also voice agent monitoring and alerting for how to wire real-time latency alerts that fire before your weekly report.

The weekly coaching report that shows where the call flow loses calls

The weekly coaching report runs every Monday at 07:00 UTC from a scheduled n8n workflow. It queries Postgres, pulls the top objection clusters for the week, computes sentiment drift, flags any turn-latency spikes, and generates a plain-English summary. The output lands in Slack:

Week of 18 Aug 2026 — Campaign: SaaS-Booking-UK

Total calls: 1,847 | Conversion: 16.2% (+2.1pp vs prev week)
Avg turns (converted): 9.1 | (abandoned): 4.3

Top objections this week:
  1. trust_identity  19% of failed calls (↓3pp)
  2. timing          14% of failed calls (↑2pp)
  3. already_solved   6% of failed calls (—)

Latency alert: Turn 4 ("confirm-interest") avg gap 1,100ms (threshold 800ms)
  → 34 calls hit >1,500ms. Likely TTS cache miss on this branch.

Sentiment: 112 calls went positive→negative by turn 5.
  → Review opener phrasing on the "warm-intro" branch.

No dashboard login needed. The analyst spot-checks the five calls the report flags by name, not 200 calls at random. This structure replaces 45 minutes of weekly call review per ops lead and surfaces only the decisions that need a human.

Building call analytics software in n8n: ingestion, scoring and delivery

The pipeline runs in four stages. If you would rather not build it yourself, this is the kind of pipeline our custom AI agents work covers.

Ingest. Retell fires a call_ended webhook to n8n. The workflow fetches the full call object, writes raw JSON to S3, and inserts a skeleton row in Postgres with scored=false.

Score. A second n8n workflow polls for scored=false rows every five minutes. It fetches the S3 transcript, calls GPT-4o for objection tagging, runs the sentiment scorer (a Flask container on Fly.io exposed as an HTTP function), computes per-turn latency from the timestamps, and updates the row to scored=true.

Aggregate. A Monday 07:00 UTC cron job runs the weekly SQL aggregation and writes a summary row to a weekly_reports table.

Deliver. The cron triggers a Slack message via webhook. A Looker Studio connector reads from a Postgres view for a persistent dashboard, though in practice ops leads use the Slack push 90% of the time and the dashboard only for quarterly reviews.

Infrastructure cost at 10,000 calls/month: approximately £28 (S3 + Postgres + GPT-4o scoring). Full comparison of ASR cost trade-offs is in our guide to Deepgram vs Whisper vs AssemblyAI for UK voice agents.

For quality gate automation on top of this pipeline, see how we structure voice agent QA scorecards to feed scored calls into human review queues.

Retell, VAPI and Deepgram now ship conversation intelligence APIs

The biggest shift in 2025–2026: Retell and VAPI both added structured post-call analysis endpoints. Retell's call_analysis object now returns configurable boolean and text extraction fields without a separate LLM call. You define the extraction schema in the agent config; Retell runs it after every call and includes the results in the webhook payload.

For AI call transcription analysis, Deepgram's Audio Intelligence API now returns sentiment, topics, and intent detection in a single transcription pass. Running Deepgram STT plus Intelligence costs less than running Whisper followed by a separate NLP model, and batch processing speed is materially faster.

If you are building a new pipeline today, use Retell's native call_analysis for standard objection fields and end-call sentiment, and reserve GPT-4o for the weekly narrative summary and edge-case tagging. Combined pipeline cost drops by roughly 60% compared to an all-LLM approach.

What has not changed: provider dashboards still do not expose per-turn silence gaps. That analysis still requires transcript timestamp extraction.

Three analytics approaches and what each revealed about a real campaign

Good: Postgres + S3 + weekly Slack report

Campaign: UK SaaS booking agent, 10,000 calls, six weeks. What it revealed: the trust-signal failure above, invisible until cluster analysis. One flow state change delivered +9pp conversion. Cost: £31/month all-in. Build time: five days including the n8n pipeline, scoring container, and Slack template.

Bad: Real-time sentiment dashboard

We spent three weeks building a live Grafana dashboard updated per call. The problem: individual call sentiment is too noisy for real-time actioning. Ops leads saw a negative-sentiment spike with no context for whether it was one difficult call or a systemic pattern. They stopped looking at it within two weeks. Weekly aggregates are actionable. Per-call real-time scoring is not, unless a human supervisor immediately reviews flagged calls, which costs more than the insight is worth at SME scale.

Ugly: Off-the-shelf conversation intelligence platforms

We evaluated two established conversation intelligence SaaS tools, the speech analytics software and call centre analytics software category, for a mid-market UK campaign. Both required audio file upload rather than transcript JSON. Neither had a Retell webhook integration. Workflow: manual export, upload, wait four hours, log into their dashboard. Pricing for our call volume: £1,100–1,400/month.

The Postgres plus n8n approach at £28/month produced more targeted output. The lesson: these platforms are designed for human sales rep workflows inside Salesforce-heavy enterprise stacks. Voice agent call data has a different shape: structured turn-by-turn JSON, machine-generated turns mixed with human turns, high volume, low average duration. Build for your data, not the platform's assumptions.

The full story of how our voice AI and document analysis work fits together is in the Voice AI & Doc Analysis portfolio case study.

FAQ

How do you store and query 10,000 voice agent call transcripts without a dedicated analytics platform?

Write raw transcript JSON from Retell or VAPI to S3, one file per call. Then maintain a Postgres table of queryable metadata per call: duration, outcome, turn count, objection tags, sentiment score, and an s3_path pointer. For full-text search, run a nightly job that loads transcript content into a ts_vector column. At 10,000 calls per month, a Postgres instance on Fly.io ($7/month) and standard S3 storage (~$1.20/month for JSON) handles the load without any dedicated analytics platform. Query with standard SQL against the metadata table; pull raw transcripts from S3 only when you need utterance-level detail.

Which sentiment analysis models work reliably on short, conversational call transcripts?

RoBERTa variants fine-tuned on dialogue corpora outperform VADER and sentence-level BERT on short call turns. Specifically, cardiffnlp/twitter-roberta-base-sentiment-latest handles three-to-eight word utterances better than models trained on review text. The key adjustment is to weight turns after turn 5 more heavily in aggregated scoring. Early turns contain filler that dilutes the signal. Deepgram's Intelligence API now returns utterance-level sentiment as part of the transcription pass, which simplifies the pipeline if you are already using Deepgram for ASR. Avoid doc-level averaging; use trajectory scoring to track how sentiment moves across a call.

What metrics should a weekly voice agent analytics report include?

The seven metrics that drive decisions: conversion rate with week-on-week delta, average turn count split by outcome (converted vs abandoned), top three objection clusters with percentage share and trend direction, per-turn silence gap averages (flag any turn above 0.8 seconds), sentiment trajectory classification (positive-to-negative, neutral-to-abandoned, etc.), script branch coverage (which flow paths were taken and which were never reached), and a call volume and answer-rate breakdown by time slot. Anything beyond these seven tends to be noise at SME scale. The report should land in Slack, not require a dashboard login.

Can post-call transcript analysis reveal latency problems that do not show in Retell or VAPI dashboards?

Yes, reliably. Retell and VAPI dashboards report overall call status and aggregate latency, not per-turn silence gaps. A call can complete without error in the dashboard while specific turns hit 1.4 seconds of silence, enough to drive a 31% abandonment rate at that turn. To detect this, extract the agent end_time and prospect start_time from each turn in the call detail record, compute the gap, and plot a histogram by turn number and campaign. Gaps above 800ms warrant investigation; gaps above 1.2 seconds are typically TTS cache misses on high-frequency branches. This is not visible in any provider dashboard we have tested.

Related Reading

Voice agent QA scorecards: how to grade conversations at scale

Voice agent QA at scale isn't about average scores; it's about a weighted scorecard that catches the failure modes that

Voice Agent A/B Testing: Script Experiments That Ship

Script A/B experiments for voice agents: the test harness, sample sizes, and the 3 variables that shift conversion rates

Find out where your voice agent is losing calls

Book a 30-minute call. We map your stack, your constraints, and where AI will pay back fastest.

Book a meeting →

Or read about our Custom AI Agents service and pricing.

© 2026 Quantum Automations Group Ltd
Home Blog Portfolio Privacy Terms Security