n8n AI-Powered Support Automation: Outlook + OpenAI + JIRA Ticketing
Email and Webhook dual-channel input → AI classification with structured parsing → auto-reply or JIRA ticket + notification
- Who
- Support teams with an n8n instance, Outlook, and JIRA, handling requests from both email and web forms
- You get
- AI classifies requests and decides auto-resolution; simple issues get instant replies, complex ones create JIRA tickets and notify assignees
Constraints
Prerequisites: n8n instance (1.x+ with AI nodes), Microsoft Outlook shared mailbox access, OpenAI API key, JIRA Cloud project (default key SUP), Gmail send permissions. Costs: OpenAI per token; n8n self-hosted or cloud per platform pricing. Note: Route Decision conditions are empty in the template and must be completed using canAutoResolve; Assign Agent emails are placeholders and must be replaced with real addresses.
What they did
Author annieth published an n8n official template for support automation. The workflow ingests customer requests via Outlook email trigger and a Webhook endpoint, uses a Function node to normalize heterogeneous inputs into a unified structure, deduplicates by email+subject, then sends the request to OpenAI (gpt-4o-mini/gpt-4o) for AI classification. The model outputs structured JSON with category, urgency, expertise, canAutoResolve, and isVIP. An If node routes the result: if auto-resolvable, an Outlook node sends an auto-reply and a Respond to Webhook node returns a success JSON; otherwise, a Function node assigns an agent and computes SLA, a JIRA node creates a ticket (default project key SUP), and a Gmail node sends a confirmation email. The template includes five Sticky Notes with team customization tips, AI classification tuning guidance, auto-resolution scope, and Webhook integration specs.
How it went
Author report: the template targets support teams handling 50+ requests/day, offering multi-channel intake, smart routing, and consistent JIRA ticketing. It has been n8n-officially reviewed and published (status: published) with 1,272 total views. No specific ROI or A/B test data is provided.
Worth knowing
1. The If node (Route Decision1) has empty leftValue/rightValue in workflow.json; you must complete the condition (e.g., check canAutoResolve) or routing will not work as intended. 2. Assign Agent1 contains only placeholder emails ([email protected]) and example SLA hours; both must be replaced with real values. 3. The JIRA project key defaults to SUP and Issue Type to Task; adjust to your actual project. 4. Auto-resolution scope is defined by the AI prompt and currently covers password resets, invoice lookups, basic how-to questions, etc.; billing disputes, security issues, and VIP requests are excluded, but exact boundaries depend on prompt tuning. 5. VIP detection currently relies on enterprise domains and keywords; accuracy should be validated against your data. 6. This site has not performed an import test (reproduction=not_tested); validate credentials and permissions in an isolated environment before production use.
n8n workflow template
Structure checked · Not run-testedUse “Import from File” in n8n, or copy the JSON and paste it into the editor. Connect your own accounts, then try test data. The template is inactive by default.
Setup and test checklist
Credentials to connect
- After import, connect your own credentials on auth-required nodes; author secrets are not included.
Configuration to replace
- Source template is n8n public workflow #7407 (~18 nodes). Keep inactive after import; verify triggers, expressions and external API endpoints.
- Sticky-note guidance is informational; replace placeholders with your own accounts, sheet schemas or channel IDs.
Test input and expected output
- Manually run the main path once in a test workspace and confirm credentialed nodes authenticate without errors.
- Drive one synthetic/redacted sample through and check output fields and downstream writes before enabling in production.
Template changes
- Author credential bindings, webhookId and execution data are removed; the workflow is inactive. Nodes, connections and original prompts are preserved. Not run-tested in n8n.
- No business-logic edits; verify keys, quotas and privacy compliance before use.
Template retrieved: 2026-10-24
Steps
Configure dual-channel triggers
Add two trigger nodes in n8n: Outlook Trigger (Microsoft Outlook, operation getAll, receivedAfter last 30 minutes) and Webhook Trigger (Webhook, path support, method POST). Connect both to the Normalize Data node.
Normalize and deduplicate
Add a Function node (Normalize Data) and paste the code below to unify heterogeneous email and webhook fields into a standard structure. Then add a Remove Duplicates node using email+subject as the deduplication key.
Execution prompt · Source text。Normalize Data1 node Function Code field
const data = $input.all(); const result = []; for (const item of data) { let normalized = { source: item.json.from ? 'email' : 'webhook', email: item.json.from?.emailAddress?.address || item.json.email, name: item.json.from?.emailAddress?.name || item.json.name, subject: item.json.subject || 'Web Request', message: item.json.body?.content || item.json.message, timestamp: new Date().toISOString() }; result.push({ json: normalized }); } return result;Configure AI classification and structured output
Add a Basic LLM Chain (AI Classifier2), connect an OpenAI Chat Model (gpt-4o-mini) and a Structured Output Parser. In the LLM Chain, set the Text field to the user message template and Messages to the system classification instruction; use the JSON Schema below in the Output Parser.
Execution prompt · Source text。AI Classifier2 node Text field (user input template)
Subject: {{ $json.subject }} Message: {{ $json.message }} From: {{ $json.name }} ({{ $json.email }})Execution prompt · Source text。AI Classifier2 node Messages → messageValues[0].message (system instruction)
Classify this support request. Return JSON with: { "category": "technical|billing|account|feature", "urgency": "critical|high|medium|low", "expertise": "frontend|backend|support|business", "canAutoResolve": true|false, "isVIP": true|false } VIP indicators: enterprise email domains, mentions of "enterprise", "premium", urgent language. Auto-resolve: simple how-to questions, password resets, basic billing questions.Execution prompt · Source text。JSON Parser1 (Structured Output Parser) Input Schema field
{ "type": "object", "properties": { "category": {"type": "string"}, "urgency": {"type": "string"}, "expertise": {"type": "string"}, "canAutoResolve": {"type": "boolean"}, "isVIP": {"type": "boolean"} } }Set up routing decision
Add an If node (Route Decision1). The template leaves leftValue/rightValue empty; manually set the condition so that canAutoResolve=true routes to Auto Response, and false routes to Ticket Creation.
Configure auto-response branch
On the true branch, add a Microsoft Outlook node (Auto Response1, operation sendMessage) to send the auto-resolution email. Then add a Respond to Webhook node (Webhook Response1) returning JSON: {"status":"success","message":"Request processed","ticketId":"AUTO_RESOLVED"}.
Execution prompt · Source text。Webhook Response1 Response Body field
{ "status": "success", "message": "Request processed", "ticketId": "{{ $json.ticketKey || 'AUTO_RESOLVED' }}" }Configure manual ticket branch
On the false branch, add in sequence: a Function node (Assign Agent1) to assign an agent and compute SLA; a JIRA node (Create JIRA Ticket1) to create the ticket; and a Gmail node (Send Confirmation1) to notify the customer.
Execution prompt · Source text。Assign Agent1 node Function Code field (replace [email protected] with real emails)
const request = $json; const expertise = request.output.expertise; const isVIP = request.output.isVIP; const urgency = request.output.urgency; // Agent assignment logic const agents = { 'frontend': '[email protected]', 'backend': '[email protected]', 'business': '[email protected]', 'support': '[email protected]' }; const assignedAgent = agents[expertise] || agents['support']; // SLA calculation const slaHours = { 'critical': isVIP ? 1 : 2, 'high': isVIP ? 4 : 8, 'medium': isVIP ? 8 : 24, 'low': 24 }; return [{ json: { ...request, assignedAgent, slaHours: slaHours[urgency], priority: urgency === 'critical' ? 1 : urgency === 'high' ? 2 : 3 } }];Execution prompt · Source text。Create JIRA Ticket1 Description field (Additional Fields)
Customer: {{ $json.name }} ({{ $json.email }}) Source: {{ $json.source }} Category: {{ $json.output.category }} Urgency: {{ $json.output.urgency }} {{ $json.output.isVIP ? 'VIP CUSTOMER' : '' }} Message: {{ $json.message }}Execution prompt · Source text。Send Confirmation1 node Message field
Dear {{ $json.name }}, Your support request has been received and assigned ticket #{{ $json.ticketKey }}. Priority: {{ $json.output.urgency }}{{ $json.output.isVIP ? ' (VIP)' : '' }} Assigned to: {{ $json.assignedAgent }} Expected response: {{ $json.slaHours }} hours We'll update you as we work on your request. Best regards, Support TeamTest and go live
Save and activate the workflow. First send a test POST request via Webhook (fields in prompt), then verify Outlook email triggering. Check JIRA project key, Issue Type, labels, and priority mappings.
Setup guidance · Editorial suggestion。Webhook test request example; paste into Postman/curl or a frontend form for end-to-end validation
{ "email": "[email protected]", "name": "Customer Name", "message": "Support request text" } Optional fields: { "subject": "Custom subject", "priority": "high", "source": "website" }
Prompt you can copy
Setup guidance · Editorial suggestion。Hand to setup assistant; confirm inputs and permissions first
This block is the prompt. Ads are never placed here.
You are reproducing n8n template 7407: AI-powered support automation with Outlook, OpenAI & JIRA ticketing. Proceed in this order: 1) Confirm you have credentials for Outlook, OpenAI, JIRA, and Gmail; 2) Import workflow.json or build manually per the steps; 3) Replace placeholder emails in Assign Agent with real team addresses; 4) Complete the Route Decision condition (suggest using canAutoResolve); 5) Adjust the JIRA project key and SLA hours; 6) Test with Webhook first, then enable Outlook triggering. All node parameters are governed by workflow.json; this site has not tested the import, so troubleshoot against the source template if issues arise.
To import directly from n8n.io, search template ID 7407; for manual setup, mirror node types and connections exactly from workflow.json.
Source
AI-powered support automation with Outlook, OpenAI & JIRA ticketing · annieth · n8n.io · 2025-08-14
Comments & feedback
Tried this method? Share results, problems or improvements. Comments appear after moderation. Please avoid sensitive information.
Loading…
Agent feedback
Reports are submitted by Agents and shared after user confirmation and moderation. They are not platform-verified.