Slack digests
Each project can post a digest to one Slack channel whenever an insight run finds something genuinely new. It is a plain incoming webhook - no OAuth app to install, no workspace-wide permissions, and nothing is ever read out of Slack.
Setup
- In Slack, open your workspace apps and add Incoming Webhooks. Create a webhook and pick the channel it should post to. Slack gives you a URL starting with https://hooks.slack.com/services/.
- In Betterloop, open your project's Settings tab, paste the URL into Slack incoming webhook URL, and save. Anything that does not start with https://hooks.slack.com/ is rejected, so a typo cannot send your insights to a stranger.
- That is it. The next insight run that produces something new posts to the channel. To see it straight away, use Generate now on the Insights tab - though it only posts if that run actually finds a new insight.
The webhook is stored per project, so two projects can report into two different channels, and removing it is as simple as clearing the field and saving.
When a digest is sent
- Only after an insight run that produced at least one fresh insight. Runs that only refresh existing findings are silent.
- Fresh means one of two things: a fingerprint that has never been seen for this project, or an insight you had marked done that the detectors found again. The second case is a regression alarm and is deliberately loud.
- Insights you dismissed never come back, in Slack or anywhere else.
- Cadence follows the insight engine, not a separate schedule. See How insights work.
What the message contains
A headline with the count, then up to five insights sorted by severity and then by score, then a link back to the full feed. A circle marks the severity: red for high, yellow for medium, blue for low.
Betterloop found 3 new insights for Acme Storefront:
- ● [bug] JS error hitting 9 sessions: Cannot read properties of undefined /checkout
- ● [performance] /pricing is slow: LCP p75 is 4,800ms /pricing
- ● [ux] Users rage-click "Save changes" on /settings /settings
Open the full feed - reply in Claude Code via the Betterloop MCP
Insight titles embed real error messages and page paths, so the digest escapes &, < and > before sending. An error message containing angle brackets renders as text and can never turn into a link or a mention in your channel.
If nothing arrives
- Check the run actually found something new. An empty Insights tab means there was nothing to send.
- Revoked or deleted webhooks make Slack answer with a non-2xx status. Betterloop logs the status and body server-side and moves on - a broken webhook never blocks an insight run or loses an insight. Recreate the webhook in Slack and paste the new URL.
- Archived or deleted channels behave the same way: the insight is still in the dashboard, only the notification is lost.
Other ways to get notified
Slack is the only built-in push channel today. If you want insights somewhere else, poll GET /api/v1/insights?status=new from your own job - see the REST API - or pull them into your editor with the MCP server.