Bug reports rarely get lost. They get buried.
Slack makes it easy to report a problem and equally easy to forget who should act on it. A workflow to create Linear issue from Slack thread messages turns one marked Slack message into a tracked issue before another day of updates pushes it out of sight.
The rule is easy to remember: if the message needs action, add the ticket reaction. The workflow checks whether a Linear issue already exists, writes a structured summary and creates the ticket only when it is new.
Slack is useful because support, product and engineering can discuss a problem in one place. That same speed creates the problem.
A customer complaint arrives. Someone reacts to show they saw it. Another person replies that they will check later. The conversation then moves on to deployments, meetings and lunch plans.
The message still exists, but it no longer has attention.
A bug reporting workflow gives the team one shared action. Messages that need tracked work receive the ticket reaction, while everything else remains normal Slack discussion.
Example:
A four-person D2C team in Hyderabad receives a complaint about a UPI payment. The customer tried twice, money was deducted and the order did not appear.
The support person posts the complaint in Slack. A developer adds an eyes reaction, and somebody says they will check it after breakfast.
Another customer reports the same issue later. The founder eventually realises that nobody created a Linear ticket.
Three problems caused the gap:
The workflow does not repair the payment system. It makes sure the first useful report becomes tracked work with its context attached.
I build this mainly for Indian solo founders and small product teams of two to fifteen people. These teams often handle support inside Slack while using Linear for planned engineering work.
It also suits:
The setup is less useful when a support desk already creates and manages engineering tickets properly. It works best when Slack is the place where customer complaints, bugs and internal product problems first appear.
The workflow gives those messages a route into Linear without asking somebody to copy every title, paragraph and link by hand.
The Slack to Linear integration performs four jobs:
Linear has its own Slack app, and that may be enough for teams that only need basic issue creation.
The custom workflow is useful when the team wants structured AI output, automatic priority mapping, duplicate protection and rules that can be changed inside the workflow platform.
| Point | Manual copying | Linear’s Slack app | Custom workflow |
|---|---|---|---|
| Work per ticket | High | Low | One reaction |
| AI title and summary | No | Check current features | Generated using your prompt |
| Priority mapping | Manual | Depends on setup | Low to urgent |
| Duplicate protection | Depends on team memory | Depends on setup | Included in the workflow |
| Custom rules | Not applicable | Limited to app settings | Editable in the workflow platform |
The value is not simply moving words between two apps. The workflow controls which messages create issues, what information enters Linear and how repeated scheduled runs avoid creating copies.

