On-call on ntfy or Gotify, team on Slack — same AlertHub project

On-call on ntfy or Gotify, team on Slack — same AlertHub project

Sources should not choose the chat app. GitHub Actions, Stripe, WordPress, Shopify, email ingest, and n8n already POST once to AlertHub. The usual next step is a team channel: Slack, Microsoft Teams, or Mattermost.

That channel is a poor pager. It is muted at night, it is full of people who are not on call, and it is the wrong place for a lock-screen ping. Add ntfy or Gotify on the same project. Every warning and critical fans out to both. info stays in the dashboard.

This is the combo the other nine posts assume: you do not rebuild ingest to get a phone.

Who hears what

SurfaceRoleTypical dest
Team channelShared context, handoff, “did anyone see this?”Slack OAuth, Teams, Mattermost, Discord, Google Chat
On-call pocketWake the human who can actntfy topic or Gotify app
Auditor / ticketPaper trail that outlives a swipeEmail destination
HistorySearch, retention, read stateDashboard (including info)

AlertHub does not send different levels to different destinations today: if it is warning or critical, every connected channel gets it. Split noise with level at the source (info vs warning) and separate projects (staging vs prod), not with a second curl.

GitHub / Stripe / WP / Shopify / email / n8n
                    │
                    ▼
                AlertHub
                 /  |  \
           Slack  ntfy  email
           Teams  Gotify

ntfy vs Gotify vs WhatsApp

ntfyGotifyWhatsApp Pro
Hostingntfy.sh or self-hostedSelf-hostedVendor
AuthUnguessable topic (?auth= optional)Application token on HTTPS URLPaid AlertHub dest
Best whenPhone-first, no server to runAndroid ops already has GotifyWarehouse already lives in WhatsApp

Setup: ntfy alerts · Gotify alerts · WhatsApp Pro. You can attach ntfy and Gotify if two teams refuse to share an app.

Setup (once)

  1. Ingest stays as it is. Do not add curl ntfy.sh next to sendAlert.
  2. Connect the team channel you already use (Slack mention-to-connect, or a Mattermost/Teams webhook).
  3. Paste ntfy https://ntfy.sh/{topic} or Gotify https://host/message?token=… in Connections.
  4. Send one test warning. Confirm channel + phone. Send an info test and confirm it is dashboard-only.

Mute the Slack channel at night if you want; keep ntfy priority 5 / Gotify 8 for critical. That is a client setting, not a second webhook.

Pattern 1: Prod pages the phone, staging does not

Two AlertHub projects (or staging sources stuck at info). Prod Connections: Slack + ntfy. Staging: dashboard only, or Slack #staging without ntfy. Same YAML/plugin/Stripe URL shape, different secret keys.

Pattern 2: Finance off the public channel

Stripe failed payments on a project whose Slack is a private #billing, plus Gotify for the finance lead — Stripe → Gotify. Do not reuse the public #deploys webhook.

Pattern 3: Agency many sites, one pager

WordPress security hooks (ntfy combo) on one topic; each client is ah_source or its own project. Slack is the agency room; ntfy is whoever is on the weekly rota.

Ideas to squeeze more value

  • One ingest, many dests. That is the product. Changing Slack → Teams is a Connection, not a GitHub Actions edit.
  • Do not dual-send from n8n. If AlertHub fans out to Slack, delete the Slack node in n8n — automation → Gotify.
  • Read state. The phone is lossy. Use the inbox and retention in the morning.
  • Levels. info vs warning vs critical is how you keep ntfy sacred.

FAQ

Can Slack get info and ntfy only critical?
Not as two filters on one project. Use info for noise (dashboard only) and critical for the page. Or two projects.

Does the team see ntfy messages in Slack?
No. Same event, two deliveries. Slack has the thread; ntfy has the banner.

Self-hosted Gotify plus Slack Cloud?
Yes. Gotify needs public HTTPS. Slack is OAuth as usual.

Next steps

Leave ingest alone. Add ntfy or Gotify next to Slack. Fail a test warning and check both.

Related: ntfy setup · Gotify setup · GitHub Actions → ntfy · Mattermost