---
title: "Reliable uptime alerts: ntfy.sh via Cloudflare Workers"
description: "Wire Monitive webhooks to ntfy.sh notifications via Cloudflare Workers. Free. No account required for public topics. Self-hostable. Mobile app on iOS and Android."
doc_version: "1"
canonical: "https://uptimemonitoring.com/guides/reliable-alerts/ntfy-cloudflare/"
---

# Reliable uptime alerts: ntfy.sh via Cloudflare Workers

Browser push and email both get silently dropped by Do Not Disturb during sleep — exactly when an outage matters most. ntfy.sh delivers push notifications with per-topic urgency — on Android, max-priority topics can break through Do Not Disturb; on iOS they arrive within your Focus settings. Wire it to Monitive webhooks via a Cloudflare Worker. Setup: 5 minutes.

**Deploy bridge:** https://deploy.workers.cloudflare.com/?url=https://github.com/uptimemonitoring/alerts-bridge

## Prerequisites

- The [ntfy app](https://ntfy.sh/app) installed on your phone — free on iOS and Android
- A topic name: on the public ntfy.sh server the topic IS the secret, so append 16+ random characters (e.g. `monitive-alerts-3f9a2c7e1d4b8a06`), or run your own ntfy server
- A [Cloudflare account](https://cloudflare.com) — free tier is sufficient
- Node.js 20+ with `npx` available

## Quick start

### Step 1: Install the ntfy app

Install the ntfy app on your phone from https://ntfy.sh/app — no account needed for public topics. Choose a topic name: on the public ntfy.sh server the topic IS the secret, so append 16+ random characters (e.g. monitive-alerts-3f9a2c7e1d4b8a06).

### Step 2: Clone and install the alerts-bridge

Run: git clone https://github.com/uptimemonitoring/alerts-bridge && cd alerts-bridge && npm install

### Step 3: Deploy the bridge to Cloudflare Workers

Set PROVIDER and your provider credentials as Wrangler secrets, then run: npx wrangler deploy. Cloudflare assigns the bridge a URL like https://alerts-bridge.yourworker.workers.dev.

### Step 4: Connect Monitive and set the signing secret

In Monitive, open a monitor → Webhooks → set the URL to your bridge URL. Monitive issues a signing secret for that webhook — copy it and set it on the bridge with: npx wrangler secret put MONITOR_WEBHOOK_SECRETS. Secrets apply to the live Worker immediately, no redeploy needed.

### Step 5: Send a test alert

Trigger a test webhook from Monitive. Your phone should receive a notification within seconds.

## Deploy commands

```bash
git clone https://github.com/uptimemonitoring/alerts-bridge
cd alerts-bridge && npm install

# 1. Set provider secrets, then deploy
npx wrangler secret put PROVIDER                 # enter: ntfy
npx wrangler secret put NTFY_TOPIC               # long, random topic — public topics are shared secrets
npx wrangler secret put NTFY_URL                 # optional — omit to use https://ntfy.sh
npx wrangler secret put NTFY_TOKEN               # optional — only for protected/reserved topics
npx wrangler deploy

# 2. Register the printed Worker URL in Monitive (monitor → Webhooks),
#    then set the signing secret it issues (applies live, no redeploy):
npx wrangler secret put MONITOR_WEBHOOK_SECRETS
```

After `wrangler deploy`, copy the worker URL from the output and paste it into Monitive as the webhook destination.

## ntfy.sh details

Free. No account required for public topics. Self-hostable. Mobile app on iOS and Android.

Cost: Free for public topics. Self-hosted option available.

Free tier: 100k requests/day free. No credit card required.

## Troubleshooting

**Webhook never fires**

Cause: Monitive cannot reach the bridge URL, or the monitor has no webhook configured.

Fix: Open the monitor in Monitive and check its webhook delivery log. Confirm the bridge URL is reachable from the public internet.

---

**Bridge returns 401 Unauthorized**

Cause: MONITOR_WEBHOOK_SECRETS on the bridge does not match the signing secret Monitive issued for this monitor.

Fix: Copy the signing secret from the monitor → Webhooks section in Monitive, then re-run npx wrangler secret put MONITOR_WEBHOOK_SECRETS with that exact value (no trailing whitespace).

---

**Bridge returns 500**

Cause: Provider credentials are missing or malformed.

Fix: Check Cloudflare Workers logs in the dashboard. Confirm all required secrets are set: PROVIDER=ntfy, NTFY_TOPIC, MONITOR_WEBHOOK_SECRETS (NTFY_URL, NTFY_TOKEN optional).

---

**Notifications arrive but phone is silent**

Cause: The ntfy topic notification importance is set below the system DND threshold.

Fix: In the ntfy app, tap the topic → notification settings → set importance to "Urgent".

---

**Topic receives messages but the app shows nothing**

Cause: You subscribed to a different topic name in the app.

Fix: Confirm the exact topic name in the app matches NTFY_TOPIC (case-sensitive).

## Why we built this

Monitive's own admin alerts run through the same bridge you're about to deploy. MIT license. No telemetry, no vendor lock-in.

Bridge source: https://github.com/uptimemonitoring/alerts-bridge