Opening Problem Statement
Meet Sarah, a product support manager who oversees dozens of active issues in Linear every day. She spends hours manually scanning through the comments on each ticket, trying to gauge whether customers are satisfied or frustrated. This process is time-consuming, prone to errors, and often reactive — by the time she spots a negative mood, the issue may have already escalated, costing her team valuable time and customer goodwill.
Sarah needs a better system to monitor the sentiment of ongoing conversations on issue tickets — one that automatically detects when discussion turns negative and alerts her team early enough to intervene. Without this, she risks missing critical early warning signs, leading to unhappy customers and unresolved bottlenecks.
What This Automation Does
This specific n8n workflow continuously monitors updated Linear issue comments, performs AI-powered sentiment analysis, tracks sentiment changes in Airtable, and alerts your team in Slack about any issue shifting to a negative mood. When this automation runs, it:
- Fetches recently updated issues from Linear (within the last 30 minutes) using GraphQL queries.
- Extracts and analyzes the sentiment of comments for each issue via OpenAI-powered information extraction.
- Updates or inserts the sentiment data and issue details into Airtable for centralized tracking, moving previous sentiment to a separate field for historical comparison.
- Detects transitions from non-negative to negative sentiment to catch potentially escalating problems.
- Deduplicates notifications to avoid alert fatigue when the same negative transition is repeatedly detected.
- Sends detailed Slack messages to a designated channel highlighting issues that require immediate attention.
This workflow saves Sarah hours of manual sentiment monitoring each day and provides her team with timely notifications to proactively address customer dissatisfaction.
Prerequisites ⚙️
- n8n account configured with OpenAI API credentials for sentiment extraction.
- Linear.app account with API access to fetch issue data via GraphQL.
- Airtable account with a base and table to store sentiment data (at minimum, the columns for Issue ID, Current Sentiment, Previous Sentiment, Summary, Assignee, Issue Title, Created and Updated dates).
- Slack workspace and a channel set up for notifications with a configured Slack API token.
- Basic familiarity with n8n to import and set credentials for respective nodes.
Step-by-Step Guide to Setting Up This Workflow
1. Set up the Schedule Trigger to Fetch Updates Regularly
In n8n, add the Schedule Trigger node. Configure it to trigger every 30 minutes to check for recently updated Linear issues. This ensures near real-time sentiment tracking.
You should see the trigger firing at regular intervals in the Workflow Execution logs.
Common mistake: Forgetting to activate the workflow after setting the trigger will prevent it from running automatically.
2. Configure the GraphQL Node to Fetch Updated Issues from Linear
Add the GraphQL node and connect it to the Schedule Trigger. Enter the following query to fetch issue details updated in the last 30 minutes:
=query (
$filter: IssueFilter
) {
issues(
filter: $filter
) {
nodes {
id
identifier
title
description
url
createdAt
updatedAt
assignee {
name
}
comments {
nodes {
id
createdAt
user {
displayName
}
body
}
}
}
}
}Set the API endpoint to https://api.linear.app/graphql and authenticate with your Linear API token via HTTP Header Auth.
Enter variables to filter updated issues by timestamp:
= {
"filter": {
updatedAt: { gte: $now.minus(30, 'minutes').toISO() }
}
}Common mistake: Incorrect ISO format in the variable or wrong API token will result in failed queries or empty results.
3. Split Out Issues for Individual Processing
Use the SplitOut node configured with data.issues.nodes as the field to split. This separates each issue so it can be analyzed individually.
You should see each issue emitting as a separate item downstream.
4. Extract Sentiment from Issue Comments Using OpenAI
Connect the output to an Information Extractor node (from the LangChain package integrated with n8n) configured to analyze the comments. Pass a string concatenating each comment like:
={{
$json.comments.nodes.map(node => [
`${node.user.displayName} commented on ${node.createdAt}:`,
node.body
].join('n')).join('---n')
}}Set the extractor’s attributes as:
- sentiment (required): one of positive, negative, or neutral
- sentimentSummary: descriptive summary of the conversation’s sentiment
This node leverages OpenAI to determine the overall mood of the issue discussion.
Important: Configure OpenAI credentials in the OpenAI Chat Model node which feeds into this extractor.
5. Combine Sentiment Analysis with Issue Data
Use a Set node to merge the sentiment analysis output back with the original issue data for full context.
Example JSON output expression:
={{
{
...$('Issues to List').item.json,
...$json.output
}
}}6. Process Each Issue in Batches
Use the SplitInBatches node to handle issues one by one and connect to the next steps.
7. Fetch Existing Sentiment Records from Airtable
Add an Airtable node configured to search your Airtable base and table for records matching the current issue’s ID (using the filter formula ={Issue ID} = '{{ $json.identifier || 'XYZ' }}').
This helps determine if the issue already exists in your sentiment tracking database.
8. Update or Create Sentiment Records in Airtable
Connect the output to another Airtable node set to upsert records. Map fields such as:
- Issue ID
- Issue Title
- Issue Created and Updated timestamps
- Assignee name
- Current Sentiment (capitalized)
- Previous Sentiment (or ‘N/A’ if new)
- Sentiment Summary
This maintains a historical record of sentiment transitions per issue.
9. Use Airtable Trigger to Watch for Sentiment Updates
When any row in Airtable’s current sentiment column updates, the Airtable Trigger fires the workflow. This enables real-time reactions to sentiment shifts.
10. Detect Sentiment Transitions with Switch Node
Use the Switch node to filter for cases where sentiment changed from any non-negative state to negative:
= {{$json.fields["Previous Sentiment"] !== 'Negative' && $json.fields["Current Sentiment"] === 'Negative' }}This pinpoints issues where the mood worsened and may need urgent attention.
11. Remove Duplicate Notifications to Avoid Repeat Alerts
The Remove Duplicates node filters out repeated alerts by combining Issue ID and Last Modified timestamp, ensuring only unique notifications are sent.
12. Send Slack Notifications for Negative Sentiment Transitions
The final Slack node sends a nicely formatted message to a configured channel, listing all issues with newly transitioned negative sentiment. It includes clickable links to the Linear issue and sentiment summaries, so the team can quickly investigate.
Customizations ✏️
- Modify the GraphQL query filter in the “Fetch Active Linear Issues” node to target specific teams, labels, or issue types relevant to your project needs.
- Adjust sentiment values or add new tags in the Information Extractor node by expanding attribute options, enabling nuanced sentiment classifications like “very negative” or “needs attention.”
- Customize Slack notification formatting by editing the message blocks JSON in the Slack node to include additional metadata, such as issue priority or assignee contact info.
- Set batch size in the “For Each Issue…” SplitInBatches node to optimize performance and API rate limits based on your Linear issue volume.
- Add email notifications or integrate with other communication tools like Microsoft Teams by adding respective nodes triggered after sentiment detection.
Troubleshooting 🔧
Problem: “GraphQL query returns no issues or empty array”
Cause: Incorrect timestamp filter in query or invalid Linear API token.
Solution: Double-check ISO date formatting in variables and verify API token validity in credentials settings.
Problem: “OpenAI node fails or returns incomplete sentiment data”
Cause: Missing or incorrect OpenAI API key or API quota exceeded.
Solution: Confirm API key setup in credentials, check usage limits on your OpenAI account, and retry the node.
Problem: “Airtable upsert node doesn’t update existing records”
Cause: Matching columns or filter formula is incorrect or missing.
Solution: Ensure the “Issue ID” column is set as match column and the formula matches the exact identifier field.
Pre-Production Checklist ✅
- Confirm Linear API credentials are valid and have necessary permissions.
- Verify your Airtable base and table schema matches expected fields (Issue ID, Current/Previous Sentiment, Summary, etc.).
- Test the OpenAI API node independently with sample comments to verify correct sentiment extraction.
- Run the workflow manually and inspect issue data flow and transformations step-by-step.
- Set up Slack credentials and test sending messages to your chosen channel before going live.
Deployment Guide
After confirming all nodes and credentials are set up, activate the workflow in n8n to enable automatic runs every 30 minutes. Monitor initial runs through the execution history to ensure issues are fetched and processed correctly.
You may optionally set up error notifications or logging nodes to track failures robustly in production.
FAQs
Q: Can I use a different sentiment analysis tool instead of OpenAI?
A: Yes, but you will need to replace or modify the Information Extractor node to connect to your preferred AI or sentiment API.
Q: Does this workflow use many API calls?
A: It queries Linear every 30 minutes and invokes OpenAI once per updated issue, so plan your API budget accordingly.
Q: Is my data secure?
A: n8n encrypts credentials and supports secure connections; ensure also that Airtable and Slack permissions are appropriately configured.
Conclusion
By implementing this automated n8n workflow, Sarah has significantly streamlined how her team monitors customer sentiment on Linear issues. The system quickly highlights tickets where the mood turns negative, empowering the team to respond faster and more effectively.
This saves her hours every week of manual monitoring and reduces the risk of customer dissatisfaction escalating unnoticed. Next, she might consider automations for automated issue assignment or priority escalation based on sentiment scores to further improve workflow efficiency.
With these tools in place, you too can turn raw issue conversations into actionable insights that keep your support operations proactive and responsive.