Slack integration
Briefings can be posted to a Slack channel instead of, or in addition to, email. You paste a webhook URL into the schedule config and SignalGuide posts the report text when the schedule fires.
How it works
Slack delivery uses an incoming webhook URL — a URL Slack generates for a specific channel that accepts HTTP POST requests. When a schedule fires, the scheduler in api/services/scheduler.py posts the briefing text to that URL:
The report is sent as plain text in the Slack text field. It renders as preformatted text in the channel.
Create an incoming webhook in Slack
Open your Slack app settings
Go to api.slack.com/apps and select the app you want to use. If you don't have one, click Create New App → From scratch. Name it “SignalGuide” and pick the workspace.
Enable Incoming Webhooks
In the left sidebar, click Incoming Webhooks. Toggle it On. Scroll to the bottom and click Add New Webhook to Workspace.
Pick a channel and authorize
Select the channel where briefings should post — a dedicated #analytics or #traffic channel keeps things clean. Click Allow. Slack generates a webhook URL that starts with https://hooks.slack.com/services/. Copy it.
Paste the webhook URL into SignalGuide
Open Settings → Schedules, create a new schedule, set the channel to Slack, paste your webhook URL, and save. The URL is stored on the ReportSchedule row as slack_webhook.
Testing delivery
After creating a Slack schedule, run an on-demand analysis from the dashboard. That triggers POST /reports/generate/{site_id} which generates a fresh briefing — but note that on-demand generation does not deliver to Slack. It only returns the report to the dashboard.
To confirm delivery works, the simplest path is to set a daily schedule and wait for the scheduler to fire (checks every 15 minutes). If your webhook is valid, you'll see the message in Slack within 15 minutes of creating the schedule, since a schedule with a null next_send is treated as immediately due.
Troubleshooting
No message in Slack after 20 minutes
Check that the webhook URL you pasted starts with https://hooks.slack.com/services/. URLs that start with https://hooks.slack.com/triggers/ are workflow webhooks — a different type that doesn't accept plain POST requests with a JSON body. You need an Incoming Webhook, not a workflow trigger.
Message appeared once and then stopped
If the analysis fails (expired Google token, empty data pull), the scheduler skips delivery and leaves the schedule as due. On the next 15-minute tick it retries. If your Google token has expired, re-auth from the login screen to restore the refresh token.
Webhook revoked by Slack
Slack deactivates webhooks if the app is removed from the channel or the workspace. Generate a new webhook in your Slack app settings and update the schedule in SignalGuide Settings → Schedules (delete the old schedule, create a new one with the updated URL).
Message formatting is hard to read
The report is sent as plain text. Slack renders it in a single block. If your briefings are long, a Slack workflow that formats or summarizes the text before posting is the current DIY option. Richer Slack formatting (blocks, sections) is not implemented today.
Related: Scheduled reports.