AutomationFlowsAI & RAG › Generate Financial Risk Reports from ElevenLabs Interviews with OpenAI

Generate Financial Risk Reports from ElevenLabs Interviews with OpenAI

Original n8n title: Generate Financial Risk Reports 📈 From Elevenlabs Interviews 🎙️using Openai

ByDavide Boizza @n3witalia on n8n.io

This workflow automates the process of receiving a post-call audio file and transcription from ElevenLabs, processing them, and generating a financial risk report.

Webhook trigger★★★★☆ complexityAI-powered21 nodesOpenAI ChatGoogle DriveChain LlmOutput Parser StructuredInformation ExtractorGmail
AI & RAG Trigger: Webhook Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #14546 — we link there as the canonical source.

This workflow follows the Chainllm → Gmail recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "Yubcg4N0YtRu2Ctg",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Financial Report from ElevenLabs Interview",
  "tags": [],
  "nodes": [
    {
      "id": "18d4a836-4eca-4447-910f-84aeae98a106",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "notes": "wsec_0878db4550c39a8cac0049c8ad5c7b8f8a8072381ba13f6a7f4c522496bb62e0",
      "position": [
        -704,
        176
      ],
      "parameters": {
        "path": "0a1e32dd-fb2d-450f-a9bd-e69c43bfdecf",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "3ffd9b5f-7c36-43d2-ba76-4c8773561ead",
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "position": [
        -416,
        176
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Post Call Audio",
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "loose"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "cd1ad04f-645e-4fe6-b543-be60c2cd16f0",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.body.type }}",
                    "rightValue": "post_call_audio"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Post call Transcription",
              "conditions": {
                "options": {
                  "version": 3,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "loose"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "4d4adf79-02f3-4647-919b-3a6c96a692f1",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.body.type }}",
                    "rightValue": "post_call_transcription"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {},
        "looseTypeValidation": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "f7a27d9f-b89f-498e-bb48-cc540371b33f",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        672,
        656
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini",
          "cachedResultName": "gpt-5-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "4db2c641-9db8-4fe7-82c5-7531e0450a4f",
      "name": "Upload audio",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        224,
        0
      ],
      "parameters": {
        "name": "={{$binary.data.fileName}}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root",
          "cachedResultName": "/ (Root folder)"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "e9ba23bb-a474-4d6e-8905-7b9c77b2d647",
      "name": "Generate MP3",
      "type": "n8n-nodes-base.code",
      "position": [
        0,
        0
      ],
      "parameters": {
        "jsCode": "// Estrai il Base64 audio\nconst base64Audio = $input.item.json.body.data.full_audio;\nconst conversationId = $input.item.json.body.data.conversation_id;\n\n// Converti Base64 in Buffer binario\nconst audioBuffer = Buffer.from(base64Audio, 'base64');\n\nreturn {\n  json: {\n    conversation_id: conversationId,\n    agent_id: $input.item.json.body.data.agent_id,\n    agent_name: $input.item.json.body.data.agent_name,\n    user_id: $input.item.json.body.data.user_id\n  },\n  binary: {\n    data: {\n      data: audioBuffer.toString('base64'),\n      mimeType: 'audio/mpeg',\n      fileName: `conversation_${conversationId}.mp3`\n    }\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "9b269611-df30-4ad4-b1e6-2c738c4c97bf",
      "name": "Get Transcript",
      "type": "n8n-nodes-base.set",
      "position": [
        -16,
        320
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "996c3a65-c82f-4756-8b87-e8a46366cd2b",
              "name": "transcript",
              "type": "array",
              "value": "={{ $json.body.data.transcript }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c6361b06-59ef-42a8-980b-e07857f39567",
      "name": "Extract Fulltext",
      "type": "n8n-nodes-base.code",
      "position": [
        224,
        320
      ],
      "parameters": {
        "jsCode": "const transcript = $json.transcript;\n\nconst fullText = transcript\n  .filter(item => item.message) // esclude null\n  .map(item => `${item.role}: ${item.message}`)\n  .join('\\n\\n');\n\nreturn [\n  {\n    json: {\n      conversation_id: $json.conversation_id,\n      agent_name: $json.agent_name,\n      transcript_text: fullText\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "de7c5325-69a7-49e8-80c6-d3846d9d25ec",
      "name": "Calculate Rating",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        736,
        480
      ],
      "parameters": {
        "text": "={{ $json.transcript_text }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=**# QUANTITATIVE EVALUATION SYSTEM**\n\nYou are a **financial and management analysis agent**. You receive as input the text of an interview. Your task is to analyze the responses and produce a **complete quantitative evaluation** according to the methodology described below.\n\n---\n\n## INPUT\n\nThe interview text will be provided to you as a conversation. Analyze **exclusively the content of the interviewee\u2019s responses**.\n\n---\n\n## PHASE 1 \u2013 EVALUATION OF THE MACRO-AREAS (scale 1\u20135)\n\nEvaluate each of the **8 macro-areas** by assigning a score from **1 to 5** according to the following criteria:\n\n| Score | Meaning                                 |\n| ----- | --------------------------------------- |\n| 1     | Structural absence or lack of awareness |\n| 2     | Reactive or superficial management      |\n| 3     | Partial or intermittent structure       |\n| 4     | Stable and conscious structure          |\n| 5     | Integrated and anticipatory structure   |\n\n**Base each score on:**\n\n* Presence of concrete examples in the responses\n* Internal consistency among the responses\n* Ability to connect decisions with consequences\n* Level of demonstrated economic and financial awareness\n\n---\n\n## OUTPUT\n\n**FINAL VERDICT: [POSITIVE / NEUTRAL / NEGATIVE]**\nRisk classification: [Low risk / Medium behavioral risk / High behavioral risk]\n\nReturn a valid JSON object with the following structure:\n\n{\n  \"score\": <number>,\n  \"verdict\": \"<string>\",\n  \"reason\": \"<string>\"\n}\n\nDo not include any text, explanation, or markdown outside the JSON object.\n"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.9
    },
    {
      "id": "83d64adc-c283-4c6a-be08-b3de5794f7fb",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        960,
        672
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"score\": {\n\t\t\t\"type\": \"number\"\n\t\t},\n\t\t\"verdict\": {\n\t\t\t\"type\": \"string\"\n\t\t},\n      \"reason\": {\n\t\t\t\"type\": \"string\"\n\t\t}\n\t}\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "decaad9a-3112-49fe-baac-7eea6b1062ec",
      "name": "Information Extractor",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        736,
        144
      ],
      "parameters": {
        "text": "={{ $json.transcript_text }}",
        "options": {
          "systemPromptTemplate": "You are an expert extraction algorithm.\nOnly extract relevant information from the text.\nIf you do not know the value of an attribute asked to extract, you may omit the attribute's value."
        },
        "attributes": {
          "attributes": [
            {
              "name": "company_name",
              "required": true,
              "description": "Comany name"
            },
            {
              "name": "name",
              "required": true,
              "description": "Name about the CEO"
            },
            {
              "name": "address",
              "required": true,
              "description": "Complete address"
            },
            {
              "name": "vat_number",
              "required": true,
              "description": "VAT number"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "cb1cc836-6eec-46a9-91e1-0e96cd3aef52",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        704,
        320
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini",
          "cachedResultName": "gpt-5-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "d3141c0e-076a-4e2b-af99-e5f138db1c70",
      "name": "OpenAI Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1472,
        480
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini",
          "cachedResultName": "gpt-5-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "b66c2bbc-3a2a-4be7-a7fc-ce5ca286b793",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        1232,
        304
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2
    },
    {
      "id": "4ce4f456-223e-48d6-a889-fd5924d5b92f",
      "name": "Financial Report Generator",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1488,
        304
      ],
      "parameters": {
        "text": "=Company: {{ $json.output.company_name }}\nName: {{ $json.output.name }}\nAddress {{ $json.output.address }}\nVAT Number: {{ $json.output.vat_number }}\nScore: {{ $json.output.score }}\nVerdict: {{ $json.output.verdict }}\nReason: {{ $json.output.reason }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=# FINANCIAL REPORT GENERATOR\n\n## Role\nYou are a professional financial analyst assistant. Your job is to generate a concise, structured financial risk report as an HTML email body based on the provided company data and credit assessment results.\n\n---\n\n## Input you will receive\n- **Company**: legal company name\n- **Name**: contact or representative name\n- **Address**: registered company address\n- **VAT Number**: company VAT identifier\n- **Score**: numerical credit/risk score\n- **Verdict**: overall assessment result (e.g., POSITIVE, NEUTRAL, NEGATIVE)\n- **Reason**: explanation behind the verdict\n\n---\n\n## Your task\nGenerate a formal financial report formatted as an HTML email body that:\n- Uses inline CSS only (no external stylesheets, no `<style>` blocks)\n- Is compatible with major email clients (Outlook, Gmail, Apple Mail)\n- Presents information in a clean, professional layout using tables\n- Uses a neutral color palette suitable for a financial document\n\n---\n\n## HTML structure\n\n1. **Header** \u2014 company name and report title, light gray background\n2. **Company Details** \u2014 two-column table: label on the left, value on the right\n3. **Risk Assessment Summary** \u2014 score and verdict displayed prominently, with a colored badge:\n   - POSITIVE \u2192 green (`#2e7d32`)\n   - NEUTRAL \u2192 orange (`#e65100`)\n   - NEGATIVE \u2192 red (`#c62828`)\n4. **Assessment Rationale** \u2014 plain prose paragraph expanding the reason field\n5. **Recommendation** \u2014 one short paragraph with suggested course of action based on the verdict\n6. **Footer** \u2014 small gray text: \"This report was automatically generated.\"\n\n---\n\n## Hard constraints\n- Output ONLY the HTML code, nothing else \u2014 no explanations, no markdown, no code fences\n- Use only inline CSS\n- Never add financial data or assumptions not present in the input\n- The output must be a complete HTML fragment starting with `<div>` (not a full `<html>` document)"
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "84d37d8c-293d-4766-b451-f365a6c33c3a",
      "name": "Send report",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1856,
        304
      ],
      "parameters": {
        "sendTo": "xxx@xxx.com",
        "message": "={{ $json.text }}",
        "options": {},
        "subject": "=[Financial Report] {{ $('Merge').item.json.output.company_name }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "238f24be-3071-4830-8b8f-9974886059b5",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        -640
      ],
      "parameters": {
        "width": 1296,
        "height": 480,
        "content": "## Financial Risk Report Generator from ElevenLabs Interview audio Using AI\nThis workflow automates the process of receiving a post-call audio file and transcription from [ElevenLabs](https://try.elevenlabs.io/ahkbf00hocnu), processing them, and generating a financial risk report.\n\n### How it works\n\nThis workflow receives ElevenLabs webhook events and routes them by payload type to handle either post-call audio or post-call transcription. Audio events are decoded from Base64, converted into an MP3 binary file, and uploaded to Google Drive for storage and traceability. Transcription events are transformed into a single readable conversation text, which is then analyzed in parallel by AI nodes: one extracts structured company details, and another assigns a financial risk score, verdict, and justification using structured JSON output.\n\nThe extracted company data and risk evaluation are merged and passed to a final report-generation step. That node creates a polished HTML financial risk report, which is then sent automatically by Gmail to the target recipient. The result is a fully automated pipeline from interview output to stakeholder-ready email delivery.\n\n### Setup steps\n\nConfigure the required credentials first: OpenAI for the language model nodes, Google Drive for audio upload, and Gmail for sending the final report. Then verify the webhook path and ID, and register that endpoint in ElevenLabs so post-call audio and transcription events are sent into the workflow correctly.\n\nNext, review node-specific parameters. Update the Google Drive destination folder if needed, confirm the extraction fields still match the business data you want to collect, and replace the placeholder Gmail recipient with the correct email address while checking the subject format. After credentials and node settings are validated, activate the workflow in n8n so it can start receiving webhook events and processing interviews automatically.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c29ee6f8-8765-47cd-b903-b5bb317e56a8",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 288,
        "content": "## STEP 1 - Upload audio\nSave audio call to Google Drive"
      },
      "typeVersion": 1
    },
    {
      "id": "044d60e0-933a-4b81-a1d1-859340c9b3f3",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 320,
        "content": "## STEP 2 - Get Audio Transcript\nGet audio transcript from Elevenlabs audio"
      },
      "typeVersion": 1
    },
    {
      "id": "018f39de-eb8e-4b68-bf06-db89044a8028",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        16
      ],
      "parameters": {
        "color": 7,
        "width": 608,
        "height": 800,
        "content": "## STEP 3 - Extract Informations\nThe full transcript text is then used by two nodes in parallel: Information Extractor and Calculate Rating"
      },
      "typeVersion": 1
    },
    {
      "id": "b40b0a21-70a6-4621-9188-489f71613228",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1392,
        144
      ],
      "parameters": {
        "color": 7,
        "width": 672,
        "height": 496,
        "content": "## STEP 4 - Financial Report\nFinancial Report Generator and send it to email"
      },
      "typeVersion": 1
    },
    {
      "id": "6281f67e-6000-4978-abb6-c1fe3900c40d",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -896
      ],
      "parameters": {
        "color": 7,
        "width": 736,
        "height": 736,
        "content": "## MY NEW YOUTUBE CHANNEL\n\ud83d\udc49 [Subscribe to my new **YouTube channel**](https://youtube.com/@n3witalia). Here I\u2019ll share videos and Shorts with practical tutorials and **FREE templates for n8n**.\n\n[![image](https://n3wstorage.b-cdn.net/n3witalia/youtube-n8n-cover.jpg)](https://youtube.com/@n3witalia)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "80c53f08-28ed-4582-82e7-5f185d7e887e",
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Financial Report Generator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Generate MP3",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get Transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate MP3": {
      "main": [
        [
          {
            "node": "Upload audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Transcript": {
      "main": [
        [
          {
            "node": "Extract Fulltext",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Rating": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Extract Fulltext": {
      "main": [
        [
          {
            "node": "Information Extractor",
            "type": "main",
            "index": 0
          },
          {
            "node": "Calculate Rating",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Calculate Rating",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Information Extractor",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "Financial Report Generator",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Information Extractor": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Calculate Rating",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Financial Report Generator": {
      "main": [
        [
          {
            "node": "Send report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automates the process of receiving a post-call audio file and transcription from ElevenLabs, processing them, and generating a financial risk report.

Source: https://n8n.io/workflows/14546/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

leads. Uses supabase, gmail, formTrigger, httpRequest. Webhook trigger; 62 nodes.

Supabase, Gmail, Form Trigger +13
AI & RAG

Resume Screening & Behavioral Interviews with Gemini, Elevenlabs, & Notion ATS copy. Uses outputParserStructured, chainLlm, googleDrive, stickyNote. Webhook trigger; 67 nodes.

Output Parser Structured, Chain Llm, Google Drive +9
AI & RAG

Candidate Engagement | Resume Screening | AI Voice Interviews | Applicant Insights

Output Parser Structured, Chain Llm, Google Drive +9
AI & RAG

This end-to-end AI-powered recruitment automation workflow helps HR and talent acquisition teams automate the complete hiring pipeline—from resume intake and parsing to GPT-4-based evaluation, TA appr

Form Trigger, Output Parser Structured, Google Drive +10
AI & RAG

Tired of grinding out YouTube content? This n8n workflow turns AI into your personal video factory—creating engaging, faceless shorts on autopilot. Perfect for creators, marketers, or side-hustlers lo

HTTP Request, Google Drive, Google Sheets +6