Call Quality
Call quality analysis pulls transcripts from your recording platform, scores each call against a free-form rubric using AI, and surfaces a per-call quality score plus notable moments. Headline metric: avg_quality_score. Supported platforms: Aircall (phone), Microsoft Teams (video), Zoom (video).
This feature is opt-in per org and requires a consent attestation before any transcripts are processed. Internal team meetings are never analyzed.
What we pull
For each customer-facing call in the cycle window:
- Transcript — the full spoken text, fetched from the provider (Aircall Transcripts add-on, Teams meeting transcript via MS Graph, Zoom cloud recording VTT)
overall_quality_score— 0–100 score produced by the AI rubric evaluationcriteria— per-criterion scores from the rubric (count stored; individual criteria surfaced in theCallRecordingrow)notable_moments— up to 5 extracted moments from the transcript flagged as notable by the rubric (positive or negative)duration_sec— call duration from the provider
Each analyzed call creates two rows: a CallRecording row (full transcript + analysis JSON, accessible to managers) and a summary RawSignal(source="phone_quality") row that feeds into baselines and the review prompt.
The ingester processes at most 50 calls per employee per sync to bound AI token costs.
Internal meeting carve-out
For Teams and Zoom, a meeting is only eligible for analysis if at least one attendee's email domain is outside your organization's domain set. Internal-only meetings — where every participant shares an org email domain — are filtered out at the adapter level and never sent to the analyzer.
Aircall calls are always considered customer-facing by nature (the org is on one side; an outside number is on the other).
Teams guest access. Participants who join Teams meetings without an Azure AD account appear without an email. These are treated as external by default — a Zoom guest joining anonymously is more likely a customer than a colleague.
Connecting
Step 1: Enable call quality for your org
Go to Settings → Call Quality. Toggle Enable call quality analysis and complete the consent attestation confirming your org complies with applicable call recording and consent laws. The feature won't activate until the attestation is saved.
Step 2: Connect the recording platform
Aircall
Uses the same API credentials as the base Phone integration. Transcripts require Aircall's Transcripts add-on (available on Growth plans and above). Without it, the ingester finds transcripts on zero calls.
Microsoft Teams
Uses the same per-employee MS Graph OAuth token as the email integration, but requires an additional scope: OnlineMeetingTranscript.Read.All. If your org connected MS Graph before this scope was introduced, employees need to re-consent. The scope must also be granted by your tenant admin for delegated use.
Zoom
Requires a Server-to-Server OAuth app in the Zoom Marketplace with the following scopes:
cloud_recording:read:list_user_recordings:adminmeeting:read:list_meetings:admin
From the Zoom app, copy the Account ID, Client ID, and Client Secret into the Zoom card on /admin?tab=integrations.
Step 3: Map provider user IDs
Each employee needs their user ID in the relevant platform mapped in the integration card (same as the base phone integration for Aircall; MS Graph uses the Azure AD userPrincipalName; Zoom uses the Zoom user email or user ID).
What hits a review
[CALL QUALITY DATA]
avg_quality_score: 74
calls_analyzed: 23
calls_no_transcript: 4
score_distribution: {"<60": 2, "60-79": 11, "80+": 10}
notable_moments: ["Strong objection handling on pricing call 2026-04-14",
"Missed discovery question on renewal call 2026-04-21"]
Troubleshooting
"Zero calls analyzed"
- Consent attestation not completed. The ingester checks
org.call_quality_enabledandorg.call_quality_consent_attested_atbefore processing anything. Both must be set. - Transcripts add-on not active (Aircall). Aircall's transcript endpoint returns 404 for calls on plans without the add-on. The ingester counts these as
skipped_no_transcript. - Teams scope not re-consented. If employees connected MS Graph before
OnlineMeetingTranscript.Read.Allwas added to the OAuth flow, they won't have the scope. Re-authentication in Profile → Connected accounts fixes it. - Zoom recordings not cloud-recorded. Zoom transcripts only exist for meetings recorded to the cloud. Local recordings don't produce a transcript file. Ensure cloud recording is enabled in your Zoom account settings.
"All calls marked as internal (Teams / Zoom)"
The internal/external classification reads participant email domains and compares them against your org's domain set (derived from active employee emails). If your org uses multiple email domains and not all are represented by active PerfCopilot employees, external participants may be misclassified as internal. Add employees with the other domain to PerfCopilot to expand the domain set.
"Quality score seems wrong"
Scores are produced by the AI rubric and depend entirely on your call quality rubric (set in Settings → Call Quality). A vague rubric produces vague scores. Be specific: list criteria, what "good" looks like for each, and how much each should weigh. Regenerating scores after a rubric change is not automatic — re-run the sync for the relevant employees.
Privacy notes
- Transcripts are stored in the
call_recordingstable. They are accessible to managers and org admins in the call detail view. - Employees are not notified by PerfCopilot when a call is analyzed. Your organization is responsible for complying with applicable call recording consent laws (e.g. two-party consent states in the US, GDPR Article 6 in the EU).
- Internal meeting analysis is explicitly not possible — the internal carve-out is enforced at the adapter level, not a policy setting. It cannot be turned off.
- Call transcripts are sent to the PerfCopilot AI pipeline (Claude) for scoring. They are not used to train models.