Linear + Slack: bug tickets routed to the right team
Your bug queue fills up fast. Then the real time drain starts: someone reads the report, guesses an owner, moves the ticket, gets it bounced back, and repeats.
This is the kind of mess product managers feel in sprint planning, but engineering leads and support folks doing intake see it every day too. With Linear Slack routing, new bugs land with the right team automatically, and Slack only gets pinged when the workflow honestly can’t decide.
Below you’ll see exactly how the workflow routes issues, how the AI decision is validated against real Linear teams, and how to set it up so your triage stays calm.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Linear + Slack: bug tickets routed to the right team
flowchart LR
subgraph sg0["Linear Issue Flow"]
direction LR
n0["<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/linear.svg' width='40' height='40' /></div><br/>Linear Issue Trigger"]
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Initialize Team Options", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Unclassified Tickets", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "AI Classification Prompt", pos: "b", h: 48 }
n4["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve Linear Teams"]
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/merge.svg' width='40' height='40' /></div><br/>Combine Data Streams"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Team Selection", pos: "b", h: 48 }
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/slack.svg' width='40' height='40' /></div><br/>Post Slack Alert"]
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assign Team Identifier", 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/linear.svg' width='40' height='40' /></div><br/>Modify Team Assignment"]
n3 --> n5
n1 --> n2
n5 --> n6
n8 --> n9
n0 --> n1
n4 --> n5
n6 --> n8
n6 --> n7
n2 --> n3
n2 --> n4
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 n0 trigger
class n3 ai
class n2,n6 decision
class n4 api
classDef customIcon fill:none,stroke:none
class n0,n4,n5,n7,n9 customIcon
Why This Matters: Bug triage turns into ping pong
When multiple teams share one intake pipeline, “new bug” doesn’t mean “actionable.” Someone still has to check if the description is complete, confirm it’s truly a bug, look at state and labels, and then decide which team owns it. That decision is rarely obvious from the title alone, so triage becomes a context-switch tax. Worse, it’s noisy. People get interrupted in Slack for things that could have been routed quietly, and misrouted tickets sit for days because everybody assumes someone else picked it up.
It adds up fast. Here’s where it breaks down in the real world.
- New issues arrive without enough context, so a human has to chase details before routing.
- Tickets bounce between teams because the first assignment was a guess, not a decision backed by clear criteria.
- Slack gets used as a triage queue, which means important alerts drown in routine housekeeping.
- As volume grows, “we’ll handle triage later” turns into a backlog that quietly blocks real fixes.
What You’ll Build: AI-based Linear routing with Slack exceptions
This workflow watches Linear for issues created or updated in a specific intake team (many companies use a single “Engineering” or “Triage” team first). When a ticket matches your routing criteria, it sends the issue details to an OpenAI GPT-4 prompt that’s been primed with your teams and what they own. The workflow then double-checks the AI’s choice against the actual list of teams pulled from Linear, so it doesn’t assign a made-up name. If the chosen team is valid, the workflow updates the Linear issue’s team property and moves it along. If the AI can’t pick confidently (or the choice doesn’t validate), Slack gets a focused alert so a human can decide quickly, without spamming the channel for every single ticket.
It starts with a Linear issue trigger, filters down to the bugs that are ready for routing, then uses AI classification plus a “does this team exist?” validation step. Finally, it either assigns the correct team in Linear or posts one clean message to Slack for manual triage.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you get about 20 new bugs a week into one shared Linear team. Manually, triage is usually 5 minutes to read, check labels/state, decide ownership, and move it, so you’re looking at roughly 2 hours weekly (and it’s never one clean block of time). With this workflow, the “human time” becomes the exceptions only. If even 4 out of 5 bugs get routed automatically, you’re down to maybe 20 minutes of manual triage for the week, plus the automated processing time running in the background.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Linear for bug intake and team assignment.
- Slack to alert only on unclassified tickets.
- OpenAI API key (get it from the OpenAI dashboard)
Skill level: Beginner. You’ll connect accounts, paste in team definitions, and adjust a few filters to match your Linear setup.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A Linear issue changes. The workflow runs whenever an issue is created or updated in your chosen Linear team, which is typically the shared intake queue.
Only the right tickets continue. It filters for issues that are actually ready for automated routing, such as having a proper description, the correct “bug” label, and sitting in your “Triage” state. Anything else is ignored so you don’t accidentally re-route work-in-progress tickets.
AI picks the best owner. OpenAI (GPT-4) reads the ticket and your internal “who owns what” notes, then returns the most likely team. This is where you’ll get the biggest payoff, because the model can interpret real language, not just rigid keywords.
The workflow validates and acts. n8n pulls the current team list from Linear, checks that the AI’s answer matches a real team name, then updates the issue’s team property. If validation fails, it posts a Slack alert so a human can make the call.
You can easily modify the routing rules (labels, states, required fields) to match how your team triages today. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Linear Trigger
Set up the workflow to start when a new Linear issue is created or updated for the target team.
- Add the Linear Issue Trigger node and set Team ID to
7a330c36-4b39-4bf1-922e-b4ceeb91850a. - Set Authentication to
oAuth2and ensure Resources includesissue. - Credential Required: Connect your linearOAuth2Api credentials.
Step 2: Connect Linear Data and Team Options
Define team options and retrieve the active Linear teams for ID mapping.
- In Initialize Team Options, add the team list under teams with the provided value block and set slackChannel to
#yourChannelName. - In Retrieve Linear Teams, set URL to
https://api.linear.app/graphql, Method toPOST, and enable Send Body. - Set the body parameter query to
{ teams { nodes { id name } } }. - Credential Required: Connect your linearOAuth2Api credentials to Retrieve Linear Teams.
Step 3: Set Up AI Classification
Configure the AI to classify issues into one of the predefined teams.
- In AI Classification Prompt, select the model
gpt-4-32k-0314. - Confirm the system messages include the team list expression
{{ $('Initialize Team Options').first().json.teams }}and issue data expressions for title and description:{{ $('Linear Issue Trigger').first().json.data.title }}and{{ $('Linear Issue Trigger').first().json.data.description }}. - Credential Required: Connect your openAiApi credentials.
Step 4: Configure Filtering and Parallel Processing
Filter issues that need classification and run AI and team retrieval in parallel.
- In Filter Unclassified Tickets, add three conditions: Description does not contain
Add a description hereusing{{ $('Linear Issue Trigger').item.json.data.description }}; State ID equals6b9a8eec-82dc-453a-878b-50f4c98d3e53using{{ $('Linear Issue Trigger').item.json.data.state.id }}; and Label count greater than0using{{ $('Linear Issue Trigger').item.json.data.labels.filter(label => label.id === 'f2b6e3e9-b42d-4106-821c-6a08dcb489a9').length }}. - Filter Unclassified Tickets outputs to both AI Classification Prompt and Retrieve Linear Teams in parallel.
- In Combine Data Streams, set Mode to
chooseBranchto merge AI output and team data correctly.
Step 5: Validate and Route the Result
Validate the AI response, map the team ID, and update the issue or alert Slack.
- In Validate Team Selection, set the condition to check
{{ $json.message.content }}is not equal toOther. - In Assign Team Identifier, set teamId to
{{ $('Retrieve Linear Teams').first().json.data.teams.nodes.find(team => team.name === $json.message.content).id }}. - In Modify Team Assignment, set Operation to
update, Issue ID to{{ $('Linear Issue Trigger').item.json.data.id }}, and teamId to{{ $json.teamId }}. - Credential Required: Connect your linearApi credentials to Modify Team Assignment.
- On the false branch, configure Post Slack Alert with Text
The AI was not able to identify a fitting team for a bugand Channel as{{ $('Initialize Team Options').first().json.slackChannel }}. - Credential Required: Connect your slackApi credentials to Post Slack Alert.
Step 6: Test and Activate Your Workflow
Validate the end-to-end behavior and activate for production use.
- Click Execute Workflow and trigger a sample issue in Linear that matches the filter conditions.
- Successful execution should show a team name in AI Classification Prompt, a valid
teamIdin Assign Team Identifier, and an updated team on the issue in Modify Team Assignment. - If the AI returns
Other, confirm that Post Slack Alert posts to the channel defined in Initialize Team Options. - When satisfied, toggle the workflow to Active to enable real-time classification.
Troubleshooting Tips
- Linear credentials can expire or lack the permission to update issues. If assignments stop working, check the Linear connection in n8n’s Credentials first and confirm it can edit issues and read teams.
- If Slack alerts aren’t showing up, it’s usually a channel or scope issue. Confirm the Slack app is allowed to post in the selected channel and that the channel in your “Set me up” configuration matches where you’re looking.
- Default prompts in AI nodes are generic. Add your team boundaries and examples early or you will be editing outputs forever, and your Slack channel will fill with avoidable “unclear owner” pings.
Quick Answers
About 30 minutes if you already have Linear, Slack, and OpenAI access.
No. You’ll mostly connect accounts and edit a few plain-language fields like team names, labels, and states.
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 typically a few cents per classification depending on prompt size.
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, and you probably should. Most teams start by adjusting the “Initialize Team Options” (Set) node to reflect real ownership boundaries, then tweak the filter that checks for “Bug” label, “Triage” state, and “description present.” You can also swap what happens on failure: keep the Slack alert, create a fallback “Needs Triage” label in Linear, or assign to a default team for later sorting.
Usually it’s credentials or permissions. Reconnect Linear in n8n and confirm the token can read teams and update issues, not just view them. Also check that the team names in your “Initialize Team Options” match Linear exactly, because mismatches can look like a connection error when it’s really a data validation problem.
A typical setup handles hundreds of issues a month without breaking a sweat.
Often, yes, because this isn’t a simple two-step zap. You’ve got filtering rules, an AI classification step, a live fetch of Linear team data, then a validation branch that either updates Linear or posts to Slack. n8n handles that kind of branching cleanly and it’s easier to keep the logic in one place. Self-hosting is a practical advantage too if your ticket volume spikes and you don’t want every extra execution to hurt. Zapier or Make can still work if you simplify the flow (for example, always Slack on new bugs and route manually). If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation for your setup.
Once this is live, most bug tickets route themselves and Slack stays reserved for the tricky edge cases. You get your focus back, and the queue finally behaves.
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.