This workflow follows the Agent → Documentdefaultdataloader 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 →
{
"nodes": [
{
"parameters": {
"mode": "raw",
"jsonOutput": "{\n\"categoriesArray\": \n [\n {\n \"id\": \"SALES_INQUIRY\",\n \"name\": \"Sales Inquiry\",\n \"description\": \"The user is asking about pricing, features, demos, or how to buy the product/service.\"\n },\n {\n \"id\": \"SUPPORT_REQUEST\",\n \"name\": \"Support Request\",\n \"description\": \"The user is an existing customer having a problem, reporting a bug, or asking how to use a feature. This includes questions related to DigitalOcean products.\"\n },\n {\n \"id\": \"GENERAL_QUESTION\",\n \"name\": \"General Question\",\n \"description\": \"The user is asking a general question that does not fit into the other categories.\"\n }\n ]\n}",
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
416,
0
],
"id": "72f94423-08a2-4773-8bf6-9ff1f775ed6b",
"name": "Define inquiry categories"
},
{
"parameters": {
"jsCode": "// Get the incoming item which contains our data\nconst item = $input.first().json;\n\n// Get the array from the 'categoriesJson' field\nconst categories = item.categoriesArray;\n\n// Format the array into a clean text block for the LLM prompt\nconst promptCategories = categories.map(cat => {\n return `- ${cat.id}: ${cat.description}`;\n}).join('\\n');\n\n// Add the new prompt string as a field to the item\nitem.promptCategories = promptCategories;\n\n// Return the modified item\nreturn item;"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
624,
0
],
"id": "70a9c2f8-74c2-417d-9a1a-132851aab3de",
"name": "Add inquiry categories string"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "3af75694-de95-489f-ac87-d9ba1f28971b",
"name": "category",
"value": "={{ $('Extract and format LLM response (Inquiry type)').item.json.category }}",
"type": "string"
},
{
"id": "c51d48e8-54c3-4fd3-9003-c5c348917067",
"name": "inquirySummary",
"value": "={{ $('Extract and format LLM response (Inquiry type)').item.json.summary }}",
"type": "string"
},
{
"id": "e38b8259-18ac-41f1-a6dc-7a51d60f44bc",
"name": "inquiry",
"value": "={{ $('On form submission').item.json['What can we help you with? The more details you provide, the better we can help!'] }}",
"type": "string"
},
{
"id": "4ca5a1b6-1bbc-4352-838e-47300641e7c6",
"name": "inquirerName",
"value": "={{ $('On form submission').item.json.Name }}",
"type": "string"
},
{
"id": "14a78489-d35c-4e24-aeca-b56b4dc08e2d",
"name": "inquirerCompany",
"value": "={{ $('On form submission').item.json.Company }}",
"type": "string"
},
{
"id": "ca0ac42e-7964-4ee4-a322-840c9c159912",
"name": "inquirerContactEmail",
"value": "={{ $('On form submission').item.json['Where can we reach you?'] }}",
"type": "string"
},
{
"id": "1e581d3a-e3d1-4a20-b5f6-9a839e4c0733",
"name": "inquirySubmissionTime",
"value": "={{ $('On form submission').item.json.submittedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1232,
0
],
"id": "f1bac756-8b25-48fe-9daa-620c993ea31a",
"name": "Rename fields for interface adherence"
},
{
"parameters": {
"jsCode": "let contentString = $input.first().json.choices[0].message.content;\n\ncontentString = contentString.replace(/```(?:json)?\\n?/, \"\").replace(/```$/, \"\").trim();\n\nconst parsedJson = JSON.parse(contentString);\n\n// Returning the parsed object so it becomes the new output\nreturn parsedJson;"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1024,
0
],
"id": "ff8460a6-bb2f-483c-a0fc-2317d424f9f4",
"name": "Extract and format LLM response (Inquiry type)"
},
{
"parameters": {
"model": "anthropic-claude-opus-4",
"prompt": "=You are an expert administrative assistant responsible for analyzing and routing inbound inquiries. Your task is to analyze the following message from a contact form.\n\nBased on the message content, you must perform two tasks:\n1. **Categorize the Inquiry:** Classify the message into ONE of the following categories:\n--- CATEGORIES ---\n{{ $json.promptCategories }}\n--- END CATEGORIES ---\n\n2. **Summarize the Inquiry:** Provide a concise, one-sentence summary of the user's core request.\n\nReturn your complete analysis as a single, clean JSON object with the keys \"category\" and \"summary\". Include only this JSON object in your response, and no other text or preamble. Here is an example of an output string\n--- OUTPUT EXAMPLE ---\n{\\n \"category\": \"SALES_INQUIRY\",\\n \"summary\": \"The user is seeking guidance on migrating their application's backend infrastructure to DigitalOcean, specifically regarding Managed Databases and App Platform offerings, to achieve a more streamlined and cost-predictable solution.\"\\n}\n--- END OUTPUT EXAMPLE ---\n\nHere is the inbound message:\n--- INBOUND MESSAGE ---\nNAME: {{ $('On form submission').item.json.Name }}\nCOMPANY: {{ $('On form submission').item.json.Company }}\nINQUIRY: {{ $('On form submission').item.json['What can we help you with? The more details you provide, the better we can help!'] }}\n--- END INBOUND MESSAGE ---",
"options": {
"maxTokens": 2048,
"temperature": 0.7
},
"requestOptions": {}
},
"type": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference.digitalOceanGradientServerlessInference",
"typeVersion": 1,
"position": [
816,
0
],
"id": "999a722d-9035-44ed-af1a-da83d843e169",
"name": "Determine inquiry type",
"credentials": {}
},
{
"parameters": {
"content": "# Inquiry type + routing\n\nDetermine what type of inquiry was submitted and route it accordingly",
"height": 1216,
"width": 1488,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
-432
],
"typeVersion": 1,
"id": "051f5e8f-3b54-446d-8655-58de727921b2",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "# Sub-workflow routing\n\nBy using a standard interface between sub-routes, we have made it easy to decompose parts of this workflow into sub-workflows",
"height": 1408,
"width": 592,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1280,
-624
],
"typeVersion": 1,
"id": "841207e1-8129-45f3-9e2c-e07e2ce63351",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "# Sales inquiry\n\nHandle sales inquiry via BANT analysis",
"height": 880,
"width": 3136,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1888,
-624
],
"typeVersion": 1,
"id": "4310642d-118b-4e1a-8483-116cd44b726b",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "Defining our inquiry types in a separate node rather than within an LLM prompt ensures we have a single, easily-accessible source-of-truth for our entire automation, keeping it [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)",
"height": 96,
"width": 352
},
"type": "n8n-nodes-base.stickyNote",
"position": [
304,
-128
],
"typeVersion": 1,
"id": "af8169db-7fe9-41db-b29e-7527d54fe950",
"name": "Sticky Note25"
},
{
"parameters": {
"content": "We use Digital Ocean's serverless inferencing to categorize the inquiry, giving us the flexibility to easily change models.",
"height": 96,
"width": 352
},
"type": "n8n-nodes-base.stickyNote",
"position": [
688,
-128
],
"typeVersion": 1,
"id": "21da42ff-aa57-4c4b-8281-239a733ac597",
"name": "Sticky Note26"
},
{
"parameters": {
"content": "## Interface adherence\n\nSub-workflows have access to only their direct inputs, not all previous nodes.\n\nBy mapping all of the relevant information to a standard set of keys, we can ensure decoupling between the initial inquiry classification workflow and the category-specific workflow branches, opening up the opportunity to formally compartmentalize these branches into sub-workflows as our needs grow and the automation gets more complicated.",
"height": 256,
"width": 496
},
"type": "n8n-nodes-base.stickyNote",
"position": [
800,
208
],
"typeVersion": 1,
"id": "f0896895-f8f9-4f2f-b998-7a8f4685310c",
"name": "Sticky Note3"
},
{
"parameters": {
"model": "anthropic-claude-opus-4",
"prompt": "=**ROLE**: You are an expert Sales Development Representative AI assistant. Your purpose is to analyze inbound sales inquiries with precision and objectivity to help the sales team prioritize their efforts.\n\n**TASK**: Analyze the following sales inquiry to perform a BANT analysis, calculate a lead score, and provide a summary. Adhere strictly to the scoring rubric provided.\n\n**SCORING RUBRIC**:\nScore each BANT component on a scale of 1 to 7, where:\n* **1**: Not mentioned or hinted at.\n* **2-3**: Vaguely implied or hinted at.\n* **4-5**: Mentioned indirectly or stated with some ambiguity.\n* **6-7**: Explicitly and clearly stated with specific details.\n\n**OUTPUT REQUIREMENTS**:\nReturn your entire analysis in a clean JSON format, mirroring the structure in this example JSON block:\n--- BEGIN JSON BLOCK ---\n{\n \"bantAnalysis\": {\n \"budget\": {\n \"score\": 7,\n \"justification\": \"The user explicitly states a target monthly spend of '$800-$1000'.\"\n },\n \"authority\": {\n \"score\": 5,\n \"justification\": \"The user is the 'lead developer' and is creating the proposal, indicating strong influence, but mentions a CTO for final approval.\"\n },\n \"need\": {\n \"score\": 7,\n \"justification\": \"The user clearly identifies technical needs, including resolving performance bottlenecks and finding a more streamlined, cost-predictable solution.\"\n },\n \"timeline\": {\n \"score\": 7,\n \"justification\": \"A clear timeline is provided, driven by their current contract ending and a business goal to migrate before the November holiday season.\"\n }\n }\n}\n--- END JSON BLOCK ---\n\nHere is the inquiry information\n\n--- BEGIN INQUIRY INFORMATION ---\nInquirer name: {{ $json.inquirerName }}\nInquirer company: {{ $json.inquirerCompany }}\nInquirer contact email: {{ $json.inquirerContactEmail }}\nInquiry: {{ $json.inquiry }}\n--- END INQUIRY INFORMATION",
"options": {
"maxTokens": 2048,
"temperature": 0.7
},
"requestOptions": {}
},
"type": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference.digitalOceanGradientServerlessInference",
"typeVersion": 1,
"position": [
1840,
-224
],
"id": "29a19e93-c6b3-4a8f-bfb0-9d7200cde184",
"name": "Perform BANT analysis"
},
{
"parameters": {
"content": "## Interface adherence\n\nThe first node in this area references no nodes before the `Switch for sub-workflow routing by category` node, ensuring that we can easily convert this area to a sub-workflow should we want to in the future.",
"height": 176,
"width": 496
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1680,
-48
],
"typeVersion": 1,
"id": "3d1e355c-14df-4672-ab70-704f493e1d4c",
"name": "Sticky Note5"
},
{
"parameters": {
"jsCode": "let contentString = $input.first().json.choices[0].message.content;\n\ncontentString = contentString.replace(/```(?:json)?\\n?/, \"\").replace(/```$/, \"\").trim();\n\nconst parsedJson = JSON.parse(contentString);\n\n// Returning the parsed object so it becomes the new output\nreturn parsedJson;"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2064,
-224
],
"id": "aaafd6f8-31d9-4a8d-8ec9-563ced00c898",
"name": "Extract and format LLM response (BANT)"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "68eee52f-4b0e-40bd-b8a0-5b82c8f57a2f",
"name": "overallBantScore",
"value": "={{ ($json.bantAnalysis.budget.score + $json.bantAnalysis.authority.score + $json.bantAnalysis.need.score + $json.bantAnalysis.timeline.score) / 4 }}",
"type": "number"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
2288,
-224
],
"id": "c5b5cace-e1bd-4dc0-8472-88d3974ff6bd",
"name": "Calculate overall BANT score"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $('Calculate overall BANT score').item.json.overallBantScore }}",
"rightValue": 2,
"operator": {
"type": "number",
"operation": "lte"
},
"id": "460e9764-6893-43ae-85b0-74dbce64850c"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Low priority"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "33a02016-a281-4d5d-bd7a-67724845dcef",
"leftValue": "={{ $('Calculate overall BANT score').item.json.overallBantScore }}",
"rightValue": 5,
"operator": {
"type": "number",
"operation": "lte"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Medium priority"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "04548e93-ce94-497a-9085-bd45c09f35d6",
"leftValue": "={{ $('Calculate overall BANT score').item.json.overallBantScore }}",
"rightValue": 7,
"operator": {
"type": "number",
"operation": "lte"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "High priority"
}
]
},
"options": {
"fallbackOutput": "extra"
}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
2912,
-256
],
"id": "ab2dbb43-7f60-4df7-877a-26acf2ccb8dc",
"name": "Determine lead priority"
},
{
"parameters": {
"errorMessage": "Form submission not categorized as valid inquiry type"
},
"type": "n8n-nodes-base.stopAndError",
"typeVersion": 1,
"position": [
1392,
320
],
"id": "86a421a1-ebb1-4e95-acf1-cec306abbb9d",
"name": "Inquiry categorization error"
},
{
"parameters": {
"errorMessage": "An invalid BANT priority level was assigned"
},
"type": "n8n-nodes-base.stopAndError",
"typeVersion": 1,
"position": [
2912,
48
],
"id": "88090203-69e7-4c0a-9764-1091aaf824b4",
"name": "BANT priority error"
},
{
"parameters": {
"model": "anthropic-claude-opus-4",
"prompt": "=**ROLE**: You are an expert Sales Development Representative AI assistant. Your purpose is to respond to inquiries that have been determined to be low priority by BANT analysis. \n\n**TASK**: Formulate a response email to this inquiry, personalized according to the user's inquiry. Make the response sound professional, but warm. Here is the relevant information\n\n--- BEGIN INFORMATION ---\nName: {{ $('Switch for sub-workflow routing by category').item.json.inquirerName }}\nCompany: {{ $('Switch for sub-workflow routing by category').item.json.inquirerCompany }}\nInquiry: {{ $('Switch for sub-workflow routing by category').item.json.inquiry }}\n--- END INFORMATION ---\n\n**COMPANY INFORMATION**:\nHere is information on the company you represent - DigitalOcean:\n{{ $('Get company information').item.json.content }}\n\n**BRAND TONE**:\nHere is information on the overall brand tone of DigitalOcean:\n{{ $('Get brand information').item.json.content }}\n\n**OUTPUT REQUIREMENTS**:\nReturn ONLY the formatted response email, with no preamble or other information. Here is an example output:\n--- BEGIN EXAMPLE RESPONSE ---\nDear NAME,\n\nThank you for your interest in DigitalOcean!\n\nWe've received your inquiry and are reviewing the details. In the meantime, we find that many teams find the answers they need by exploring our robust pool of self-help resources. Based on your question, here are a few links that might be helpful:\n\nCommunity Tutorials: A great starting point with thousands of step-by-step guides on nearly any software setup you can imagine. You can search for your topic here: https://www.digitalocean.com/community/tutorials\n\nProduct Documentation: For detailed information on specific products, features, and pricing. You can find our docs here: https://docs.digitalocean.com/\n\nWe recommend exploring these resources to get a feel for our platform. If you have a more specific project or a clear set of technical requirements you'd like to discuss after reviewing them, please feel free to reply to this email with those details. We'll be happy to route your request to the right team.\n\nBest,\n\nThe DigitalOcean Team\n--- END EXAMPLE RESPONSE ---",
"options": {
"maxTokens": 2048,
"temperature": 0.7
},
"requestOptions": {}
},
"type": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference.digitalOceanGradientServerlessInference",
"typeVersion": 1,
"position": [
3232,
-416
],
"id": "d166ef9e-e771-46f3-b573-5bf300138645",
"name": "Formulate email (low priority)"
},
{
"parameters": {
"model": "anthropic-claude-opus-4",
"prompt": "=**ROLE**: You are an expert Sales Development Representative AI assistant. Your purpose is to respond to inquiries that have been determined to be **medium priority** by BANT analysis. \n\n**TASK**: Analyze the user's message to identify their primary interest (e.g., \"Managed Kubernetes,\" \"migrating an application,\" \"reducing cloud costs\"). Then, use that topic to generate a personalized response email that sets the expectation for a follow-up within one business week.\n\n--- BEGIN INFORMATION ---\nName: {{ $('Switch for sub-workflow routing by category').item.json.inquirerName }}\nCompany: {{ $('Switch for sub-workflow routing by category').item.json.inquirerCompany }}\nInquiry: {{ $('Switch for sub-workflow routing by category').item.json.inquirerContactEmail }}\n--- END INFORMATION ---\n\n**COMPANY INFORMATION**:\nHere is information on the company you represent - DigitalOcean:\n{{ $('Get company information').item.json.content }}\n\n**BRAND TONE**:\nHere is information on the overall brand tone of DigitalOcean:\n{{ $('Get brand information').item.json.content }}\n\n**OUTPUT REQUIREMENTS**:\nReturn ONLY the formatted response email, with no preamble or other information. Here is an example output:\n--- BEGIN EXAMPLE RESPONSE ---\nDear NAME,\n\nThank you for your interest in DigitalOcean!\n\nWe've received your inquiry and have routed it to our solutions team. We're looking forward to discussing your project involving SOME_TOPIC_PULLED_FROM_EMAIL in more detail. A team member will reach out to you within one business week to better understand your needs and determine how we can help you.\n\nWhile you wait for our team to connect, many find it helpful to explore our pricing calculator to estimate potential monthly costs: [https://www.digitalocean.com/pricing/calculator](https://www.digitalocean.com/pricing/calculator)\n\nWe appreciate your patience and look forward to speaking with you soon.\n\nBest regards,\n\nThe DigitalOcean Team\n--- END EXAMPLE RESPONSE ---",
"options": {
"maxTokens": 2048,
"temperature": 0.7
},
"requestOptions": {}
},
"type": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference.digitalOceanGradientServerlessInference",
"typeVersion": 1,
"position": [
3232,
-192
],
"id": "26553692-4d19-47d7-9b06-e0f89bcce228",
"name": "Formulate email (medium priority)"
},
{
"parameters": {
"model": "anthropic-claude-opus-4",
"prompt": "=**ROLE**: You are an expert Sales Development Representative AI assistant. Your purpose is to respond to inquiries that have been determined to be **HIGH priority** by BANT analysis. \n\n**TASK**: Analyze the user's message to identify their primary interest (e.g., \"Managed Kubernetes,\" \"migrating an application,\" \"reducing cloud costs\"). Then, generate a personalized response email that conveys urgency and guides the lead toward booking a meeting. The response must set the expectation for a follow-up within one business day (24 hours). Here is the relevant information\n\n\n--- BEGIN INFORMATION ---\nName: {{ $('Switch for sub-workflow routing by category').item.json.inquirerName }}\nCompany: {{ $('Switch for sub-workflow routing by category').item.json.inquirerCompany }}\nInquiry: {{ $('Switch for sub-workflow routing by category').item.json.inquiry }}\n--- END INFORMATION ---\n\n**COMPANY INFORMATION**:\nHere is information on the company you represent - DigitalOcean:\n{{ $('Get company information').item.json.content }}\n\n**BRAND TONE**:\nHere is information on the overall brand tone of DigitalOcean:\n{{ $('Get brand information').item.json.content }}\n\n**OUTPUT REQUIREMENTS**:\nReturn ONLY the formatted response email, with no preamble or other information. Here is an example output:\n--- BEGIN EXAMPLE RESPONSE ---\nDear NAME,\n\nThank you for reaching out to DigitalOcean! Our team has received your inquiry and we're excited to learn more about your project involving [AI should insert the specific inquiry topic here].\n\nGiven your project's requirements, this is a priority for us. A solutions specialist will be reaching out to you personally within the next business day.\n\nTo expedite the process, you can book a time that works best for you directly on our calendar:\nhttps://mycalendar.example.com/schedule\n\nWe look forward to connecting and helping you build something amazing.\n\nBest regards,\n\nThe DigitalOcean Team\n--- END EXAMPLE RESPONSE ---",
"options": {
"maxTokens": 2048,
"temperature": 0.7
},
"requestOptions": {}
},
"type": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference.digitalOceanGradientServerlessInference",
"typeVersion": 1,
"position": [
3232,
32
],
"id": "405e6aaa-e067-4c88-8d1f-553dbc46d392",
"name": "Formulate email (high priority)"
},
{
"parameters": {
"operation": "get",
"documentURL": "1z460lJG7Ba_RYIIj_6i2qaQenZBNMa1MUxavwzeCnUk"
},
"type": "n8n-nodes-base.googleDocs",
"typeVersion": 2,
"position": [
2496,
-224
],
"id": "60c91aa3-bf04-451a-aade-fb92307fa75d",
"name": "Get company information"
},
{
"parameters": {
"operation": "get",
"documentURL": "https://docs.google.com/document/d/1OA_dhPIeZKfUzoJovkAvc7Yqc5vgDHTVT8kZwNaCxLQ/edit"
},
"type": "n8n-nodes-base.googleDocs",
"typeVersion": 2,
"position": [
2704,
-224
],
"id": "41aefa94-9d1d-42ca-aae8-1e49db75dc7d",
"name": "Get brand information"
},
{
"parameters": {
"model": "openai-gpt-4o",
"prompt": "=If the following email text block is NOT ready to be sent as is, remove any artifacts or indications that it was not written by a human, and return ONLY the formatted email text so that it may be sent out. Here is the text in question, starting on a new line:\n{{ $('Funnel email branches').item.json.choices[0].message.content }}",
"options": {
"maxTokens": 2048,
"temperature": 0.7
},
"requestOptions": {}
},
"type": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference.digitalOceanGradientServerlessInference",
"typeVersion": 1,
"position": [
3712,
-192
],
"id": "37d27896-49e9-4427-bca0-b6e081e381b1",
"name": "Verify email is appropriate"
},
{
"parameters": {
"numberInputs": 3
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
3520,
-208
],
"id": "e88e2aa1-1472-4344-8f13-48ce72a8933e",
"name": "Funnel email branches"
},
{
"parameters": {
"sendTo": "={{ $('Switch for sub-workflow routing by category').item.json.inquirerContactEmail }}",
"subject": "Re: Your DigitalOcean inquiry",
"emailType": "text",
"message": "={{ $json.choices[0].message.content }}",
"options": {
"appendAttribution": false
}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
4192,
-192
],
"id": "8b63ade4-0d62-4602-9ca0-f9e858effff6",
"name": "Send a message"
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "1JU-IFqbsrBAn3IPERQgvbNJV0LiSOYoD8-PYvjixFvw",
"mode": "list",
"cachedResultName": "Sales leads",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JU-IFqbsrBAn3IPERQgvbNJV0LiSOYoD8-PYvjixFvw/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Leads",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1JU-IFqbsrBAn3IPERQgvbNJV0LiSOYoD8-PYvjixFvw/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Contact name": "={{ $('Switch for sub-workflow routing by category').item.json.inquirerName }}",
"Company name": "={{ $('Switch for sub-workflow routing by category').item.json.inquirerCompany }}",
"Contact email": "={{ $('Switch for sub-workflow routing by category').item.json.inquirerContactEmail }}",
"Inquiry": "={{ $('Switch for sub-workflow routing by category').item.json.inquiry }}",
"Overall BANT score (1-7)": "={{ $('Calculate overall BANT score').item.json.overallBantScore }}",
"Budget score (1-7)": "={{ $('Extract and format LLM response (BANT)').item.json.bantAnalysis.budget.score }}",
"Authority score (1-7)": "={{ $('Extract and format LLM response (BANT)').item.json.bantAnalysis.authority.score }}",
"Need score (1-7)": "={{ $('Extract and format LLM response (BANT)').item.json.bantAnalysis.need.score }}",
"Timeline score (1-7)": "={{ $('Extract and format LLM response (BANT)').item.json.bantAnalysis.timeline.score }}",
"Inquiry time": "={{ $('Switch for sub-workflow routing by category').item.json.inquirySubmissionTime }}",
"Automated response email": "={{ $('Verify email is appropriate').item.json.choices[0].message.content }}",
"Automated response time": "={{ $now }}",
"Follow up by": "={{ $('Calculate overall BANT score').item.json.overallBantScore >= 6 ? $now.plus({ hours: 24 }) : $('Calculate overall BANT score').item.json.overallBantScore >= 3 ? $now.plus({ days: 7 }) : 'N/A' }}"
},
"matchingColumns": [],
"schema": [
{
"id": "Contact name",
"displayName": "Contact name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Company name",
"displayName": "Company name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Contact email",
"displayName": "Contact email",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Inquiry",
"displayName": "Inquiry",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Overall BANT score (1-7)",
"displayName": "Overall BANT score (1-7)",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Budget score (1-7)",
"displayName": "Budget score (1-7)",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Authority score (1-7)",
"displayName": "Authority score (1-7)",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Need score (1-7)",
"displayName": "Need score (1-7)",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Timeline score (1-7)",
"displayName": "Timeline score (1-7)",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Inquiry time",
"displayName": "Inquiry time",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Automated response time",
"displayName": "Automated response time",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Automated response email",
"displayName": "Automated response email",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Follow up by",
"displayName": "Follow up by",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
4432,
-192
],
"id": "132771f4-502c-4274-8486-2487edd6e16a",
"name": "Append row in sheet"
},
{
"parameters": {
"amount": "={{ ((Math.random() + Math.random()) / 2) * 16 + 6 }}",
"unit": "minutes"
},
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
3920,
-336
],
"id": "5d2f2a4b-9701-4ef6-8248-09bcb390b527",
"name": "Wait"
},
{
"parameters": {
"method": "POST",
"url": "https://mzz3rxnthlckquw2dwzdetof.agents.do-ai.run/api/v1/chat/completions",
"authentication": "genericCredentialType",
"genericAuthType": "httpBearerAuth",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "messages",
"value": "={{ [ \n {\n \"role\": \"system\",\n \"content\": $json.systemPrompt\n },\n {\n \"role\": \"user\",\n \"content\": $('Switch for sub-workflow routing by category').item.json.inquiry\n }\n] }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
3856,
1312
],
"id": "a72f6ccc-7e4a-4722-a415-0ddb83b142f1",
"name": "HTTP Request"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "aba30f3e-e483-4949-aeb9-4b14356cdaee",
"name": "systemPrompt",
"value": "=<Role>\nYou are an expert technical support agent for DigitalOcean. Your sole purpose is to provide accurate, helpful, and safe answers to user questions *only* about DigitalOcean. You are professional, concise, and you will strictly adhere to the instructions and constraints provided.\n</Role>\n\n<Instructions>\n1. **Analyze Scope**: First, determine if the user query is about DigitalOcean or its products.\n - If the question is unrelated, you MUST ignore all other instructions and respond ONLY with the following in order to raise an exception: \"{{ $('Define product question exception types (Gradient AI agent)').item.json.exceptionNotRelated }}\"\n - If the question is related, proceed to the next step.\n\n2. **Formulate Response**:\n - Synthesize a clear and direct answer to the user query using relevant information.\n - If the context contains code snippets, API endpoints, or terminal commands, you MUST format them in markdown code blocks for clarity (e.g., ```python ... ```).\n - If the context contains step-by-step instructions, use a numbered list.\n</Instructions>\n\n<Constraints>\n- **DO NOT** answer questions that are not directly about DigitalOCean.\n- **DO NOT** make up features, functions, or instructions.\n- **DO NOT** speculate, give opinions, or compare our product to competitors.\n- **DO NOT** include a preamble.\n- **DO** respond with **only** the response to the question (unless you raised an exception), ready to be sent directly to the inquirer, formatted as markdown. \n</Constraints>",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
3616,
1312
],
"id": "96634e3f-138c-4e7d-b5a8-40aa35a82087",
"name": "Create product answering system prompt"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "dc7f13b4-9d82-4c3d-87d6-dede54624c4b",
"name": "exceptionNotRelated",
"value": "EXCEPTION_NOT_RELATED",
"type": "string"
},
{
"id": "4d38f287-544e-4865-84ec-e3122eaac23a",
"name": "exceptionCouldNotAnswer",
"value": "EXCEPTION_COULD_NOT_ANSWER",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
3360,
1312
],
"id": "9ee96404-8789-4d97-968f-f9b9755051e1",
"name": "Define product question exception types (Gradient AI agent)"
},
{
"parameters": {},
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
176,
0
],
"id": "8b2a1d9e-797a-4f89-8ace-ddee64571e0c",
"name": "On form submission"
},
{
"parameters": {
"formTitle": "Contact us",
"formDescription": "Let us know how we can help!\n\nLeave your information and our team will get back to you",
"formFields": {
"values": [
{
"fieldLabel": "Name",
"placeholder": "John Smith",
"requiredField": true
},
{
"fieldLabel": "Company",
"placeholder": "DigitalOcean"
},
{
"fieldLabel": "What can we help you with? The more details you provide, the better we can help!",
"fieldType": "textarea",
"placeholder": "I'm looking for information about ...",
"requiredField": true
},
{
"fieldLabel": "Where can we reach you?",
"fieldType": "email",
"placeholder": "johnsmith@digitalocean.com",
"requiredField": true
}
]
},
"options": {
"appendAttribution": false
}
},
"type": "n8n-nodes-base.formTrigger",
"typeVersion": 2.3,
"position": [
-160,
-16
],
"id": "0c68eeba-1af5-434b-8492-b15b290109ff",
"name": "On form submission (Product)"
},
{
"parameters": {
"sendTo": "={{ $('Switch for sub-workflow routing by category').item.json.inquirerContactEmail }}",
"subject": "Re: Your DigitalOcean inquiry",
"emailType": "text",
"message": "={{ $json.choices[0].message.content }}",
"options": {
"appendAttribution": false
}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
4352,
1312
],
"id": "d347cdc2-8432-4535-a6c8-ecff886af947",
"name": "Send email (product info)"
},
{
"parameters": {
"model": "anthropic-claude-opus-4",
"prompt": "=A user submitted a contact form with the following information:\nNAME: {{ $('Switch for sub-workflow routing by category').item.json.inquirerName }}\nINQUIRY: {{ $('Switch for sub-workflow routing by category').item.json.inquiry }}\n\nHere is the requested information:\n{{ $json.choices[0].message.content }}\n\nFormulate an email that we can send back to the inquirer with the answer to his/her question. Do not include a preamble, and return only the email response itself. Do not include a subject - only the email body.",
"options": {
"maxTokens": 2048,
"temperature": 0.7
},
"requestOptions": {}
},
"type": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference.digitalOceanGradientServerlessInference",
"typeVersion": 1,
"position": [
4112,
1312
],
"id": "706af19f-c313-4c43-a759-c714dd1ff3af",
"name": "Create a text completion"
},
{
"parameters": {
"content": "We add this passthrough node so we have a common point of reference for various forms so we can reference a fixed node name in future nodes, but have the flexibility to tray different pinned data.",
"height": 128,
"width": 352
},
"type": "n8n-nodes-base.stickyNote",
"position": [
64,
-288
],
"typeVersion": 1,
"id": "c89ed4d5-9602-4bd9-990f-0e6400ca74a1",
"name": "Sticky Note7"
},
{
"parameters": {
"content": "## Wait node\n\nRemoved wait for testing purposes. Plug in for production, or add an `IF` node testing for manual execution or \"test\" input form type.\n\nThe node waits for a minimum of 6 and maximum of 24 minutes (6+16), being more likely to land around the middle (14 minutes)\n\nChange the values `6` and `16` in the node to set the minimum and range.",
"height": 240,
"width": 464
},
"type": "n8n-nodes-base.stickyNote",
"position": [
4048,
-576
],
"typeVersion": 1,
"id": "21965229-5c8a-4de5-8413-a71194dc7a96",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## BANT analysis\n\nBANT (Budget, Application, Need, Timeline) is a sales lead qualification framework that allows sales employees to prioritize inquiries that are likely to lead to revenue.\n\nWe can use AI to estimate this score based on the inquiry to automate low-level sales work.",
"height": 192,
"width": 416
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1920,
-448
],
"typeVersion": 1,
"id": "041a085e-aadb-499a-9593-a65dcabbd56d",
"name": "Sticky Note20"
},
{
"parameters": {
"content": "## Fetching company-relevant information\n\nGetting information about the company and brand tone will help make answers (1) grounded and (2) on-brand. These qualities are essential to scaling.",
"height": 176,
"width": 416
},
"type": "n8n-nodes-base.stickyNote",
"position": [
2432,
-432
],
"typeVersion": 1,
"id": "c9f2b8b3-d5d5-48d8-a9ce-f0db6a8e1ecd",
"name": "Sticky Note21"
},
{
"parameters": {
"content": "## Conditional email formulation\n\nDepending on the BANT score, leads are responded to with different emails.\n\nAutomation affords high scalability, but AI allows us to maintain personalization by catering responses to the specifics of an inquiry.\n\nThe responses come (1) quickly, letting prospective leads know that their time is valued and the company operates efficiently, and (2) with a **specific commitment** on followup: high priority leads are told they will be responded to in 24 hours along with a scheduling link to find a convenient time, medium priority within a week, and low priority are gently directed to self-serve resources.",
"height": 256,
"width": 720
},
"type": "n8n-nodes-base.stickyNote",
"position": [
3456,
-16
],
"typeVersion": 1,
"id": "9be370e2-530a-484a-ad98-6138e4ea624f",
"name": "Sticky Note22"
},
{
"parameters": {
"content": "## Response check\n\nBefore sending, the emailed is verified as appropriate. You would not want to implement a large-scale, automated solution without some checks to ensure that your potential customers are not mistreated.",
"height": 192,
"width": 368
},
"type": "n8n-nodes-base.stickyNote",
"position": [
3536,
-416
],
"typeVersion": 1,
"id": "165e7507-068c-41a7-806b-0622fedfd2a1",
"name": "Sticky Note23"
},
{
"parameters": {
"content": "## Email and automatic record-keeping\n\nThe response email is sent, and the central repository where sales and solutions associates can see leads is updates so that they can stack rank priorities and fulfill commitments.",
"height": 208,
"width": 368
},
"type": "n8n-nodes-base.stickyNote",
"position": [
4208,
-16
],
"typeVersion": 1,
"id": "4ffebe39-de2e-4dac-934f-d84cb5249c77",
"name": "Sticky Note24"
},
{
"parameters": {
"content": "# Support inquiry (account-specific and general)\n\nHandle support requests by routing to the appropriate workflow",
"height": 2208,
"width": 3568,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1888,
272
],
"typeVersion": 1,
"id": "3408a01f-57aa-41b2-ae0d-f32e39dc6cda",
"name": "Sticky Note6"
},
{
"parameters": {
"content": "## RAG method 1: Using DigitalOcean's agent builder\n\nUse a DigitalOcean Agent, which natively performs retrieval on linked knowledge bases.\n\nYou can create knowledge bases easily in the DigitalOcean dashboard through web scraping, file upload, S3 buckets, and more. Go to the DigitalOcean dashboard to learn more.\n\nIn this case, we use an agent which is connected to a knowledge base that was built by scraping all subpaths under `https://docs.digitalocean.com/products/` and `https://docs.digitalocean.com/reference/`",
"height": 480,
"width": 1376,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"position": [
3264,
1056
],
"typeVersion": 1,
"id": "d0339513-8e97-4e67-9a03-7cc2ad92dce6",
"name": "Sticky Note8"
},
{
"parameters": {
"content": "## Alternative - chat\n\nAlternatively, instead of emailing the user a response, we could do something like use a webhook to open a chat window on the frontend in the user's UI, given that chat is probably a better interface for answering questions on this branch (eneral product questions).",
"height": 192,
"width": 400,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"position": [
4688,
1152
],
"typeVersion": 1,
"id": "8c4d9752-8eb8-4824-a092-669b7eb4efd3",
"name": "Sticky Note13"
},
{
"parameters": {
"mode": "raw",
"jsonOutput": "{\n\"categoriesArray\": \n [\n {\n \"id\": \"ACCOUNT_SPECIFIC_INQUIRY\",\n \"name\": \"Account specific inquiry\",\n \"description\": \"The user is asking about something particular to his/her account, like a recent billing charge, a login/password issue, whether he should change server regions, etc.\"\n },\n {\n \"id\": \"PRODUCT_HELP\",\n \"name\": \"Product help\",\n \"description\": \"The user is seeking assistance or has a question on how to use a product, like asking for clarification on documentation, asking how to make an API request, etc.\"\n },\n {\n \"id\": \"OTHER\",\n \"name\": \"Other\",\n \"description\": \"The user is asking or saying something else that does not fit into the other categories.\"\n }\n ]\n}",
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1952,
560
],
"id": "b294f8db-d902-419c-8aa9-c0026d4d2d13",
"name": "Define support request categories"
},
{
"parameters": {
"jsCode": "// Get the incoming item which contains our data\nconst item = $input.first().json;\n\n// Get the array from the 'categoriesJson' field\nconst categories = item.categoriesArray;\n\n// Format the array into a clean text block for the LLM prompt\nconst promptCategories = categories.map(cat => {\n return `- ${cat.id}: ${cat.description}`;\n}).join('\\n');\n\n// Add the new prompt string as a field to the item\nitem.promptCategories = promptCategories;\n\n// Return the modified item\nreturn item;"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2176,
560
],
"id": "8a2251df-ed6c-4843-9b56-2c707ae126b2",
"name": "Add support request categories string"
},
{
"parameters": {
"errorMessage": "A support request was not properly categorized"
},
"type": "n8n-nodes-base.stopAndError",
"typeVersion": 1,
"position": [
2832,
848
],
"id": "7f6aec92-fd28-44f9-ad04-710fd8807c30",
"name": "Support request categorization error"
},
{
"parameters": {
"model": "llama3.3-70b-instruct",
"prompt": "=You are an expert administrative assistant responsible for analyzing and routing inbound inquiries. Your task is to analyze the following message from a contact form.\n\nBased on the message content, you must perform one task:\n1. **Categorize the Inquiry:** Classify the message into ONE of the following categories:\n--- CATEGORIES ---\n{{ $('Add support request categories string').first().json.promptCategories }}\n--- END CATEGORIES ---\n\nReturn your complete analysis as a single, clean JSON object with the single key \"category\". Include only this JSON object in your response, and no other text or preamble. Here is an example of an output string\n--- OUTPUT EXAMPLE ---\n{\"category\": \"ACCOUNT_SPECIFIC_INQUIRY\"}\n--- END OUTPUT EXAMPLE ---\n\nHere is the inbound message:\n--- INBOUND MESSAGE ---\nNAME: {{ $('Switch for sub-workflow routing by category').item.json.inquirerName }}\nCOMPANY: {{ $('Switch for sub-workflow routing by category').item.json.inquirerCompany }}\nINQUIRY: {{ $('Switch for sub-workflow routing by category').item.json.inquiry }}\n--- END INBOUND MESSAGE ---",
"options": {
"maxTokens": 2048,
"temperature": 0.7
},
"requestOptions": {}
},
"type": "@digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference.digitalOceanGradientServerlessInference",
"typeVersion": 1,
"position": [
2400,
560
],
"id": "5553d969-e049-4065-80d2-f4f1449ef813",
"name": "Determine support inquiry type",
"credentials": {}
},
{
"parameters": {
"jsCode": "let contentString = $input.first().json.choices[0].message.content;\ncontentString = contentString.replace(/```(?:json)?\\n?/, \"\").replace(/```$/, \"\").trim();\n\nconst parsedJson = JSON.parse(contentString);\n\nreturn parsedJson;"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
2624,
560
],
"id": "56532068-1c06-44c9-9899-4222dbd10c06",
"name": "Extract and format LLM response (Support inquiry type)"
},
{
"parameters": {
"content": "## Sub-category classification\n\nCategorize the support inquiry into a sub-category, just as we did in the initial flow (red block)",
"height": 112,
"width": 608
},
"type": "n8n-nodes-base.stickyNote",
"position": [
2080,
416
],
"typeVersion": 1,
"id": "d3bc02dc-5c8a-4889-ba79-680be5a31caa",
"name": "Sticky Note27"
},
{
"parameters": {
"content": "# Product questions (Retrieval Augmented Generation - RAG)",
"height": 1488,
"width": 2208,
"color": 2
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
3232,
976
],
"id": "f363c22b-87b5-4982-858f-e95ed031b994",
"name": "Sticky Note12"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.category }}",
"rightValue": "={{ $('Define inquiry categories').item.json.categoriesArray[0].id }}",
"operator": {
"type": "string",
"operation": "equals"
},
"id": "b75101b0-807d-4944-8a74-fe7ae33aefd2"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Sales inquiry"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "ecb30a1e-013e-4409-93f6-179cb60ed3d6",
"leftValue": "={{ $json.category }}",
"rightValue": "SUPPORT_REQUEST",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Support inquiry"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "132a032a-5bcc-4a10-ab52-da69e4d40f45",
"leftValue": "={{ $json.category }}",
"rightValue": "GENERAL_QUESTION",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "General inquiry"
}
]
},
"options": {
"fallbackOutput": "extra"
}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
1424,
-32
],
"id": "201b7679-50ac-424f-ae0e-da1c42c413df",
"name": "Switch for sub-workflow routing by category"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"leftValue": "={{ $json.category }}",
"rightValue": "={{ $('Add support request categories string').item.json.categoriesArray[0].id }}",
"operator": {
"type": "string",
"operation": "equals"
},
"id": "48338626-0017-4491-b1a4-401cd38605a1"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Account specific inquiry"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "31ee7f79-0115-4abc-a4b6-50b99cb9fd68",
"leftValue": "={{ $json.category }}",
"rightValue": "={{ $('Add support request categories string').item.json.categoriesArray[1].id }}",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Product help"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "6020dbba-a15c-4c33-834c-d35a91032032",
"leftValue": "={{ $json.category }}",
"rightValue": "={{ $('Add support request categories string').item.json.categoriesArray[2].id }}",
"operator": {
"type": "string",
"operation": "equals",
"name": "filter.operator.equals"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Other"
}
]
},
"options": {
"fallbackOutput": "extra"
}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.2,
"position": [
2832,
528
],
"id": "cdf7e673-7e2d-4060-ba40-b41fe5c2ab25",
"name": "Switch"
},
{
"parameters": {
"formTitle": "Contact us",
"formDescription": "Let us know how we can help!\n\nLeave your information and our team will get back to you",
"formFields": {
"values": [
{
"fieldLabel": "Name",
"placeholder": "John Smith",
"requiredField": true
},
{
"fieldLabel": "Company",
"plac
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Inquiry-Agent. Uses @digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference, stopAndError, googleDocs, gmail. Event-driven trigger; 88 nodes.
Source: https://github.com/do-community/n8n-crash-course/blob/main/lessons/lesson_9/inquiry-agent.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Alfred (funcional). Uses gmailTool, googleCalendarTool, gmail, embeddingsOpenAi. Event-driven trigger; 83 nodes.
Inquiry-Agent. Uses @digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference, stopAndError, googleDocs, gmail. Event-driven trigger; 80 nodes.
Agent IA Projet Client. Uses executeWorkflowTrigger, lmChatOpenAi, toolWorkflow, vectorStoreQdrant. Event-driven trigger; 79 nodes.
Inquiry-Agent. Uses @digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference, stopAndError, googleDocs, gmail. Event-driven trigger; 77 nodes.
Inquiry-Agent. Uses @digitalocean/n8n-nodes-digitalocean-gradient-serverless-inference, stopAndError, googleDocs, gmail. Event-driven trigger; 73 nodes.