Home/Proof/VA Coaching System
Case Study

How I Built an AI That Coaches My VAs From Their Sales Calls

Every night, an AI listens to every sales call my virtual assistants made that day, scores each conversation on six dimensions, and writes a weekly coaching report. The hardest part of managing remote staff is knowing what's actually happening on the phone. Now I know.

Built for: My own cleaning company
VAs covered: 2
Conversations scored: 80-100/week

The Problem

I have two virtual assistants who handle the front line of my cleaning business. They answer inbound calls, follow up on missed calls, qualify leads, send quotes, book jobs, and handle customer issues. They generate most of my revenue.

I had no idea what they actually said on the phone. I could see how many calls they took, how fast they responded, and how many bookings they created. But I couldn't tell whether they were quoting prices over text instead of calling back, whether they were missing upsell opportunities, whether they sounded warm or robotic, or whether a customer who didn't book had a fixable objection.

Listening to even 10% of the calls myself would have eaten my entire week. I needed something that could listen to all of them and tell me what mattered.

What I Built

I built a nightly pipeline that pulls every call transcript from GoHighLevel, sends each one to Claude Opus 4.6 along with the related SMS thread, and gets back a structured score on six dimensions plus specific coaching notes that reference real moments from the conversation.

At 11 PM Eastern, the system fetches every transcript GHL recorded that day, batches them by VA and customer thread, runs the analysis, and stores the results in SQLite. A daily Telegram message tells me how each VA scored. A weekly synthesis runs every Sunday and produces a coaching report ranking the top three things each VA should work on.

The key insight is that the AI references specific moments in the conversation. Instead of "your follow-through could be better," it says "on the call with Carla at 2:14 PM you quoted prices via text instead of calling her back. She booked with a competitor 40 minutes later."

The 6 Scoring Dimensions

Responsiveness
How fast they replied to inbound messages and missed calls
Listening
Whether they understood what the customer actually needed
Sales
Whether they advanced toward booking or just answered questions
Professionalism
Tone, warmth, language, brand voice
Follow-through
Whether they did what they said they'd do
Phone discipline
Whether they called back instead of texting when calling was the right move

System Architecture

GHL Webhook (call complete)
Stores contact_id + messageId on Railway. Runs in milliseconds.
↓ wait until 11 PM ET
Sync transcript fetch
Pulls every transcript from GHL API. Synchronous, in main thread.
↓ only after every fetch completes
Opus 4.6 analysis
Scores each conversation on 6 dimensions. Returns structured JSON.
SQLite storage
Scores + notes + history
Daily Telegram
Per-VA scores + highlights
Dashboard view
7-day rollup
↓ every Sunday
Weekly synthesis
Top 3 coaching priorities per VA, week-over-week trends

The two-step sync architecture exists because background threads silently failed in production. Lesson learned the hard way.

A Real Example

Here's the kind of coaching note Opus produces. This is paraphrased from a real one:

VA: Julie · Customer: Carla M. · Score: 62/100 Strengths - Responded to inbound text within 4 minutes - Asked the right qualification questions about square footage Coaching moments - At 2:14 PM Carla asked for pricing. Julie quoted via text instead of calling back. Carla booked a competitor at 2:54 PM. - When Carla mentioned she had pets, Julie didn't mention the pet-friendly upcharge or ask about specific cleaning needs. - Sign-off was "Let me know!" instead of a clear next step. Top recommendation - Phone discipline: when a customer asks for pricing on a $300+ job, call them. Texting price is the #1 leak point in the funnel.

The Numbers

80-100
Conversations scored / week
Across both VAs
6
Scoring dimensions
Each scored 0-100
Nightly
Run time
11 PM ET, fully autonomous
~$0.10
Cost per analysis
Opus 4.6 API usage

Cost Comparison

The traditional way to coach a sales team is to have a senior person listen to call recordings and write notes. That doesn't scale and it doesn't happen.

Sales CoachManual ReviewThis System
Monthly cost$3,000-8,00020-30 hours of your time~$30 in API
Coverage5-10% of calls5-10% of calls100% of calls
Specific moment referencesSometimesSometimesAlways
Trends over timeManualManualAutomatic
Time to first report1-2 weeksWeeklyDaily

Tech Stack

GHL API
Call transcripts + SMS threads
Opus 4.6
Conversation analysis and scoring
Railway
Always-on pipeline + persistent volume
SQLite
Score history + coaching notes
Telegram Bot API
Daily + weekly delivery
Python
Pipeline orchestration

What It Took

The hardest bug took eight hours to debug. Background threads in Python were silently failing on Railway when fetching transcripts from the GHL API. Same token, same URL, same messageId. The synchronous version worked. The threaded version returned empty. I never found the root cause.

The fix was to stop fighting it and refactor the architecture: do all the transcript fetching synchronously in the main thread first, then run the analysis only after every fetch completes. Slower, but reliable.

The other big lesson was max_tokens. On busy days the response was getting truncated mid-JSON because the default limit was too low. Bumping it to 16,384 fixed the silent failures on high-volume days.

Want this for your team?

Works for VAs, SDRs, customer success reps, support agents, anyone who talks to customers. If you record calls, this can listen to them.

Book a Strategy Call

Free, 30 minutes. No pitch deck.