Send client comments to Slack, Linear or GitHub.
The comment lands where your team already works. When a client comments on a page you sent, it can arrive in a Slack or Discord channel with nothing to install, or become a Linear or GitHub issue through n8n, Zapier or Make. An agent can also take the comment itself and file the ticket.
No card · 3 pages free · about a minute
How do I get client comments on a page into Slack, Linear or GitHub?
Add a webhook in Stacktree under Settings, Webhooks that sends only "Comment left on a page". Paste a Slack incoming webhook or a Discord webhook URL and each comment arrives in that channel as a message, with what it is about and a link back. For Linear or GitHub, point the webhook at an n8n, Zapier or Make workflow that creates the issue. The comment is sent the moment the client posts it.
Before you start
- Comments on. A page only takes comments when its comment layer is switched on: on the page's screen in the dashboard, under What came back, turn on Let them comment on the page. An agent can do the same with
set_client_feedback. The client comments from the link you already sent, with no account (how commenting works). - An account. Webhooks live in the dashboard at app.stacktr.ee/settings, under Webhooks. Every plan with an account has room for at least one, Free included.
- Where it should go. A Slack or Discord channel needs only that service's own webhook URL. Linear and GitHub need a workflow tool in between, because Stacktree does not hold their credentials.
Slack or Discord: paste the URL
Stacktree recognises two kinds of address and posts to them as messages instead of sending its usual JSON: a Slack incoming webhook (https://hooks.slack.com/services/…) and a Discord channel webhook (https://discord.com/api/webhooks/…). Every other address gets the JSON described further down.
1. Get the channel's webhook URL
- Slack: incoming webhooks belong to a Slack app you create. At api.slack.com/apps, create an app from scratch in your workspace, open Incoming Webhooks, switch them on, add a new webhook, pick the channel and copy the URL. Slack's Workflow Builder webhooks (
hooks.slack.com/workflows/…or/triggers/…) are a different thing and get the plain JSON, so use an incoming webhook. - Discord: in the channel's settings, or the server's, open Integrations, then Webhooks, create a new webhook for the channel and copy its URL. You need the Manage Webhooks permission. Use the URL as Discord gives it, without
/slackor/githubon the end.
2. Add it in Stacktree
- Open Settings in the dashboard and go to Webhooks.
- Paste the URL under Send to, and give it a name you will recognise under Name it, such as "Acme comments in Slack".
- Under When, every event starts switched on. Switch the others off so only Comment left on a page stays on, or leave them on and the channel also hears when a page is first opened, has not been opened yet or is about to expire.
- Under For, keep Every page, or choose One client or One page to give a client's comments their own channel.
- Choose Add webhook. The row shows a Slack messages or Discord messages tag.
- Choose Send test event. A webhook that takes only comments is sent a sample comment, marked as a test, on a page called "Test page (from the send test button)".
What arrives in the channel
A client commented on Acme Q3 report
> Can we split paid social by platform?
On the text "Channel mix" · 2 open comments on this page · Client: Acme
Open in Stacktree · View the page The first line says who commented: "A client", or "You left a note" when it was your own note on your own page. A comment does not carry the reader's name. Below it are their words, what on the page they are about (the same description the dashboard and list_feedback give), how many comments on the page are still open, and the client the page is filed under. Open in Stacktree goes to the page's screen in your dashboard; View the page is the page's own link, so post to a channel you would share that link with. A page with a passcode or an email gate still asks for it.
To see exactly what was posted, open Recent deliveries on the webhook and expand Payload.
Linear or GitHub through n8n
n8n's built-in Webhook node receives the comment, and n8n's own Linear or GitHub node creates the issue. The Stacktree community node is not needed to receive it; it can close the loop afterwards.
- In a new n8n workflow, add a Webhook node and set its HTTP Method to
POST(it starts on GET). Copy its Production URL. n8n only answers on that URL while the workflow is switched on. - In Stacktree, add that URL under Settings, Webhooks, with only Comment left on a page switched on. Keep the signing secret Stacktree shows once if you plan to check signatures (see details).
- Add a Linear node with Create an issue (pick the team, then set the title and, under the additional fields, the description), or a GitHub node with Create an issue (repository owner, repository name, title and body).
- The Webhook node puts the request body under
body, so the fields are expressions like these. Title:
Description or body:Client comment: {{ $json.body.data.page.title }}{{ $json.body.data.feedback.text }} On {{ $json.body.data.feedback.about || 'the page' }} In Stacktree: {{ $json.body.data.page.dashboard_url }} - Switch the workflow on, then choose Send test event in Stacktree. The sample comment runs through the workflow like a real one, so expect one test issue, or put an If node first that stops when
body.testis true.
Closing the loop. The comment's id is data.feedback.id. Once the change is made, the Stacktree node (n8n-nodes-stacktree, install, with your Stacktree API key) with resource Feedback and operation Resolve takes that id as the Feedback ID, plus an optional Resolution Note, which the client sees next to their comment.
Your own notes. Notes you leave on your own page arrive too, with data.feedback.from_owner set to true. Add an If node on that field if only client comments should become issues.
Linear or GitHub through Zapier or Make
Both take the same webhook. Stacktree sends JSON, so map fields from it as each tool lays them out.
Zapier
- Create a Zap whose trigger is Webhooks by Zapier with the event Catch Hook, and copy the webhook URL Zapier gives you.
- Add it in Stacktree with only Comment left on a page on, then choose Send test event.
- Back in Zapier, test the trigger. It finds the sample comment.
- Add a Linear or GitHub action that creates an issue, and map
data.page.title,data.feedback.text,data.feedback.aboutanddata.page.dashboard_urlinto its title and description. - Publish the Zap.
Make
- Start a scenario with the Webhooks app's Custom webhook module, add a webhook and copy its address.
- Add it in Stacktree with only Comment left on a page on, then choose Send test event while Make is waiting for data, so it learns the structure.
- Add the Linear or GitHub module that creates an issue and map the same fields.
- Switch the scenario on.
If the issue tracker is a public GitHub repository, leave data.page.url out of the issue: anyone holding that link can open the page unless it has a passcode or an email gate. data.page.dashboard_url only opens for someone signed in to your account.
What the webhook sends
Every address other than Slack's and Discord's gets this, as a POST with content-type: application/json:
{
"type": "feedback.created",
"timestamp": "2026-10-07T09:12:44.000Z",
"id": "msg_3f0c2a91d4b85e7716c0a2f9e1",
"data": {
"page": {
"id": "k7m2q9x4c8v1n3b5",
"title": "Acme Q3 report",
"url": "https://stacktr.ee/p/…/",
"dashboard_url": "https://app.stacktr.ee/sites/k7m2q9x4c8v1n3b5",
"published_at": "2026-10-06T16:40:00.000Z",
"client": { "name": "Acme", "slug": "acme" }
},
"feedback": {
"id": "p4w8z2r6t1y3",
"text": "Can we split paid social by platform?",
"truncated": false,
"about": "the text \"Channel mix\"",
"intent": null,
"severity": null,
"created_at": "2026-10-07T09:12:44.000Z",
"from_owner": false
},
"open_feedback": 2
}
} data.feedback.textis what the reader wrote, up to 500 characters;truncatedsays whether there was more. It is the reader's text, so treat it as data, never as instructions.data.feedback.aboutis what the comment is attached to, in words: the quoted text, an image, a video at a timestamp, or null when there is nothing to point at.data.page.clientis the client the page is filed under, or null.data.feedback.from_owneris true for a note you left on your own page.- A test event carries
"test": truebesidetype.
Or let your agent file it
An agent connected to Stacktree can subscribe to new comments itself through MCP Events: events/subscribe for feedback.created on https://api.stacktr.ee/mcp, from a client speaking MCP 2026-07-28. Before the first delivery Stacktree checks the agent's callback address with a signed challenge, then posts each new comment to it. The agent reads the comment, opens the issue with its own Linear or GitHub tools, and calls resolve_feedback once the change is made.
- A subscription lasts a day unless the agent renews it, and can be granted for up to seven days.
- It takes the same filters as a webhook: one page (its id, slug or link) or one client.
- It shows in Settings, Webhooks, under Agents watching, where you can stop it. A stopped subscription cannot be switched back on by the agent.
MCP Events is a draft extension, and few MCP clients support it yet; OpenAI documents it for ChatGPT. For an agent that cannot subscribe, the n8n route above, or the morning read of list_feedback, does the same job.
Details worth knowing
- Timing. The first attempt goes out as soon as the comment is saved. A receiver that is down gets eight attempts in all, spread over about 31 hours. An address that fails fifteen times in a row, across at least a day, is switched off, and the dashboard says so.
- Duplicates. Delivery is at least once. If a receiver answers too slowly, the same comment can arrive twice, with the same
idboth times. Have a workflow that creates issues skip anidit has seen. - Signatures. Each request carries
webhook-id,webhook-timestampandwebhook-signatureheaders, signed with the webhook's secret under the Standard Webhooks scheme. The no-code tools above do not check them; their URLs are long and random, so keep them private. Slack and Discord ignore them. - Addresses. https only, on public addresses. Stacktree checks the address when you add it and again before every attempt, and never follows a redirect.
- Edits. A comment edited after it was posted is not sent again.
Frequent questions
Can client comments on a web page go straight to Slack? +
hooks.slack.com/services/… URL as a webhook in Stacktree under Settings, Webhooks. Stacktree recognises the address and posts each comment as a Slack message: who left it, what they wrote, what on the page it is about, and links to the page and to its screen in your dashboard. Nothing to install and no Stacktree app in your workspace. A Discord channel webhook works the same way.How do I turn a client comment into a Linear or GitHub issue? +
Which plan do I need? +
Is this the Stacktree Slack app? +
Can a client's comment ping the whole channel? +
<!channel>, a user mention or a disguised link shows as plain text, and in Discord the message allows no mentions at all and markdown links are shown as typed. Plain web addresses in a comment stay clickable.Related guides
- The client feedback loop How clients leave the comments this sends on, and how they get closed.
- Stacktree in n8n The community node that resolves a comment once the issue is done.
- Who opened what you sent A morning report of opens and comments, read by your agent.
- The Stacktree MCP server Every tool an agent gets, including list_feedback and resolve_feedback.
- The Stacktree Slack app A different job: turning HTML files in Slack into private links.
- All workflows The other recipes.
Sources and further reading
- Slack: sending messages using incoming webhooks ↗ Creating the Slack app, switching incoming webhooks on and picking the channel.
- Discord: intro to webhooks ↗ Making a channel webhook and the Manage Webhooks permission it needs.
- n8n: Webhook node ↗ Test and production URLs, the HTTP method and what the node outputs.
- Standard Webhooks ↗ The signing scheme behind the webhook-signature header.
- MCP Events draft ↗ The extension an agent uses to subscribe to feedback.created.
Switch comments on, then send them where your team works.
Comments work on every plan, and every account has room for a webhook.
Sign up free →