tutorial

Setting Up Slack Alerts for Uptime Monitoring with Vigilmon

Route uptime alerts to Slack with deduplication, escalation routing, and per-channel severity filtering — a complete guide to Vigilmon's webhook integration.

When your service goes down at 2am, you want one clear Slack message in the right channel — not a flood of repeated alerts every minute until someone acknowledges. This guide walks through creating Slack incoming webhooks, wiring them to Vigilmon, shaping the payload, and building escalation patterns that page the right people at the right severity.

What You'll Build

  • A Slack incoming webhook connected to Vigilmon
  • A custom alert payload with monitor name, region, and duration
  • Alert deduplication so on-call doesn't get spammed
  • Escalation routing: #site-alerts for warnings, #on-call for critical

Prerequisites

  • A Slack workspace where you have the Manage apps permission (or can ask an admin)
  • A Vigilmon account with at least one monitor configured

Step 1: Create a Slack Incoming Webhook

Slack incoming webhooks are a simple, token-scoped mechanism that lets external services POST messages to a channel without OAuth flows or bot setup.

  1. Go to api.slack.com/apps and click Create New App.
  2. Choose From scratch, name it Vigilmon, and select your workspace.
  3. Under Add features and functionality, click Incoming Webhooks.
  4. Toggle Activate Incoming Webhooks to On.
  5. Click Add New Webhook to Workspace.
  6. Select the channel you want alerts in — start with #site-alerts — and click Allow.
  7. Copy the generated webhook URL. It looks like:
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

Keep this URL secret — anyone with it can post to your channel.


Step 2: Add the Webhook to Vigilmon

  1. Log in to vigilmon.online and navigate to Alert Channels in the sidebar.
  2. Click Add ChannelWebhook.
  3. Fill in:
    • Name: Slack – #site-alerts
    • Webhook URL: paste the URL from Step 1
    • Method: POST
    • Content-Type: application/json
  4. Click Save.

Before attaching this channel to monitors, test it:

  1. Click the Test button next to the channel.
  2. Check #site-alerts in Slack — you should see a test alert message.

Step 3: Customise the Alert Payload

Vigilmon's webhook sends a JSON payload to your URL. By default it includes the basic alert fields, but you can shape the body to use Slack's Block Kit format for richer notifications.

In the Webhook Body field, enter:

{
  "text": "{{monitor_name}} alert",
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "{{#is_down}}🚨 DOWN{{/is_down}}{{#is_up}}✅ RECOVERED{{/is_up}} — {{monitor_name}}"
      }
    },
    {
      "type": "section",
      "fields": [
        {
          "type": "mrkdwn",
          "text": "*URL:*\n{{url}}"
        },
        {
          "type": "mrkdwn",
          "text": "*Status:*\n{{status_code}}"
        },
        {
          "type": "mrkdwn",
          "text": "*Region:*\n{{region}}"
        },
        {
          "type": "mrkdwn",
          "text": "*Duration:*\n{{downtime_duration}}"
        }
      ]
    },
    {
      "type": "actions",
      "elements": [
        {
          "type": "button",
          "text": { "type": "plain_text", "text": "View Monitor" },
          "url": "{{monitor_url}}"
        }
      ]
    }
  ]
}

Available template variables in Vigilmon webhook payloads:

| Variable | Description | |---|---| | {{monitor_name}} | The display name you gave the monitor | | {{url}} | The monitored URL | | {{status_code}} | HTTP response code (or timeout) | | {{region}} | Probe region that detected the failure | | {{downtime_duration}} | How long the monitor has been down | | {{is_down}} / {{is_up}} | Boolean conditionals for alert type | | {{monitor_url}} | Deep link to the monitor in Vigilmon dashboard | | {{timestamp}} | ISO 8601 timestamp of the event |


Step 4: Alert Deduplication

Without deduplication, a 30-minute outage at a 1-minute check interval sends 30 Slack messages. Vigilmon handles this at the alert level:

How Vigilmon deduplicates by default:

  1. An alert fires when the monitor first transitions to DOWN.
  2. Vigilmon does not send a new alert on every failed check while the monitor remains down.
  3. A recovery alert fires when the monitor transitions back to UP.

You get exactly two messages per incident: one down, one up.

Customising deduplication:

If you want periodic reminders during a long outage, configure Escalation intervals in Vigilmon:

  1. Open the monitor settings → Alert Channels → edit the channel.
  2. Enable Re-notify after and set the interval (e.g. 30 minutes).
  3. Save.

Now Vigilmon will send the initial down alert, then a reminder every 30 minutes until recovery. This is useful for business-hours on-call where you want a reminder if no one has acknowledged.


Step 5: Escalation Routing

Route different severity alerts to different channels:

Pattern 1: Separate channels by monitor

Create two webhooks pointing to different Slack channels:

| Channel | Webhook name | Used for | |---|---|---| | #site-alerts | Slack – #site-alerts | Non-critical monitors (staging, secondary services) | | #on-call | Slack – #on-call | Production monitors, payment endpoints |

In each monitor's settings, assign it to the appropriate alert channel.

Pattern 2: Tag-based routing with a Slack workflow

For more dynamic routing, create a Vigilmon webhook that posts to a single Slack channel, then use Slack Workflow Builder to route messages to different channels based on text patterns.

  1. In Slack, go to ToolsWorkflow BuilderCreate Workflow.
  2. Set the trigger to From a webhook or use Message sent to a channel as the trigger.
  3. Add a Conditional branch that checks if the message contains [PROD] and routes to #on-call, otherwise to #site-alerts.

Prefix your monitor names in Vigilmon with [PROD] or [STAGING] so the routing logic can key off the {{monitor_name}} variable.

Pattern 3: PagerDuty-style escalation with two webhooks

  1. First alert#site-alerts (low urgency, just FYI)
  2. Re-notify after 15 minutes → a second webhook → #on-call with @here or @oncall mention

Configure this in Vigilmon using two separate alert channel entries for the same monitor, with different re-notify intervals:

{
  "text": "<!here> STILL DOWN after 15 minutes — {{monitor_name}}\nURL: {{url}}\nDuration: {{downtime_duration}}"
}

Step 6: Test the Full Flow

  1. In Vigilmon, temporarily change a monitor's URL to a path that returns 404.
  2. Wait one check interval (~1 minute).
  3. Confirm the DOWN alert appears in #site-alerts with the correct monitor name, URL, and status code.
  4. Revert the URL.
  5. Confirm the RECOVERED alert appears once the monitor transitions back to UP.

If the alert doesn't arrive, check:

  • The Vigilmon alert channel Test button still works (confirms the webhook URL is valid)
  • The monitor has the correct alert channel attached under Monitor Settings → Alert Channels
  • The Slack app has permission to post to the target channel

Going Further

  • Acknowledge from Slack: Use Slack's Block Kit actions buttons with an interactive endpoint to acknowledge alerts without opening the Vigilmon dashboard.
  • Multiple workspaces: Create one webhook per workspace/channel — Vigilmon supports unlimited alert channels.
  • Status page: Embed Vigilmon's status badge on your internal Confluence/Notion page so the team can see service health at a glance without logging in.

With this setup, your team gets clean, deduplicated Slack alerts the moment a service drops — and a recovery message when it comes back up, so the on-call rotation always knows the current state without searching through message history.

Monitor your app with Vigilmon

Free plan — 5 monitors, no credit card required. Up and running in 60 seconds.

Start free →