Skip to main content

Observability

Post-call analysis

Structured outcomes extracted from a conversation.

What post-call analysis does

After a call ends, Finn reads the transcript and answers questions you set on the Finn: "did they book?", "what budget did they mention?", "did they agree to a follow-up?". You get structured answers without reading or listening to the call.

At 1,000 calls a week nobody reads 1,000 transcripts, but anyone can read "62% booked". Set your questions up before you launch anything serious.

Where to set it up

In the dashboard, click Edit on the Finn's builder page and open the Post-call analysis tab. Click Add question and pick a type.

Each question has:

PartWhat it does
Question labelThe question's key. It comes back as question_name in analysis results, exports and webhooks.
Instruction promptWhat you want answered, in plain language. This is what the analyzer works from. Sent as description in the API.
Format examplesOptional. Examples of the answer shape you want.
ChoicesSelector only. The values the answer must come from.

You can also set the questions through the API, as the post_call_analysis array on a Finn (up to 50 questions). See api-finns.

Answer types

TypeWhat you getUse it for
TextFree textOpen captures: pain points, names, callback times, dates
SelectorOne of your choicesKnown buckets: intent, outcome, urgency
Yes/Notrue or falseDid one specific thing happen
NumberA numberScores, quantities, prices mentioned

There's no date type. Capture dates as Text. For wording advice and starter sets, see analysis fields.

When answers arrive

  1. The call ends and the transcript is saved.
  2. The analyzer answers each question from the transcript.
  3. Answers are saved to the call and appear in the dashboard and in GET /calls/{call_uuid}.
  4. The call.completed webhook is sent with the answers in its analysis array.

This usually takes about 5 minutes. If no analysis has arrived after about an hour, call.completed is sent anyway with whatever analysis exists, which can be none. Answers that arrive later are in GET /calls/{call_uuid}. Calls that didn't connect have no transcript, so they get no answers. See webhook-post-call.

Analysis doesn't depend on the recording add-on. It runs whether or not the call is recorded.

What each answer carries

FieldMeaning
question_nameThe question's name.
question_typeThe question's type.
answerThe answer, always as a string, even for Yes/No and Number. Convert it yourself.
needs_reviewtrue when the analyzer marked the answer as uncertain. Shown as Needs Review in the dashboard.
reasoningWhy the analyzer chose the answer.
extracted_atWhen the answer was extracted.

There is no confidence score. Use needs_review and reasoning to decide which answers a person should check.

Each call also gets user_sentiment and call_successful, the analysis's own judgment of whether the call met its goal. These come from the analysis, not from one of your questions. See metrics.

Where answers appear

PlaceWhat you see
Call detail sidebarThe Post-Call Analysis tab: every question with its answer, review marker and reasoning. See call logs.
Call log CSVOne column per question. See exports.
Analytics → Merged reportSelect several deployments and merge their post-call analysis into one report.
call.completed and GET /calls/{call_uuid}The analysis array.

Changing questions after launch

ChangeEffect
Add a questionAnswered for calls that end after you add it. Older calls have no answer for it.
Edit a questionFuture calls use the new wording. Past answers stay as they were.
Remove a questionIt stops being asked. Past answers stay on those calls.

Answers aren't re-extracted for past calls, so plan your questions before the calls you want to measure.

Accuracy

The analyzer can be wrong. When an answer looks off, open the call and read the transcript. Usually either the transcript doesn't contain the information (the call ended before the topic came up), or the question is vague. Tighten the description and give a format example.

A question that is blank on most calls usually points at the agent, not the analyzer: if budget_range is empty on 80% of calls, the agent isn't asking about budget. See agents-prompting.