Skip to content

AI Post-Call Summary

When a phone call ends — anywhere — this workflow fetches the recording, transcribes it, runs a structured LLM Call to extract a summary plus action items, and writes the result back to your CRM or a data store. Vendor-agnostic: wire it to Twilio, Five9, Aircall, RingCentral, or any custom webhook from your own contact center.

This is the recipe nobody else can build cleanly because audio + speech aren’t first-class steps anywhere else. On QuickFlo, it’s four steps and 5 minutes of configuration.

Swap the placeholder connection names (my-anthropic, my-openai-stt) for your actual connection names. Adjust the structured output schema to match what you actually want extracted from each call.

ai-post-call-summary.json
{
"name": "AI Post-Call Summary",
"initial": {
"callId": "abc-123",
"recordingUrl": "https://recordings.example.com/abc-123.mp3",
"agentName": "Jane Doe",
"durationSeconds": 245
},
"steps": [
{
"stepId": "download-recording",
"stepType": "file.download-from-url",
"input": {
"url": "{{ initial.recordingUrl }}",
"filename": "call_{{ initial.callId }}.mp3"
}
},
{
"stepId": "transcribe",
"stepType": "speech.speech-to-text",
"input": {
"provider": {
"provider": "openai",
"connection": "my-openai-stt"
},
"audio": {
"sourceType": "stored-file",
"url": "{{ download-recording.file.url }}"
},
"outputDetail": "segments",
"language": "en"
}
},
{
"stepId": "summarize",
"stepType": "ai.llm-call",
"input": {
"provider": {
"provider": "anthropic",
"connection": "my-anthropic",
"model": "claude-sonnet-4-5-20250929"
},
"mode": {
"mode": "structured_output",
"system_prompt": "You are a contact center QA analyst. Extract a structured summary of the following call transcript. Be terse, accurate, and focused on what an agent or supervisor would care about.",
"user_prompt": "Call ID: {{ initial.callId }}\nAgent: {{ initial.agentName }}\nDuration: {{ initial.durationSeconds }}s\n\nTranscript:\n\n{{ transcribe.text }}",
"output_schema": {
"summary": "string: A 2-3 sentence summary of the call",
"topics": "string[]: The main topics discussed",
"sentiment": "string: Overall caller sentiment — 'positive', 'neutral', 'frustrated', or 'angry'",
"actionItems": "string[]: Concrete follow-up actions the agent committed to",
"dispositionRecommendation": "string: Recommended disposition code based on call outcome",
"qaFlags": "string[]: Any QA concerns — 'compliance issue', 'missed objection', 'rude tone', etc., or empty"
}
}
}
},
{
"stepId": "store-summary",
"stepType": "data-store.set",
"input": {
"tableName": "call-summaries",
"key": "{{ initial.callId }}",
"value": {
"callId": "{{ initial.callId }}",
"agentName": "{{ initial.agentName }}",
"durationSeconds": "{{ initial.durationSeconds }}",
"transcript": "{{ transcribe.text }}",
"summary": "{{ summarize.object.summary }}",
"topics": "{{ summarize.object.topics }}",
"sentiment": "{{ summarize.object.sentiment }}",
"actionItems": "{{ summarize.object.actionItems }}",
"dispositionRecommendation": "{{ summarize.object.dispositionRecommendation }}",
"qaFlags": "{{ summarize.object.qaFlags }}",
"summarizedAt": "{{ \"now\" | date: \"%Y-%m-%dT%H:%M:%SZ\" }}"
}
}
}
]
}

Connections needed:

ConnectionWhy
Speech provider (OpenAI / ElevenLabs / Google / AWS)The STT step needs one
AI provider (Anthropic / OpenAI / Google)The LLM Call needs one
(Optional) CRMIf you’re writing back to Salesforce / Hubspot

Trigger: use a Webhook trigger that takes a JSON payload with the call metadata and the recording URL. Most telephony platforms (Twilio, Five9 ESS, Aircall, RingCentral) can post to a webhook on call completion — point them at your QuickFlo webhook URL.

FieldValue
Namepost-call-summary
MethodPOST
AuthenticationOn — generate a secret and pass it in your telephony platform’s webhook config

The expected webhook body:

{
"callId": "abc-123",
"recordingUrl": "https://recordings.example.com/abc-123.mp3",
"agentName": "Jane Doe",
"durationSeconds": 245
}

If you’re using Five9 instead, use the Five9 Supervisor event trigger directly — the event payload contains the same fields.

Four steps:

  1. Download recordingfile.download-from-url pulls the recording into managed storage.
  2. Transcribespeech.speech-to-text runs the audio through your chosen STT provider with segment-level detail and English language hint.
  3. Summarize with structured outputai.llm-call extracts a typed summary, sentiment, action items, and a disposition recommendation.
  4. Store the resultdata-store.set writes the structured summary keyed by call ID.
  • Add CRM write-back. After the store-summary step, add an HTTP step that POSTs the summary to your CRM’s REST API. Use a Salesforce connection (or any other OAuth connection) and QuickFlo handles token refresh automatically.
  • Build a dashboard on the call-summaries table. Once enough calls are flowing through, you can pivot by agentName × sentiment, plot QA flag rates over time, or build a “calls flagged for review” widget.
  • Use the AI Agent step instead if you want the model to also look up the customer in your CRM, check for open tickets, and decide whether to escalate. Wire those capabilities up as agent tools — see AI Agent.
  • Stream very long calls. For calls over 10 minutes, Google Cloud’s STT provider auto-streams. For other providers, convert audio first to a smaller bitrate to fit the upload limit.
  • Five9 users: swap the webhook trigger for a Five9 Supervisor event trigger and remove the recording-URL field from initial — Five9’s event payload includes the recording URL directly.