Jira + Slack: keep stale tickets from piling up
Stale Jira tickets don’t look scary. Until they do. A few “I’ll get to it later” issues quietly turn into a backlog you can’t trust, and suddenly nobody knows what’s actually urgent.
This hits support leads first, but ops managers and project owners feel it too. With this Jira Slack automation, long-lived unresolved issues get reviewed daily, summarized, and either closed safely or escalated to Slack when something looks risky.
Below, you’ll see how the workflow runs, what it automates, and what outcomes you can expect when “forgotten tickets” stop being a weekly fire drill.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Jira + Slack: keep stale tickets from piling up
flowchart LR
subgraph sg0["Execute Workflow Flow"]
direction LR
n0@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model3", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model4", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jira.svg' width='40' height='40' /></div><br/>Get Issue Comments"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jira.svg' width='40' height='40' /></div><br/>Close Issue"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jira.svg' width='40' height='40' /></div><br/>Send Reminder"]
n8@{ icon: "mdi:cog", form: "rounded", label: "Join Comments", pos: "b", h: 48 }
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jira.svg' width='40' height='40' /></div><br/>Add Autoclose Message"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jira.svg' width='40' height='40' /></div><br/>Ask For Feedback Message"]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Simplify Thread For AI", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Solution Found?", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jira.svg' width='40' height='40' /></div><br/>Reply to Issue"]
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Last Message is Not Bot", pos: "b", h: 48 }
n15@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-vertical", form: "rounded", label: "Get Issue Metadata", pos: "b", h: 48 }
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Notify Slack Channel"]
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jira.svg' width='40' height='40' /></div><br/>Close Issue2"]
n21@{ icon: "mdi:play-circle", form: "rounded", label: "Execute Workflow Trigger", pos: "b", h: 48 }
n22@{ icon: "mdi:robot", form: "rounded", label: "Customer Satisfaction Agent", pos: "b", h: 48 }
n23@{ icon: "mdi:robot", form: "rounded", label: "KnowledgeBase Agent", pos: "b", h: 48 }
n24@{ icon: "mdi:robot", form: "rounded", label: "Issue Reminder Agent", pos: "b", h: 48 }
n25@{ icon: "mdi:cog", form: "rounded", label: "Find Simlar Issues", pos: "b", h: 48 }
n26@{ icon: "mdi:database", form: "rounded", label: "Query KnowledgeBase", pos: "b", h: 48 }
n27["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Report Unhappy Resolution"]
n28@{ icon: "mdi:robot", form: "rounded", label: "Classify Current Issue State", pos: "b", h: 48 }
n8 --> n11
n13 --> n18
n12 --> n13
n12 --> n17
n0 -.-> n28
n25 -.-> n23
n5 --> n8
n16 --> n5
n1 -.-> n23
n2 -.-> n24
n3 -.-> n22
n23 --> n12
n26 -.-> n23
n24 --> n7
n17 --> n13
n9 --> n6
n11 --> n28
n14 --> n24
n10 --> n6
n21 --> n16
n15 -.-> n23
n22 --> n10
n22 --> n9
n22 --> n27
n28 --> n22
n28 --> n14
n28 --> n23
end
subgraph sg1["Schedule Flow"]
direction LR
n4@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/jira.svg' width='40' height='40' /></div><br/>Get List of Unresolved Long .."]
n20@{ icon: "mdi:cog", form: "rounded", label: "Execute Workflow", pos: "b", h: 48 }
n4 --> n19
n19 --> n20
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n21,n4 trigger
class n15,n22,n23,n24,n28 ai
class n0,n1,n2,n3 aiModel
class n12,n14 decision
class n26 database
classDef customIcon fill:none,stroke:none
class n5,n6,n7,n9,n10,n13,n17,n18,n27,n19 customIcon
The Problem: Stale Jira Issues Quietly Wreck Your Queue
Most teams don’t “choose” to let tickets rot. It happens because the work is messy: long comment threads, unclear ownership, customers who go quiet, internal blockers, and a dozen edge cases that make closing feel risky. So the ticket stays open “just in case.” Then another one. Then fifty. The cost isn’t only time spent re-reading old threads. It’s the constant doubt about what’s real, what’s urgent, and what will come back to bite you right before an SLA breach.
It adds up fast. Here’s where it breaks down in day-to-day support and ops work.
- Someone has to open each old issue, scan comments, and figure out the current status from scratch.
- Closing tickets feels dangerous, so “resolved” work stays open and inflates your backlog.
- Negative customer sentiment gets missed because it’s buried in a thread, not surfaced to the team.
- Reminders don’t happen consistently, which means blocked issues sit idle for weeks.
The Solution: Daily AI Review + Safe Auto-Close With Slack Escalation
This workflow runs on a schedule (daily) and pulls Jira issues that are older than about 7 days and not in “Done.” For each issue, it gathers the full comment history, then compiles that into a clean thread summary so an AI classifier can judge what’s actually going on. If the issue looks resolved, it runs sentiment analysis to check whether the customer sounds unhappy. Negative cases get escalated to Slack for a human to review. If the sentiment looks fine, the workflow adds the right “auto-close” notes, requests feedback when appropriate, and closes the issue automatically. If the issue isn’t resolved, the automation can draft a reminder comment or attempt to resolve using similar issues and a knowledgebase search (with Notion as a source, if you choose to connect it).
The workflow starts with a daily stale-issue search in Jira. From there it processes each issue in a sub-workflow so you can handle many tickets in parallel without the whole run slowing down. Finally, it either closes the issue safely or alerts a Slack channel when it sees risk signals.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say your queue has 40 tickets older than 7 days. A human skim is often 6 minutes each between opening the issue, scanning comments, and deciding what to do, so that’s about 4 hours of “catch-up” work. With this workflow, the daily trigger runs automatically, AI summarizes and classifies each issue in the background, and Slack only pings you for the handful that look negative or unclear. In practice, you spend maybe 20 minutes reviewing escalations instead of burning half a day on old threads.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Jira to search, comment, and close issues.
- Slack to alert a channel for risky tickets.
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect Jira/Slack credentials, set a Jira search filter, and adjust AI prompts for your support policy.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A daily stale-ticket scan kicks it off. The Schedule Trigger runs once per day, then Jira search pulls unresolved issues older than your threshold (7 days by default).
The workflow rebuilds the story from comments. It fetches issue comments, aggregates them, and prepares a thread summary so the next decision isn’t based on guesswork.
AI decides what the ticket needs next. A classifier assesses issue state (resolved, blocked, waiting, unknown). If it looks resolved, sentiment analysis checks for unhappy language. If it looks stalled, an agent can draft a reminder or attempt a knowledgebase-driven solution using similar resolved issues and (optionally) Notion content.
Tickets get closed or escalated with context. Safe cases receive an auto-close note, a feedback request when appropriate, and then Jira closes the issue. Risky cases create a Slack channel alert first, so a human can step in with the full summary.
You can easily modify the “older than 7 days” filter to match your SLAs, and you can change which Slack channel gets alerted based on project, priority, or customer tier. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Automation Trigger
This workflow starts on a schedule and looks for stale Jira issues before handing off each issue to a sub-workflow.
- Add and open Scheduled Automation Trigger.
- Set the schedule rule in Rule to the interval you want (the default rule is empty and must be defined).
- Connect Scheduled Automation Trigger to Retrieve Stale Issues to start the Jira query on each run.
Step 2: Connect Jira and Configure the Sub-Workflow Handoff
This workflow uses Jira as the primary system and delegates per-issue processing to a sub-workflow.
- Open Retrieve Stale Issues and set Limit to
10. - Set the JQL filter in Retrieve Stale Issues to
status IN ("To Do", "In Progress") AND created <= -7d. - Credential Required: Connect your jiraSoftwareCloudApi credentials to Retrieve Stale Issues.
- Open Run Sub-Workflow (Configure Required) and set Mode to
each. - Choose the target workflow in Workflow ID (this field is empty by default and must be selected).
- In the sub-workflow, begin with Sub-Workflow Trigger and connect it to Extract Issue Details.
Credential Required: Connect your jiraSoftwareCloudApi credentials to all Jira action nodes (8+ nodes handle issue retrieval, comments, and status updates).
Step 3: Extract Issue Data and Build the Thread Summary
The sub-workflow normalizes issue fields and combines the full comment thread for analysis.
- In Extract Issue Details, set the following fields using expressions: key to
{{ $json.key }}, title to{{ $json.fields.summary }}, url to{{ ['https:/',$json.self.extractDomain(),'browse',$json.key].join('/') }}, date to{{ DateTime.fromISO($json.fields.created).format('yyyy-MM-dd') }}, reporter to{{ $json.fields.reporter.displayName }}, reporter_url to{{ ['https:/',$json.fields.reporter.self.extractDomain(),'jira','people',$json.fields.reporter.accountId].join('/') }}, reporter_accountId to{{ $json.fields.reporter.accountId }}, and description to{{ $json.fields.description }}. - Open Fetch Issue Comments and set Issue Key to
{{ $json.key }}, Resource toissueComment, and Operation togetAll. - Credential Required: Connect your jiraSoftwareCloudApi credentials to Fetch Issue Comments.
- Open Combine Comment Records and set Aggregate to
aggregateAllItemData. - In Prepare Thread Summary, keep the thread assignment expression and the topic assignment expression intact to build the AI-ready summary from comments and issue metadata.
Step 4: Set Up AI Analysis and Knowledgebase Resolution
AI models classify issue state, draft reminders, and search for solutions using the knowledgebase.
- Open Assess Issue State and keep Input Text as
=issue: {{ $('Prepare Thread Summary').item.json.topic }} comments: {{ $('Prepare Thread Summary').item.json.thread.join('\n') || 'There are no comments' }}. - Open Knowledgebase Resolver and keep Text set to
=issue: {{ $('Prepare Thread Summary').item.json.topic }} comments: {{ $('Prepare Thread Summary').item.json.thread.join('\n') }}, and ensure Prompt Type isdefinewith Has Output Parser enabled. - Open Structured Output Reader and keep Input Schema as the provided JSON schema for
solution_found,short_summary_of_issue, andresponse. This parser is connected to Knowledgebase Resolver; add credentials to the parent model node, not the parser. - Open Search Similar Issues and verify the JQL uses
text ~ "{{ $fromAI('title', 'the title of the current issue', 'string', '') }}" AND status IN ("In Progress", "Done"). This tool is attached to Knowledgebase Resolver; add credentials to the parent AI node, not the tool. - Open Search Knowledgebase and keep Text set to
{{ $fromAI('search_terms', 'relevant terms to search for information on the current issue', 'string', '') }}with Limit4. This tool is attached to Knowledgebase Resolver; add credentials to the parent AI node, not the tool. - Open Reminder Draft Agent and keep Text set to
=issue: {{ $('Prepare Thread Summary').item.json.topic }} comments: {{ $('Prepare Thread Summary').item.json.thread }}. - Open Customer Sentiment Agent and keep Input Text set to
=issue: {{ $('Prepare Thread Summary').item.json.topic }} comments: {{ $('Prepare Thread Summary').item.json.thread.join('\n') }}. - Credential Required: Connect your openAiApi credentials to AI Chat Engine, AI Chat Engine B, AI Chat Engine C, and AI Chat Engine D (each uses
gpt-4o-mini). - Credential Required: Connect your notionApi credentials for knowledgebase access (tooling is used by Knowledgebase Resolver).
Step 5: Configure Conditional Routing and Parallel Logic
The workflow evaluates resolution state, detects human replies, and routes to different actions.
- Open Solution Detected? and keep the condition set to
{{ $json.output.solution_found }}equalstrue. - Open Check Last Message Human and keep the condition set to
{{ !$('Prepare Thread Summary').item.json.thread.last().includes('this is an automated message') }}. - Ensure Assess Issue State fans out to Customer Sentiment Agent, Check Last Message Human, and Knowledgebase Resolver in parallel to evaluate sentiment, reminders, and resolution simultaneously.
- Confirm Customer Sentiment Agent outputs to Request Feedback Note, Append Autoclose Note, and Report Negative Resolution in parallel for multi-path handling of outcomes.
Step 6: Configure Output Actions (Jira & Slack)
Action nodes post comments, close issues, and notify Slack based on analysis results.
- In Post Reminder Comment, set Comment to
{{ $json.text }} (this is an automated message)and Issue Key to{{ $('Extract Issue Details').item.json.key }}. - In Respond on Issue, set Comment to
=Hey there! {{ $('Knowledgebase Resolver').item.json.output.response }} We'll close this issue now but feel free to create a new one if needed. (this is an automated message)and Issue Key to{{ $('Extract Issue Details').item.json.key }}. - In Request Feedback Note, keep the mention line using
{{ $('Extract Issue Details').item.json.reporter_accountId }}and the issue key{{ $('Extract Issue Details').item.json.key }}. - In Append Autoclose Note, keep the comment text and set Issue Key to
{{ $('Extract Issue Details').item.json.key }}. - In Resolve Issue Record and Finalize Issue Closure, ensure Status ID is set to
31(Done) and Issue Key uses{{ $('Extract Issue Details').item.json.key }}. - In Slack Channel Alert and Report Negative Resolution, replace Channel ID
[YOUR_ID]with your Slack channel and keep the Blocks UI message template intact. - Credential Required: Connect your slackApi credentials to Slack Channel Alert and Report Negative Resolution.
⚠️ Common Pitfall: If your Jira workflow uses a different status ID for “Done,” update the Status ID in Resolve Issue Record and Finalize Issue Closure accordingly to avoid failed updates.
Step 7: Test and Activate Your Workflow
Validate the full flow using a real stale issue before enabling the schedule.
- Manually execute Scheduled Automation Trigger to run the workflow once.
- Verify that Retrieve Stale Issues returns up to
10issues matching the JQL filter and that Run Sub-Workflow (Configure Required) triggers the sub-workflow for each issue. - Confirm that comments are fetched, summaries are generated, and AI nodes produce outputs in Assess Issue State, Knowledgebase Resolver, and Customer Sentiment Agent.
- Check Jira issues for posted comments from Post Reminder Comment, Respond on Issue, Request Feedback Note, and Append Autoclose Note, and verify status updates from Resolve Issue Record and Finalize Issue Closure.
- Confirm Slack notifications appear from Slack Channel Alert or Report Negative Resolution when appropriate.
- Once validated, activate the workflow so Scheduled Automation Trigger runs on your defined schedule.
Common Gotchas
- Jira credentials can expire or lack “transition issue” permissions. If closures fail, check the Jira connection in n8n and confirm the account can move issues to Done/Closed.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About an hour if your Jira, Slack, and OpenAI accounts are ready.
No. You’ll mainly connect accounts and edit a Jira search query. The “hard part” is deciding your closure rules, not writing code.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API usage, which is usually a few dollars a month for most small support queues.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but do it in the Jira search that retrieves stale issues. Change the “older than 7 days” condition in the Retrieve Stale Issues step, then keep the rest of the logic the same. Common tweaks include using 3 days for high-priority projects, excluding certain labels, or only auto-closing tickets in specific statuses (like “Waiting on Customer”).
Most of the time it’s permissions or an expired token. Reconnect Jira in n8n, then confirm the account can read comments and transition issues to your closing status. If it fails only on some projects, check project-level permissions and any workflow conditions in Jira that block transitions without required fields.
On n8n Cloud Starter you can run thousands of executions per month, which is plenty for a daily stale-ticket sweep in most small teams. If you self-host, there’s no execution cap, so it mostly depends on your server and the time spent waiting on Jira and OpenAI responses. Practically speaking, processing a few dozen stale issues per day is comfortable, and the sub-workflow design helps when the backlog is bigger.
Often, yes. This workflow uses branching logic, sub-workflows for parallel processing, and AI classification plus sentiment checks, which can get awkward (and pricey) in simpler automation tools. n8n also gives you the option to self-host, which matters when daily runs turn into lots of tasks. If you only need “send a Slack message when a Jira ticket is old,” Zapier or Make can be fine. If you want safe auto-close with guardrails, this is the cleaner fit. Talk to an automation expert if you want help choosing.
Once this is running, stale tickets stop being a mystery backlog and start becoming a daily, manageable decision stream. The workflow handles the repetitive cleanup. You focus on the few cases that actually need human judgment.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.