When someone asks for help in your Slack channel, opens a Linear ticket with a written summary and replies in the thread with the link.

UsesClaudeLinearSlack

Turn Slack support requests into Linear tickets

SlackSlackWhen someone posts in a channel. Save it as request.When someone posts in a channel. Save it as request.
ValuesSet linearTeamName to blank.Set linearTeamName to blank.
ValuesSet requestText to blank.Set requestText to blank.
Decisions & LoopsIf a step below fails, save the error as textErrorIf a step below fails, save the error as textError
Try
TextTrim request.text and save it as requestText.Trim request.text and save it as requestText.
On error
No steps
Decisions & LoopsIf requestText is emptyIf requestText is empty
Yes
Decisions & LoopsFinish the run: That message had no text in it, so no ticket was opened.Finish the run: That message had no text in it, so no ticket was opened.
No
No steps
LinearLinearList all active Linear teams. Save it as linearTeams.List all active Linear teams. Save it as linearTeams.
ValuesSet linearTeamId to blank.Set linearTeamId to blank.
ValuesSet teamsSeen to an empty list.Set teamsSeen to an empty list.
Decisions & LoopsFor each team in linearTeams.teams:For each team in linearTeams.teams:
Decisions & LoopsIf a step below fails, save the error as teamErrorIf a step below fails, save the error as teamError
Try
TextTrim team.name and save it as teamName.Trim team.name and save it as teamName.
TextTrim team.key and save it as teamKey.Trim team.key and save it as teamKey.
ListsAdd teamName (teamKey) to the end of teamsSeen and save it as teamsSeen.Add teamName (teamKey) to the end of teamsSeen and save it as teamsSeen.
Decisions & LoopsIf linearTeamId is empty and teamName in lowercase is linearTeamName in…If linearTeamId is empty and teamName in lowercase is linearTeamName in…
Yes
TextTrim team.id and save it as linearTeamId.Trim team.id and save it as linearTeamId.
No
No steps
On error
ValuesShow in the output: Skipped a Linear team that was missing its name, key or id: teamError as text.Show in the output: Skipped a Linear team that was missing its name, key or id: teamError as text.
Decisions & LoopsIf linearTeamId is emptyIf linearTeamId is empty
Yes
Decisions & LoopsStop and report a problem: No Linear team is called '@linearTeamName'. Set 'linearTeamName' to a team name or key exactly as Linear spells it. Teams this connection can see: teamsSeen joined by , .Stop and report a problem: No Linear team is called '@linearTeamName'. Set 'linearTeamName' to a team name or key exactly as Linear spells it. Teams this connection can see: teamsSeen joined by , .
No
No steps
ClaudeClaudeAsk Claude: 'You are triaging one message posted in a customer support channel. Decide which of the three below it is, and reply with EXACTLY one word in lower case and nothing else.Ask Claude: 'You are triaging one message posted in a customer support channel. Decide which of the three below it is, and reply with EXACTLY one word in lower case and nothing else. urgent - a genuine request for help where someone is blocked right now: an outage, data loss, a failed payment, work that cannot continue. request - any other genuine request for help, bug report, or question that needs an answer from the team. chatter - anything that is not a new request: greetings, thanks, jokes, status updates, opinions, or a reply about a request someone has already made. When it is a close call, answer chatter. A ticket for every message makes the tracker useless, and a request that is genuinely open will be asked again. The message: requestText'. Save it as triageResponse. Maximum response length: 8
ValuesSet verdict to blank.Set verdict to blank.
Decisions & LoopsIf a step below fails, save the error as verdictErrorIf a step below fails, save the error as verdictError
Try
TextTrim triageResponse.response_text and save it as verdict.Trim triageResponse.response_text and save it as verdict.
On error
ValuesShow in the output: Could not read the triage answer, so no ticket was opened: verdictError as text.Show in the output: Could not read the triage answer, so no ticket was opened: verdictError as text.
TextCheck whether verdict starts with urgent (ignoring case) and save it as isUrgent.Check whether verdict starts with urgent (ignoring case) and save it as isUrgent.
ValuesSet opensTicket to isUrgent or verdict starts with request (ignoring case).Set opensTicket to isUrgent or verdict starts with request (ignoring case).
Decisions & LoopsIf opensTicket is noIf opensTicket is no
Yes
Decisions & LoopsFinish the run: That message did not read as a new support request, so no ticket was opened.Finish the run: That message did not read as a new support request, so no ticket was opened.
No
No steps
ValuesSet ticketPriority to 3.Set ticketPriority to 3.
Decisions & LoopsIf isUrgent is yesIf isUrgent is yes
Yes
ValuesChange ticketPriority to 2.Change ticketPriority to 2.
No
No steps
ClaudeClaudeAsk Claude: 'Write the title of a support ticket for the message below.Ask Claude: 'Write the title of a support ticket for the message below. - One line, at most twelve words. - Say what is wrong or what is being asked for, not who asked - 'Card payments failing at checkout', not 'Customer needs help'. - No quotation marks, no ticket prefix, no full stop at the end. Reply with the title and nothing else. The message: requestText'. Save it as titleResponse. Maximum response length: 60
ValuesSet ticketTitle to Support request from Slack.Set ticketTitle to Support request from Slack.
Decisions & LoopsIf a step below fails, save the error as titleErrorIf a step below fails, save the error as titleError
Try
TextTrim titleResponse.response_text and save it as draftTitle.Trim titleResponse.response_text and save it as draftTitle.
Decisions & LoopsIf draftTitle isn't emptyIf draftTitle isn't empty
Yes
TextShorten draftTitle to 120 characters and save it as ticketTitle.Shorten draftTitle to 120 characters and save it as ticketTitle.
No
No steps
On error
ValuesShow in the output: Could not read the ticket title, so a default one was used: titleError as text.Show in the output: Could not read the ticket title, so a default one was used: titleError as text.
ClaudeClaudeAsk Claude: 'Write the body of a support ticket for the message below, for whoever picks it up. Use exactly these three headings, each on its own line with its answer underneath:Ask Claude: 'Write the body of a support ticket for the message below, for whoever picks it up. Use exactly these three headings, each on its own line with its answer underneath: What they are asking for What is affected What we still need to know Use only what the message actually says. Anything it does not tell you - the account, the environment, when it started, how to reproduce it - goes under what we still need to know rather than being guessed at. Do not propose a fix and do not invent detail. The message: requestText'. Save it as bodyResponse. Maximum response length: 600
ValuesSet ticketBody to requestText.Set ticketBody to requestText.
Decisions & LoopsIf a step below fails, save the error as bodyErrorIf a step below fails, save the error as bodyError
Try
TextTrim bodyResponse.response_text and save it as draftBody.Trim bodyResponse.response_text and save it as draftBody.
Decisions & LoopsIf draftBody isn't emptyIf draftBody isn't empty
Yes
ValuesChange ticketBody to draftBody.Change ticketBody to draftBody.
No
No steps
On error
ValuesShow in the output: Could not read the ticket summary, so the original message was used instead: bodyError as text.Show in the output: Could not read the ticket summary, so the original message was used instead: bodyError as text.
ValuesSet reporterName to a teammate.Set reporterName to a teammate.
Decisions & LoopsIf a step below fails, save the error as reporterErrorIf a step below fails, save the error as reporterError
Try
SlackSlackGet the details of request.user_id. Save it as reporterProfile.Get the details of request.user_id. Save it as reporterProfile.
TextTrim reporterProfile.user.real_name and save it as reporterRealName.Trim reporterProfile.user.real_name and save it as reporterRealName.
Decisions & LoopsIf reporterRealName isn't emptyIf reporterRealName isn't empty
Yes
ValuesChange reporterName to reporterRealName.Change reporterName to reporterRealName.
No
No steps
On error
ValuesShow in the output: Could not look up who posted the message: reporterError as text.Show in the output: Could not look up who posted the message: reporterError as text.
LinearLinearCreate an issue titled linearTeamId in team ticketTitle. Save it as ticket.Create an issue titled linearTeamId in team ticketTitle. Save it as ticket. Priority: ticketPriorityticketBody --- Reported in Slack by reporterName. Their message is quoted word for word in the first comment on this ticket.
Decisions & LoopsIf a step below fails, save the error as commentErrorIf a step below fails, save the error as commentError
Try
LinearLinearAdd a comment to Linear issue ticket.issue.id.Add a comment to Linear issue ticket.issue.id.Posted in Slack by reporterName: requestText
On error
ValuesShow in the output: The ticket was created but the original message could not be added as a comment: commentError as text.Show in the output: The ticket was created but the original message could not be added as a comment: commentError as text.
ValuesSet ticketRef to blank.Set ticketRef to blank.
ValuesSet ticketUrl to blank.Set ticketUrl to blank.
Decisions & LoopsIf a step below fails, save the error as ticketReadErrorIf a step below fails, save the error as ticketReadError
Try
TextTrim ticket.issue.identifier and save it as ticketRef.Trim ticket.issue.identifier and save it as ticketRef.
TextTrim ticket.issue.url and save it as ticketUrl.Trim ticket.issue.url and save it as ticketUrl.
On error
ValuesShow in the output: The ticket was created but its reference could not be read: ticketReadError as text.Show in the output: The ticket was created but its reference could not be read: ticketReadError as text.
SlackSlackReply in a thread in request.channel_id.Reply in a thread in request.channel_id. Reply To: request.message_tsThanks - this is now tracked as ticketRef. ticketTitle ticketUrl This reply was posted automatically. Anything else that would help is best added to the ticket, because replies in this thread do not reach it on their own.