QA Analysis
A QA node runs a language model over the transcript after the call ends and writes structured results onto the run. Nobody listens to anything; the review happens whether or not you look at it.
Every agent is created with one, so for a new agent there is nothing to set up — review is already running, and the switch under Analysis is how you turn it off. Agents created before this became the default have no node; add one on the canvas, or use that same switch, which adds it for you.
It sits off to the side of the conversation — no incoming edges, no outgoing edges, nothing to connect.
What it is for
Call QA is normally a person listening to a sample of recordings with a spreadsheet open. That scales to about one percent of calls and lags by a week. A QA node reviews whichever share you ask for, within a minute of the call ending.
Three things people actually use it for:
- Compliance. Did the agent give the disclosure? Did it state the interest rate? Did it stop when asked to? These are questions with defensible answers, and a per-call record of them is the difference between a policy and a control.
- Quality. Where did callers get confused, interrupt, or give up? Which node produces the most abandonment?
- Outcome tagging. A structured summary and disposition per call, without relying on the agent to extract it during the conversation.
Fields
namestringdefault: QA
Short label shown on the canvas and in run records.
qa_enabledbooleandefault: true
Switch the review off without deleting the node and losing its configuration.
qa_system_promptstring
Instructions to the reviewing model. Placeholders available: {node_summary},
{previous_conversation_summary}, {transcript}, {metrics}. Blank uses the
platform default.
qa_min_call_durationnumberdefault: 15
Calls shorter than this many seconds are skipped. A five-second wrong number has nothing to review and reviewing it costs the same as reviewing a real call.
qa_voicemail_callsbooleandefault: false
Whether to review calls flagged as voicemail. Off by default for the same reason.
qa_sample_ratenumberdefault: 100
Percent of eligible calls reviewed, 1–100. Below 100 the selection is random.
qa_use_workflow_llmbooleandefault: true
Review with the same model the agent runs on. Switch off to name a separate provider and model.
qa_provideropenai | azure | openrouter | anthropic
Provider for the review, when not using the workflow’s model.
qa_modelstringdefault: default
Model identifier, e.g. gpt-4o. Provider-specific.
qa_api_keystring
API key for that provider.
qa_endpointurl
Required for the Azure provider only.
What it costs, and how to control it
A QA pass is a language model call over a transcript, so it is not free and it scales with your call volume rather than with your team. It runs once per step the conversation actually reached, plus a short summary between steps, so a three-step call is roughly five completions on top of the call itself. Those tokens land on your bill the same way the call’s own do.
Three levers, in the order worth reaching for them:
Set a minimum duration
The default of 15 seconds already excludes wrong numbers and instant hangups. For outbound campaigns, 30 seconds excludes most of the calls that never became conversations.
Sample rather than review everything
For quality trends, 10–20% is plenty — you are looking for patterns, and a random fifth shows you the same patterns as the whole.
For compliance, keep it at 100. The point of a compliance control is that it applies to every call; a sampled one tells you what probably happened.
Review on a cheaper model than you talk on
Switch off Use Workflow’s LLM and name a smaller model. Reviewing a transcript against fixed criteria is a much easier task than holding a conversation, and it has no latency budget at all.
Writing the review prompt
Ask for structured output and name the fields. A review that comes back as a paragraph is a paragraph nobody reads.
You are a compliance reviewer for outbound collections calls in India.
Review the transcript and return a JSON object with exactly these keys:
"disclosure_given" true if the agent stated the call was recorded before any other substantive statement "identified_caller" true if the agent named itself and the company in its first turn "honoured_opt_out" true if the caller asked not to be contacted and the agent ended the call without further pitching; null if they never asked "pressure_language" a list of any phrases that threatened consequences the caller was not legally exposed to "summary" one sentence, factual "call_quality_score" 1-5
Judge only what is in the transcript. Do not infer intent. Where thetranscript is ambiguous, return null rather than a guess.That last paragraph matters more than the rest. A reviewing model asked for a verdict will produce one, and a confidently wrong compliance record is worse than no record.
Where the results appear
On the Run Detail page for each call, alongside the transcript and
recording. They are also available to a Webhook node as
{{annotations.qa_*}}, so a failing compliance review can raise a ticket in
your own system without anyone opening Decibyl.
Rules
- No incoming and no outgoing edges — a QA node is never part of the conversation.
- One per agent is the normal shape.