Skip to content

Alert bridge: self-hosted Cloudflare Worker

The alerts-bridge is an open-source Cloudflare Worker that translates Monitive webhook events into push notifications. Deploy it once to your own Cloudflare account and every monitor’s down/up event reaches your phone, Slack workspace, or Discord server — via Pushover, ntfy, Slack, Discord, or Telegram.

You own the Worker. Monitive sends the webhook; the bridge forwards it to your provider. No third-party relay, no vendor lock-in.

  • A Cloudflare account (free tier is enough)
  • Node 20 or newer
  • A UptimeMonitoring.com account with at least one monitor
  • A provider account — this walkthrough uses Pushover
Terminal window
git clone https://github.com/uptimemonitoring/alerts-bridge
cd alerts-bridge
npm install

Log in to Cloudflare, then deploy:

Terminal window
npx wrangler login
npm run deploy

Wrangler prints the Worker URL when the deploy succeeds:

Published alerts-bridge (0.00 sec)
https://alerts-bridge.<your-subdomain>.workers.dev

Note that URL — you register it with your monitor next.

  1. Open the monitor in app.uptimemonitoring.com → the Webhook section.
  2. Set the webhook URL to the *.workers.dev URL from the deploy step and save.
  3. Reveal and copy the Signing secret shown there — you’ll paste it as MONITOR_WEBHOOK_SECRETS in the next step.

(API equivalent: PUT /api/v1/monitors/<id>/webhook -d '{"url":"…"}' returns the secret; GET re-reads it.) The bridge verifies the X-UptimeMonitoring-Signature header against this secret on every request — see Webhooks for the signature contract.

Configure the Worker secrets with npx wrangler secret put. Wrangler prompts you for each value; nothing is written to disk.

Terminal window
# Which provider to use
npx wrangler secret put PROVIDER
# → pushover
# Pushover application token (from pushover.net → Your Applications)
# Tip: name the Pushover application "UptimeMonitoring" — that name is what
# shows as the source on each push notification.
npx wrangler secret put PUSHOVER_TOKEN
# Pushover user key (from pushover.net → Your User Key)
npx wrangler secret put PUSHOVER_USER
# The whs_live_… signing secret you copied from the monitor's Webhook section above
npx wrangler secret put MONITOR_WEBHOOK_SECRETS

Watch the Worker logs in one terminal:

Terminal window
npx wrangler tail

Then trigger a real event: point the monitor at a URL that returns 5xx (or stop the service it watches) so Monitive fires a down webhook, then restore it to fire up. Confirm each notification arrives on your device, and watch wrangler tail for the incoming request and the provider’s response.

If your monitor’s webhook settings offer a test-send button, that’s the fastest way to fire a sample delivery without affecting the monitor’s real state.

Set PROVIDER to one of the values in the first column and supply the corresponding secrets:

PROVIDER valueRequired secretsNotes
pushoverPUSHOVER_TOKEN, PUSHOVER_USERPushover app token + user key
ntfyNTFY_TOPIC (+ optional NTFY_URL, NTFY_TOKEN)NTFY_URL defaults to https://ntfy.sh; NTFY_TOKEN only for protected topics
slackSLACK_WEBHOOK_URLSlack incoming webhook URL
discordDISCORD_WEBHOOK_URLDiscord webhook URL
telegramTELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_IDBot token + target chat ID

401 from the Worker The signature verification failed. Check that the MONITOR_WEBHOOK_SECRETS value in the Worker matches the signing secret shown in the Monitive webhook settings exactly — trailing whitespace or a copy-paste error will cause every request to be rejected.

No push notification Signature passed but the provider rejected the request. Double-check PUSHOVER_TOKEN and PUSHOVER_USER (or the equivalent for your provider). Run npx wrangler tail while triggering a test event to see the provider’s error response.

413 Request Entity Too Large The webhook payload exceeded the Worker’s request size limit. This should not happen with standard Monitive payloads — if it does, open an issue in the alerts-bridge repository.