This build follows the structure of the team’s published Slack and Linear ticketing example, which my team studied and adapted.
The complete node chain is:
| # | Node | Type | Job |
|---|---|---|---|
| 1 | Schedule Trigger | Schedule | Runs the check every few minutes |
| 2 | Slack | Slack (search messages) | Searches with a query such as in:#support-tickets has::ticket:, newest first, limit 10 |
| 3 | Get Values | Edit Fields (Set) | Keeps message ID, channel, user, time, permalink and text |
| 4 | Get Existing Issues | Linear (get many) | Retrieves recent Linear issues |
| 5 | Collect Descriptions | Aggregate | Collects their descriptions into one list |
| 6 | Get Hashes Only | Edit Fields (Set) | Extracts stored Slack message IDs |
| 7 | Merge | Merge (combine) | Joins each Slack message with the existing ID list |
| 8 | Create New Ticket? | IF | Continues only when the message ID is not already in Linear |
| 9 | Generate Ticket | Basic LLM Chain + OpenAI Chat Model + Structured Output Parser | Returns title, summary, ideas and priority as JSON |
| 10 | Create Ticket | Linear (create issue) | Creates the issue with the mapped priority |
The Schedule Trigger begins the run. The Slack node searches the chosen channel and returns the newest marked messages, while Get Values removes everything the later nodes do not need. The remaining data includes the stable message ID, original text, sender, channel, time and permalink.
A separate Linear path retrieves recent issues. Collect Descriptions gathers their descriptions, and Get Hashes Only extracts the Slack message IDs previously stored inside those descriptions. This gives the workflow a list of messages that already became tickets.
Merge combines every Slack message with that existing-ID list. The Create New Ticket? node checks each message separately. Messages already found in Linear stop there, while new ones move to Generate Ticket.
Generate Ticket writes the structured content. Create Ticket then sends the title, summary, debugging ideas, source message link and mapped priority into the correct Linear team.
The order matters because the workflow checks for duplicates before spending a model call on the summary. A message that already has a ticket never reaches Generate Ticket.
If you want to judge whether this chain fits your existing Slack process, email upcomingtool@gmail.com with an anonymised bug message and tell me which channel your team currently uses.
Slack can use an event-based emoji reaction trigger that fires when somebody reacts to a message.
The published workflow uses a scheduled search instead. I keep that structure for small teams because it is easier to inspect, catches reactions added while the workflow was unavailable and searches only the selected channel.
The trade-off is a delay of a few minutes. Bug reports rarely need an issue to appear in Linear at the exact second the reaction is added.
The Slack node searches using a query such as:
in:#support-tickets has::ticket:
It sorts the newest messages first and returns up to 10 results.
Slack message search requires the search:read permission. Slack provides that permission through user tokens rather than bot tokens.
A credential without the correct scope may connect successfully while the search returns no messages. The token type and permission need checking before changing the query or rebuilding the node.
The chosen reaction matters as well. A ticket reaction is useful because team members do not normally add it to jokes or routine updates.
Thumbs-up and eyes reactions are poor triggers. People use them to acknowledge a message without asking for tracked work.
A pinned channel rule can say:
If this message needs a tracked action, add the ticket reaction. If it does not need a Linear issue, do not add it.
That rule keeps the emoji reaction trigger intentional.
Generate Ticket contains three connected parts:
The Basic LLM Chain receives the Slack message and an instruction based on the published example:
Read this customer message and return:
- title: descriptive, no more than 10 words
- summary: what the customer expected and what they tried
- ideas: up to 3 suggestions to debug or resolve
- priority: one of low, medium, high, urgent
The Structured Output Parser requires four predictable fields. The Linear node receives JSON rather than an unstructured paragraph.
Example:
Slack message: “payment page stuck again for a customer, they tried twice with UPI, money deducted but order not showing, they’re angry” AI ticket summary title: UPI payment deducted but order not created Priority: urgent
The AI ticket summary saves the support person from rewriting the complaint. It gives the developer a title, the customer’s expectation, what they tried and a few ideas to investigate.
The returned issue priority is mapped to Linear’s numbers:
| AI result | Linear priority | Source example |
|---|---|---|
| urgent | 1 | Money taken, service not delivered |
| high | 2 | A core feature is broken for some users |
| medium | 3 | An annoying bug has a workaround |
| low | 4 | A cosmetic issue or small request |
The team lead should treat the issue priority as a first suggestion. A person can change it after considering the affected customers, current release and other work.
Every created issue stores the Slack message ID inside its Linear description.
On the next run, Get Existing Issues retrieves recent tickets. Collect Descriptions places their descriptions in one list, and Get Hashes Only extracts those stored message IDs.
Merge attaches the list to every Slack message found in the current search. The IF node asks whether each message ID is already present.
Without this step, a marked Slack message could create another issue every five minutes.
The pattern applies beyond this workflow:
Merge runs in combine mode and waits for both inputs. If the Linear path becomes disconnected, the workflow stalls rather than creating tickets without a duplicate check.
That is a safe failure. No ticket is better than a channel full of repeated tickets.
The token connects. Search still returns nothing.
Check search:read. Confirm that the credential uses the required user token.
The channel looks correct. The query finds no messages.
Match the channel name exactly, including hyphens.
Create Ticket keeps failing.
Copy the Linear team ID again. Check the starting state ID as well.
Duplicate issues appear.
Somebody changed the description format or removed the stored Slack message ID.
The contact exists in Slack, but thread replies behave differently.
Test a real thread in the workspace. Slack search behaviour for replies can vary.
The model call times out.
Check the account and allow the next scheduled run to retry while the marked message remains in the search results.
Every thumbs-up creates a ticket.
Replace the everyday reaction with one the team uses only for tracked work.
The workflow is active, but nobody follows the rule.
Pin the instruction in the channel. Ask the team lead to reply ticket? when a bug is reported without the chosen reaction.
Slack’s free plan limits searchable message history. Recent messages are what the workflow needs, but the current workspace limits still need checking.
Most of these problems are small. They become expensive only when nobody notices them.

