Call QA desk that scores recordings against your own rubric

By General Input

Open one desk each morning to see every call recording scored against your rubric, with quotes as evidence, and nothing saved until you agree.

Integrations

  • Google Gemini
  • Google Drive
  • Google Sheets
  • Slack Bot

Type

App

Categories

  • Customer Support
  • Sales

Build me a call QA desk that my support and sales leads open every morning. Our calls are recorded by our phone system and land as audio files in a Google Drive folder, and nobody has time to listen to them, so they go unreviewed. The app should turn that folder into a review queue where every call arrives with a scorecard already drafted against our own rubric, a human agrees with it or corrects it, and only then does anything get recorded or sent. The integrations are Google Drive for the recordings, Google Gemini for the scoring, Google Sheets for our QA register, and Slack Bot for coaching notes.

The landing view is the call list. Use Google Drive List Files scoped to a configured folder to list every recording, showing the rep, the call date, and the duration. Read date and duration from the file metadata List Files returns, and fall back to the file's created time when duration is not available. Match recordings to reps by convention, either a subfolder per rep or the rep name embedded in the file name, and make that rule configurable in settings with an Unmatched group for anything the rule could not assign, so no call silently disappears. Every row carries a QA status of not scored, draft, or saved. Give me filters by rep, by date range, and by status, and default the view to calls that still need a review, because the whole point is that the backlog is visible.

The rubric is the heart of this app and it lives in the app as editable data, not in code. A QA lead opens a rubric editor and manages a list of criteria, each with a name, a short description of what good looks like, a scoring scale, and a weight. Seed it with greeting, discovery questions, objection handling, whether a next step was booked, and the required compliance line, but every one of those must be editable, removable and reorderable, and new criteria must be addable without a developer. Weights roll up into a weighted total on each scorecard. Version the rubric so a scorecard saved last month keeps the criteria and weights it was actually judged against, and changing the rubric today never silently rewrites history. Show which rubric version a saved review used.

Scoring a call is a background job kicked off from the call row. The handler downloads the audio with Google Drive Download File Content, sends those bytes to Google Gemini Upload File to put the recording in the Files API, then polls Google Gemini Get File until the file state turns from PROCESSING to ACTIVE, and only then calls Google Gemini Generate Content with a reference to that file plus the current rubric. Getting this order right matters: calling Generate Content against a file still in PROCESSING fails, and a state of FAILED needs a visible error on the row with a retry rather than an empty scorecard. Use the Files API rather than inlining the audio, because call recordings routinely exceed the inline request size limit. Uploaded files are only retained for about 48 hours, so treat the file reference as short lived, persist the returned scorecard rather than the file handle, and re-upload if a call needs scoring again. Ask Gemini for structured output: for each criterion in the rubric, a score on that criterion's scale, a one line reason, and one or more verbatim quotes from the call with their timestamps.

Opening a call shows the scorecard, labelled a draft in a way nobody can miss until a human saves it. Each criterion is a row showing the drafted score, the one line reason, and the timestamped quotes underneath as the evidence, so the reviewer is checking a claim against what was actually said instead of trusting a number. The reviewer can override any score, and when they do, show the original drafted score beside the override so the disagreement stays visible. There is a free text note per call, which is what gets sent to the rep, and a weighted total that recalculates live as scores change. Nothing on this page writes to Google Sheets or Slack. Persist the draft so a reviewer can leave a call half reviewed and come back to it.

Saving is the commit step and it does two things. It appends a row to our QA register with Google Sheets Append Values: the call date, the rep, the call name, each criterion's final score, the weighted total, whether any score was overridden, the reviewer, and the rubric version. Then it sends the rep their coaching note in Slack, using Slack Bot Look Up User by Email to resolve the rep to a Slack user, Slack Bot Open a Conversation to open the direct message, and Slack Bot Send a Message to send it. The message carries the reviewer's note plus the final scores, written as coaching rather than as a verdict. Let an admin choose in settings whether notes go to the rep as a direct message or to a team channel. If a rep has no matching Slack user, save the review anyway and flag the delivery failure on the row instead of losing the review.

Add a Coach this rep button. It runs a background agent over that rep's last ten saved scorecards, the human approved ones and never the drafts, looking across calls rather than at any single one. The agent writes a coaching brief back into the app, filed against the rep, containing the patterns it sees, the criteria where the rep is consistently strong or weak, whether anything has moved since the last brief, and exactly two things for that rep to practise this week. Keep every brief with its date so a manager can open a rep and read the history before a one to one. Show progress while the agent is running, because reading ten calls takes time.

Two rules hold the whole app together. Scores are drafts until a human saves them, so the AI never puts a number on a person's record by itself. And the rubric is data a QA lead edits, so changing what we judge calls on never requires a developer. Keep the call list dense and scannable, because the daily job there is working a backlog down, and keep the scorecard page calm and readable, because the job there is judging one call carefully.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerA brand asset library your marketing team actually searchesTurn Mailjet email clicks into ranked HubSpot follow-upsClean out the Looker dashboards and Looks nobody opensStop cold emails to anyone with a live deal in PipedriveLiveKit live operations console for room moderationWake up dormant Keap leads with a researched reasoniMessage campaign console with pre-flight checks and delivery board