# Discord support triage board for unanswered questions

> See every question in your Discord support channels that nobody has answered yet, oldest first, with a clock on each row showing how long it has been waiting.

- Workflow type: app
- Services: Discord, Linear, Notion
- Categories: Customer Support, Engineering
- Published: 2026-08-21

## What it does

- Lists every question in the Discord support channels you pick that nobody has answered yet, oldest first, with a running clock showing how long each person has been waiting.
- Filters by channel, by how long a question has been sitting, and by whether it looks like a bug or a how-to, so your team can split the board up the way they already work.
- Opens the full conversation inline so you can reply, mark a question handled with a reaction, or give it its own thread, and file a bug in Linear from the row with a link back to the conversation.
- Adds a Draft an answer button that reads the conversation, searches your Notion help docs, and writes a suggested reply with its sources for a person to edit and send. It never posts on its own.

## What you'll need

- A Discord server where you run community support, with permission to read the channels you want to track and to post replies in them.
- The names of the roles your helpers and moderators hold, so the board knows which replies count as a real answer.
- A Linear account if you want the escalate button to file bugs for your engineering team.
- A Notion workspace with your help docs shared with the app if you want it to draft suggested answers.

## Prompt

Build me an app that my community and support team opens every morning: a triage board of every question asked in our Discord support channels that nobody has answered yet, oldest first, with a response-age clock on each row so we can see what has blown past our informal SLA.

Start with a setup view. Let me connect Discord and pick the server, then use Get Guild Channels to list the channels so I can tick the support channels I want tracked, and Get Guild Roles to list the server roles so I can mark which ones are helper roles (moderators, support, staff). Also let me set the SLA threshold in hours and the emoji used to mark a question handled. Save all of this so the team does not reconfigure it each visit. Every Discord ID is a snowflake string, so store and compare IDs as strings, never as numbers.

To build the board, a handler should walk the selected channels with Get Channel Messages and also call List Active Guild Threads for the server so questions asked inside threads are picked up alongside plain channel messages, keeping only threads whose parent is one of my selected channels. Message pagination is cursor-based with before and after and caps at 100 per page, so page backwards from the newest message using the last id as before, and stop once messages are older than a configurable lookback window (default seven days). Use Get a Message when the app needs to refresh a single conversation's root message rather than refetching a whole channel.

A row counts as unanswered when the last message in that conversation came from the person who asked, or when nobody holding one of the configured helper roles has replied to it. Group consecutive messages in a channel into a conversation by their thread when there is one, and otherwise by the asker and a short time window, so a person asking three messages in a row is one row and not three. Ignore bot messages when deciding whether something was answered.

Each row shows the asker's handle and avatar, the channel or thread name, the first line or two of the question, when it was asked, and a response-age clock counting the time since the asker's last message. Style the clock so it escalates visually as it grows and turns red once it is past the SLA threshold. Sort oldest first by default. Give me filters for channel, for age bucket (under 1 hour, 1 to 4 hours, 4 to 24 hours, over a day) and for whether the question looks like a bug versus a how-to, classified from the wording of the question with an obvious way for a person to correct the label on a row.

Opening a row shows the full conversation inline, every message in order with author, helper role badge, timestamp and any attachments, so I can answer without switching to Discord. Give the row a reply box that sends with Send a Message into that channel or thread, a button that marks it handled using Add Reaction with the configured emoji (which moves the row into a Handled section rather than deleting it), and a button that uses Create Thread from Message when a question deserves its own space, after which further replies from the app go into that new thread. Discord has no documented direct-message operation, so every reply must go into the channel or the thread and the UI should never imply otherwise.

Add an escalate button on each row. It opens a small form that uses Linear List Teams so I can choose the team, prefills the issue title from the question, and builds the description from the full thread text, the asker's Discord handle and a permalink back to the message in the form https://discord.com/channels/<guild_id>/<channel_id>/<message_id>. Submitting calls Create Issue. Store the returned issue id, key and URL against that conversation so we never escalate the same thread twice: afterwards the row shows the Linear issue key and its current status instead of the escalate button, refreshed with Get Issue when the board loads, and clicking the key opens the issue in Linear.

Give every row a Draft an answer button that kicks off a background agent. The agent reads the full conversation from Discord, searches our documentation with Notion Search by Title using key terms from the question, pulls the most promising pages with Retrieve Page as Markdown, and writes a suggested reply plus the list of source pages (title and link) back into the app against that row. The agent must never post to Discord. The finished draft lands in that row's reply box for a human to edit and send, the row shows the agent's status while it works and once a draft is ready, and I can re-run it if the draft misses.

Persist the setup, the handled marks, the corrected bug versus how-to labels, the escalation records and the drafted answers, so the board keeps its state between visits and across the team. Refresh data when the board loads and give me a manual refresh button with the time of the last refresh. Respect the rate limits: Discord allows about 50 requests per second globally with per-route buckets and returns retry_after on a 429, and Notion allows roughly 3 requests per second, so batch and back off rather than hammering either. Show a friendly empty state when nothing is waiting, because an empty board is the goal.

## How to customize

- Choose which support channels show up on the board and which roles count as a helper reply.
- Change the age buckets and the point where a row turns red to match the response time you promise your community.
- Pick the emoji that marks a question handled, and the Linear team that new bugs get filed into.

## FAQ

### Does this post anything in Discord on its own?

No. Nothing leaves the app until a person presses send. The drafting assistant writes its suggested reply into the app for you to read and edit, and even the reaction that marks a question handled is a button someone has to click.

### How does it decide that a question is unanswered?

A question counts as unanswered when the last message came from the person who asked, or when nobody holding one of your helper roles has replied yet. You choose which roles count, so a reply from another community member does not quietly close something out.

### Does it pick up threads as well as normal channels?

Yes. It reads the active threads in your server alongside the support channels you selected, so questions asked inside a thread show up on the board with the same clock and filters as everything else.

### Can I use it without Linear or Notion?

Yes. The board, the filters and the replies work with Discord alone. The escalate button needs a Linear account, and the drafted answers need a Notion workspace with your docs shared, but you can add either one later.

### Will it stop us escalating the same question twice?

Yes. Once someone escalates a conversation, the app remembers the issue that was created and shows its key and current status on the row, so the next person to open that question can see it is already with engineering.

### Can it reply to someone privately?

No. Discord does not offer a way to send direct messages through this kind of connection, so every reply you send from the app goes back into the channel or the thread where the question was asked.

Use this prompt in General Input: https://www.generalinput.com/prompts/discord-support-triage-board-for-unanswered-questions