The workflow can be configured in eight steps:
#support-tickets.The published example lists these Slack scopes:
channels:historychannels:readchat:writegroups:historygroups:readim:historyim:readmpim:historympim:readreactions:readreactions:writesearch:readusers:readusers:read.emailGrant only the permissions used by the workflow.
Linear requires a personal API key, the team ID and the state ID for new issues.
The model provider requires an API key. A small, fast chat model is enough to return the four short fields, but current model names and pricing should be checked on the provider’s website.
I start with a five-minute schedule. A faster schedule creates more API calls without adding much value for normal bug reports.
All keys belong in credentials. Do not paste them into node text fields that may become visible when the workflow is shared.
Example:
The D2C support person receives the failed UPI complaint on Monday and adds the ticket reaction.
The next scheduled run creates a Linear issue containing a clear title, the customer’s message, a Slack permalink and an urgent priority. The developer opening Linear can see the issue without searching through the previous day’s channel history.
Another customer mentions the same problem on Wednesday. The team can add the new information to the existing issue instead of treating every mention as a separate bug.
When the fix ships on Friday, the Linear issue contains the original context and the work history.
The system does not add another support platform. It gives Slack and Linear a clear handoff rule.
The workflow is not the right first step when bug reports arrive mainly by email or calls.
It is also a poor fit when the team does not use Linear or another issue tracker. Creating tickets automatically will not help if nobody reviews or owns them.
A support desk that already turns conversations into engineering work may make this workflow unnecessary.
Sensitive customer messages need another decision. The workflow searches only the selected Slack channel and only processes messages carrying the chosen reaction, but the marked text is sent to OpenAI for summarisation.
Personal details should be removed before the AI step when the business cannot send that information to an external model service. The UpcomingTools privacy policy explains how information shared with my team during implementation is handled.
Thread replies need testing in the actual Slack workspace. If every reply must be captured, my team can add a step that retrieves the parent message and required thread context.
The same pattern can work with Jira. The Slack search, duplicate check and AI generation remain, while the two Linear nodes and priority mapping change.
My team can build the same workflow or create a custom version for the client’s industry and reporting process.
| Stage | Work | Result |
|---|---|---|
| Review | My team studies how bugs are reported today | A channel and reaction rule |
| Build | My team configures credentials, search, team and prompt | A working automation |
| Test | My team runs past messages through the workflow | Sample tickets for review |
| Handover | My team explains the reaction and review process | Notes and a short recording |
Common customisations include:
The Slack to Linear integration remains recognisable even when the destination changes. The source search, duplicate memory and structured generation can stay while the final nodes are replaced.
Installing and customising this usually takes my team between 7 and 10 days, and I would not quote anything under a week.
If your process is more involved, for example several teams or extra ticket fields, the time stretches and we agree it on calls and emails first. Zoom screen sharing lets your team see each change as it is made.
None of this is tied to a single tool. Tell my team which automation platform you work with, or whether you want something custom, and the workflow gets built around that choice.
The client’s Slack, Linear, model and the workflow accounts remain under their control. The about page explains who is behind UpcomingTools, while the refund policy covers the terms for paid work.
On the next bug report in Slack, add the ticket reaction and see if anybody still has to copy it by hand; if they do, use the contact page.