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.
Workflow JSON
Section titled “Workflow JSON”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.
{ "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:
| Connection | Why |
|---|---|
| Speech provider (OpenAI / ElevenLabs / Google / AWS) | The STT step needs one |
| AI provider (Anthropic / OpenAI / Google) | The LLM Call needs one |
| (Optional) CRM | If 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.
| Field | Value |
|---|---|
| Name | post-call-summary |
| Method | POST |
| Authentication | On — 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.
How it works
Section titled “How it works”Four steps:
- Download recording —
file.download-from-urlpulls the recording into managed storage. - Transcribe —
speech.speech-to-textruns the audio through your chosen STT provider with segment-level detail and English language hint. - Summarize with structured output —
ai.llm-callextracts a typed summary, sentiment, action items, and a disposition recommendation. - Store the result —
data-store.setwrites the structured summary keyed by call ID.
What to customize first
Section titled “What to customize first”- Add CRM write-back. After the
store-summarystep, 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-summariestable. Once enough calls are flowing through, you can pivot byagentName × 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.
Related recipes
Section titled “Related recipes”- Webhook → AI URL Summary — same LLM-Call-with-structured-output pattern but for HTTP-fetched URLs instead of audio