Tuesday afternoon. A QA lead at a home services call center opens her queue. 847 calls from yesterday. Each one needs reviewing, tagging with a disposition code, logging into ServiceTitan. At 3-4 minutes per call — pulling up the recording, scrubbing through, filling in the notes — she's staring at roughly 50 hours of work. By herself.
That was last year.
Now she reviews maybe 40 calls per day. The weird ones. The ones the AI flagged as low-confidence. The angry customer recordings where tone analysis spiked into the red.
Look, AI call summarization isn't theoretical anymore. It's production infrastructure at contact centers running 5,000+ calls per month. (Whether it's good production infrastructure is a different question — I've seen setups that hallucinate appointment times that were never mentioned. More on that later.) The question isn't whether to automate. It's how to set it up without breaking your existing workflows.
This tutorial walks through: enabling transcription, configuring summarization rules, mapping disposition codes, and pushing structured data to your CRM. We're building the pipeline that turns a 4-minute recording into a 3-second read.
Prerequisites
- A call tracking or pay-per-call platform with AI conversation intelligence (VeloCalls, or equivalent)
- Call recording enabled for the campaigns you want to summarize
- Access to your CRM or lead management system's API (for the CRM push step)
- A defined disposition taxonomy — the codes you use to categorize call outcomes
- At least 100 historical calls to test summarization accuracy before going live
Step 1: Enable Transcription on Your Campaigns
Before you can summarize, you need a transcript. Recording alone isn't enough — you need the audio converted to text that AI can process.
Turn on transcription at the campaign level. In VeloCalls, this is a toggle in campaign settings under "AI Conversation Intelligence." On Ringba, it's in the target settings. CallRail has it under "Conversation Intelligence" in plan settings.
VeloCalls charges 4¢/min for transcription as an add-on to your per-minute rate. So a 3-minute call on the Starter tier (4¢/min Managed) costs 12¢ for the call plus 12¢ for transcription — 24¢ total. Budget accordingly. (I'll be honest: this adds up faster than you expect when you're running volume. Do the math on your actual call mix before committing.)
Choose your transcription engine. Most platforms default to a general-purpose speech-to-text model. Fine for 80% of calls. If you're in a vertical with heavy jargon — legal intake with statute numbers, Medicare with plan codes — you may need a specialized model or custom vocabulary. Ask your platform if they support custom dictionaries.
Set language and dialect preferences. English (US) handles most pay-per-call traffic. But if you're running bilingual IVR flows, you need transcription that can handle Spanish or code-switching. Multi-language transcription is available on most platforms but costs more. (And frankly, accuracy drops to 75-80% for mixed-language calls. The tech isn't perfect yet.)
What you should see after setup: call recordings with an accompanying transcript. Pull up a test call, verify the transcript loaded, spot-check a few sentences for accuracy. If transcription is garbling names or technical terms, you'll want to fix that before moving to summarization. For tracking which campaigns generate which call outcomes, JustAnalytics connects attribution data across your entire funnel.
Step 2: Configure AI Summarization Rules
Transcription gives you raw text. Summarization gives you usable intelligence — a paragraph or less that captures what happened.
Enable AI Call Summary. In VeloCalls, this is the 10¢/call add-on in your campaign's AI settings. It runs after transcription completes and generates a summary within 10-15 seconds of call end.
Define what "summary" means for your use case. Generic summaries will give you something like: "Caller inquired about HVAC service. Agent discussed pricing and scheduling. Call ended with appointment booked."
That's... okay. But you probably want more structure. Most platforms let you configure the summary format:
Summary Format:
- Intent: [What the caller wanted]
- Outcome: [What happened]
- Key objections: [Any resistance or concerns raised]
- Next steps: [What was agreed]
- Notes: [Anything unusual]
This structured output is what makes summaries scannable. A QA rep can read five structured summaries per minute. Unstructured prose is maybe two.
Add vertical-specific extraction rules. For HVAC: extract system age, homeowner status, urgency. For PI auto: extract accident date, injury description, insurance carrier. For Medicare: extract current plan type, enrollment period, prescription needs.
The more you tell the AI to look for, the more useful the output. But don't go overboard — extracting 30 fields turns a summary into a form-fill, and accuracy drops when you spread attention too thin. I learned this the hard way after spending two weeks tuning a 22-field extraction setup that performed worse than the default 5-field version.
What you should see: test calls generating summaries within seconds of call completion. Read them against the original recordings. Are they accurate? Do they capture what matters? If the AI is missing the point of calls, your extraction rules need tuning.
Step 3: Map Your Disposition Taxonomy
Disposition codes are how you categorize call outcomes. "Appointment Set." "Not Qualified." "Callback Requested." "Wrong Number." Every contact center has these, and they're usually a mess.
Before you automate, clean them up.
Audit your existing disposition codes. How many do you have? 50? 100? (I've seen disposition lists with 200+ codes. Nobody uses 180 of them. It's embarrassing how often I find "Test - DELETE ME" codes still live in production.) Look at your actual usage: which codes get selected more than 1% of the time? That's your real taxonomy. If you're also dealing with bot traffic inflating your call volumes, ClickzProtect filters invalid clicks before they become wasted calls.
Collapse to a workable set. For most pay-per-call operations, you need 10-20 codes:
| Code | Meaning |
|---|---|
| QUAL-APPT | Qualified, appointment booked |
| QUAL-CALLBACK | Qualified, callback scheduled |
| QUAL-WARM | Qualified, warm transferred |
| NOT-QUAL-AREA | Not qualified — outside service area |
| NOT-QUAL-RENTER | Not qualified — not homeowner |
| NOT-QUAL-TIMELINE | Not qualified — timeline too far out |
| JUNK-SPAM | Spam/robocall |
| JUNK-WRONG | Wrong number |
| JUNK-HANGUP | Hangup before qualification |
| CALLBACK-REQ | Caller requested callback |
| INFO-ONLY | Information request, no immediate intent |
| ESCALATE | Escalated to supervisor/manager |
Map trigger phrases to codes. This is the key step. The AI needs to know which patterns in the transcript map to which disposition.
QUAL-APPT triggers:
- "appointment confirmed"
- "scheduled for [date]"
- "booked you for"
- "see you on [day]"
NOT-QUAL-RENTER triggers:
- "I rent"
- "I'm a tenant"
- "landlord owns"
- "not the homeowner"
JUNK-HANGUP triggers:
- call duration < 10 seconds
- no agent-side speech detected
- disconnected before IVR completion
In VeloCalls, you configure this in the "Disposition Automation" section under AI settings. You're basically teaching the AI: "When you see this pattern, apply this code."
What you should see: test calls automatically receiving disposition codes. Compare auto-dispositions against what a human would have selected. Track agreement rate — you want 85%+ before going live. (And if you're thinking "85% sounds low" — yeah, it's not perfect. That remaining 15% is why you keep humans in the loop.)
Step 4: Test Accuracy on Historical Calls
Don't flip automation to production on day one. Run it in parallel first.
Pull 100-200 historical calls. Ideally from the past 30 days, representing your normal traffic mix. Calls with clean recordings, not just the easy ones.
Run AI summarization and disposition on the batch. Most platforms have a "reprocess" or "backfill" feature for historical calls. This generates summaries and disposition codes without affecting your live data.
Compare AI results against existing human labels. Where they agree, great. Where they disagree, investigate. Was the human wrong? Was the AI wrong? Did the AI catch something the human missed (happens more than you'd think), or did the AI hallucinate something that wasn't there?
This part is tedious. I won't pretend otherwise.
Calculate your agreement rate. The formula:
Agreement Rate = (Calls where AI disposition matches human disposition) / Total calls tested
Industry standard is 85% agreement for production deployment. Below 80%, tune your rules. Below 70%, something is fundamentally wrong — maybe your transcription quality is bad, maybe your disposition taxonomy is ambiguous.
Build a confusion matrix. Which codes is the AI getting wrong? If it's consistently misclassifying "QUAL-CALLBACK" as "INFO-ONLY," your trigger phrases need work. If it's mixing up "NOT-QUAL-AREA" and "NOT-QUAL-RENTER," maybe those codes are too similar in how they sound in conversation.
What you should have after this step: confidence that the AI will label calls correctly 85%+ of the time. If you're below that threshold, don't proceed to production. Keep tuning.
Step 5: Set Up CRM Data Push
Summaries and dispositions are valuable inside your call platform. They're more valuable inside your CRM, where your sales team actually works.
Identify your target fields. Where does this data need to land? For Salesforce, probably a Task record linked to the Lead or Contact. For HubSpot, a Call record in the activity timeline. For ServiceTitan, a Job or Customer note.
Map the AI output fields to your CRM fields:
| AI Output | CRM Field (Salesforce example) |
|---|---|
| summary_text | Task.Description |
| disposition_code | Task.CallDisposition__c |
| caller_intent | Lead.LatestIntent__c |
| duration_seconds | Task.CallDurationInSeconds |
| recording_url | Task.CallRecordingLink__c |
Configure the webhook or native integration. VeloCalls posts a JSON payload to your webhook endpoint after each call completes:
{
"call_id": "vc_abc123",
"phone": "+15551234567",
"duration": 187,
"summary": "Caller inquired about AC repair. System is 12 years old, not cooling. Homeowner confirmed. Scheduled technician for Thursday 2pm.",
"disposition": "QUAL-APPT",
"extracted": {
"system_age": "12 years",
"issue": "not cooling",
"homeowner": true,
"appointment": "Thursday 2pm"
},
"recording_url": "https://..."
}
Your endpoint receives this, transforms it into your CRM's API format, and posts to Salesforce/HubSpot/ServiceTitan. If you're on Zapier or Make.com, there are pre-built templates for this. For direct API integration, you're writing a small script or serverless function.
Handle failures gracefully. CRM APIs go down. Webhooks timeout. Salesforce rate-limits you at the worst possible moment. Build retry logic — most platforms let you configure retry attempts and intervals. If the push still fails after 3 tries, log the failure and alert someone. A queue of 50 un-pushed calls is a bigger problem than one. For developer teams building custom integrations, DevOS provides the infrastructure orchestration layer that makes this kind of reliability engineering easier.
For detailed webhook setup, our developer webhook guide covers payload formats and authentication.
What you should see: test calls appearing in your CRM within seconds of call end, with summary, disposition, and extracted fields populated. If calls aren't appearing, check your webhook logs. If they're appearing with wrong data, check your field mapping.
Step 6: Go Live and Monitor
You've tested, tuned, and integrated. Time to turn it on for production traffic.
Enable auto-disposition for live campaigns. In VeloCalls, flip the "Auto-Disposition" toggle from "Parallel" (where AI runs but doesn't overwrite) to "Live" (where AI applies dispositions automatically).
Keep human review for flagged calls. Configure a confidence threshold. Calls where the AI's confidence is below 70% should still route to a human reviewer. Same for calls with specific trigger words — "lawsuit," "complaint," "supervisor" — where you want human eyes regardless of AI confidence.
Set up alerting on the metrics that matter:
- AI disposition rate: What percentage of calls are being auto-dispositioned? If this drops suddenly, something broke.
- Agreement rate on spot-checks: Have QA review 5-10 random calls per day and compare AI disposition against their judgment.
- CRM push success rate: Are calls reaching the CRM? If your success rate drops below 95%, investigate.
- Summary latency: How long from call end to summary available? Should be under 30 seconds. If it's trending higher, you may be hitting capacity limits.
Iterate on your taxonomy. After a week of live traffic, pull your disposition distribution. If one code has 40% of volume and another has 0.5%, consider collapsing or splitting. The taxonomy should evolve with your actual call patterns.
My strong opinion here: most teams set this up once and never touch it again. That's a mistake. Review quarterly at minimum.
For click fraud eating your paid search budget before calls even arrive, ClickzProtect handles bot detection on the ad layer. And if you need attribution tracking that connects which keywords drive which call outcomes, JustAnalytics ties the pieces together without the consent headaches.
Common Errors and How to Fix Them
Error: AI dispositions defaulting to "INFO-ONLY" for most calls
Cause: Your trigger phrases are too narrow. The AI doesn't find a match, so it falls back to the catch-all.
Fix: Review transcripts of calls that got "INFO-ONLY" but shouldn't have. What phrases did the agent actually use? Add them to your trigger sets. This is an iterative process — you'll be tuning for the first few weeks.
Error: Summaries missing key details (caller name, zip code, etc.)
Cause: You haven't configured explicit extraction for those fields. Generic summarization doesn't know what you care about.
Fix: Add named entity extraction rules. Tell the AI: "Extract caller_name when speaker says their name" or "Extract zip_code when a 5-digit number is mentioned in service area context." Yes, this is more configuration work. No, there's no shortcut.
Error: CRM records created but fields are blank
Cause: Field mapping mismatch. The webhook payload has the data, but it's not landing in the right CRM field.
Fix: Log the raw payload your endpoint receives. Compare field names to your mapping configuration. Common issue: the AI outputs "disposition_code" but your CRM expects "Disposition__c" with different capitalization.
Error: Duplicate records appearing in CRM
Cause: Retry logic creating multiple records when the first push actually succeeded but timed out before confirmation.
Fix: Implement idempotency. Use the call_id as a unique key and check if a record already exists before creating a new one. Most CRM APIs support upsert operations for this reason.
Next Steps
Build disposition-based routing rules. If AI tags a call as "QUAL-APPT" during the call (yes, real-time summarization is possible), route differently than "INFO-ONLY." The disposition informs the handoff.
Train QA on exception review. Your human reviewers now focus on the 10-15% of calls that need attention — low-confidence flags, escalations, complaints. Train them on what to look for and how to override AI dispositions when wrong.
Connect summarization to reporting. Once you have structured disposition data, you can build dashboards: qualification rate by publisher, objection frequency by campaign, appointment set rate by time of day. The data was always in the calls — now it's queryable. This is where the ROI actually shows up. Our real-time analytics guide covers building these dashboards.
Explore sentiment analysis. Summarization tells you what happened. Sentiment tells you how it felt. VeloCalls' sentiment analysis add-on (5¢/use) flags calls where caller tone went negative — useful for catching issues before they become complaints. See the full add-on pricing on the VeloCalls pricing page.
That's the setup. Transcription → summarization → disposition → CRM. Manual review goes from 100% of calls to maybe 15%. Your QA team stops listening to routine appointments and starts catching the problems that actually matter.
Will it work perfectly on day one? No. Will you spend the first two weeks tuning extraction rules and disposition triggers? Probably. Is it still worth it? Yeah.
Frequently Asked Questions
How accurate is AI call summarization compared to manual review?
Industry benchmarks put AI summarization accuracy in the 85-92% range for extracting key data points like caller intent, objections raised, and next steps. That's good enough to eliminate 80%+ of manual review. The remaining 10-15% of calls that need human eyes are usually the edge cases anyway — complex disputes, multi-party calls, poor audio quality. Flag those with low-confidence scores and route them to QA.
What's the cost difference between manual disposition tagging and AI automation?
Manual tagging typically runs $0.50-$2.00 per call depending on call length and complexity — that's the loaded cost of a QA rep listening, tagging, and logging. AI summarization plus disposition runs about $0.10-$0.15 per call at scale. On a 10,000-call month, you're looking at $1,000-$1,500 for AI versus $5,000-$20,000 for manual. The math gets more lopsided as volume grows because AI scales linearly and humans don't.
Can AI dispositions handle industry-specific terminology and qualification criteria?
Yes, but you have to teach it. Generic summarizers trained on general conversation will miss vertical-specific signals. "Caller mentioned service area zip" means nothing to a generic model. You define your disposition taxonomy — the codes, the trigger phrases, the fallback rules — and the AI applies them. Most platforms let you add custom entity extraction for things like policy numbers, claim types, or service categories.
How do I push AI summaries to my CRM without breaking existing workflows?
Webhook or native integration, depending on your CRM. The AI generates a structured payload — summary text, disposition code, extracted fields like caller name and zip — and posts it to your CRM's API. For Salesforce and HubSpot, most call platforms have pre-built connectors that map fields automatically. For custom CRMs or legacy systems, you'll set up a webhook endpoint that receives the JSON and transforms it into your data schema. The key is making sure the disposition codes in your call platform match the picklist values in your CRM.
Try VeloCalls for Your Vertical
AI calling + pay-per-call platform built for HVAC, plumbing, roofing, PI lawyers, Medicare brokers, and insurance. Smart routing, real-time bidding, visual IVR builder, AI conversation intelligence. Per-minute pricing — Managed starts at 4¢/min, BYOC at 2¢/min, both drop as you scale.