Post-Call Analysis
After every call ends, Neuratel runs an AI analysis pipeline that generates structured insights from the transcript. Configure what gets analyzed via the agent's analytics.post_call settings.
What Gets Analyzed
Four analysis types run in parallel:
| Type | Output |
|---|---|
| Summary | AI-generated text summary of the call |
| Success Evaluation | Rubric-based score measuring whether the call succeeded |
| Data Collection | Structured JSON extraction of fields you define |
| Sentiment Timeline | Per-turn sentiment score (-1.0 to 1.0) with trend analysis |
Configuration
Configure via the agent's analytics section:
Code
Success Evaluation Rubrics
Choose a rubric type for success evaluation:
| Rubric value | Use case |
|---|---|
PassFail | Binary: did the call succeed or fail? |
NumericScale | Score from 1–10 |
DescriptiveScale | Excellent / Good / Fair / Poor |
PercentageScale | 0–100 % score |
LikertScale | Strongly agree → strongly disagree |
Checklist | Pass/fail per criterion |
Matrix | Multiple dimensions scored independently |
AutomaticRubric | AI determines the best rubric automatically |
The values are PascalCase string literals (matches the SuccessEvaluationRubric enum on the backend). Configure under analytics.post_call.analysisPlan:
Code
enabled: true is the master switch — analysis is opt-in. With it false, none of the prompts run even if populated.
extract_topics, extract_action_items, and compute_user_sentiment default to false for cost discipline (each enabled flag adds one LLM call per session). Turn on the ones you actually consume.
minMessagesThreshold: 2 skips analysis entirely on dead-air / voicemail-only calls (matches Vapi parity). Increase if you want to skip very short courtesy calls too.
Accessing Results
Analysis runs asynchronously after the call ends. Poll the voice session and check analysis_status:
Code
Code
Code
Flat fields exposed on VoiceSessionResponse:
| Field | Type | Description |
|---|---|---|
analysis_status | string | "pending" while async analysis is running, "completed" when results land, "failed" on a hard error. The four eval fields below are populated only when completed. |
call_summary | string | LLM-generated text summary (controlled by summaryPrompt). |
user_sentiment | string | Categorical sentiment: "Positive" / "Neutral" / "Negative" / "Unknown" (set when compute_user_sentiment: true). |
user_sentiment_score | float | Numeric sentiment in [-1, 1]. |
call_successful | string | Success eval verdict: "success" / "failure" / "unknown". Populated when the rubric runs. |
call_successful_rationale | string | Human-readable explanation for the call_successful value. |
topics_discussed | string[] | Set when extract_topics: true. |
action_items | string[] | Set when extract_action_items: true. |
extracted_data | object | Matches the JSON schema you supplied in structuredDataSchema. |
Don't act on these fields if
analysis_status != "completed"— they'll benulluntil analysis lands.
Receiving via Webhook
Configure a webhook to receive analysis results as they complete:
Code
The call.summary.ready event fires once analysis is complete and includes the full payload (transcript, summary, evaluation, recording URL). The call.ended event fires immediately when the call disconnects, before analysis runs.
Sentiment Timeline
When track_sentiment: true, each turn in the conversation receives a sentiment score from -1.0 (very negative) to 1.0 (very positive). The timeline also includes an overall trend: improving, declining, stable, or volatile.
Access the timeline via GET /v1/voice-sessions/{id}?include=all — look for performance_metrics.sentiment_timeline in the response.
Related
- Webhook Events — full payload reference for call.summary.ready
- Agents — analytics configuration in the full agent schema
- Analytics — dashboard and reporting endpoints
