Back to guides

Guides · September 8, 2026

Discord alerts for cron jobs, uptime and heartbeats

Connect a channel through Discord OAuth, route Crontap alerts, test the embed, and recover cleanly from a deleted webhook.
crontap.com / guides
Connect Discord to Crontap for cron job, uptime and heartbeat alerts. Choose a channel, route each monitor, test delivery and reconnect revoked webhooks.

A Discord webhook can carry an alert, but creating one by hand for every cron job gets old quickly. Crontap uses Discord's OAuth flow to create a channel-bound destination, then reuses it across schedules, uptime monitors, and heartbeats.

This guide covers alerts about Crontap entities. To post your own content on a timer, use the separate schedule Discord webhook messages guide.

Before you connect

You need:

  • A Crontap Pro or Ultra plan. Paid plans start at $2.99 per month.
  • Access to the target Discord server.
  • Manage Webhooks permission in the target channel.

Crontap requests Discord's webhook.incoming OAuth permission. It does not install a general-purpose bot, read messages, run commands, mention roles, or target threads.

1. Start in notification settings

Open Settings, then Notifications, or use notification settings.

Find the connection controls above the channel list and select Connect Discord. Discord asks you to choose the server and channel that will own the webhook. If Discord already appears as an active destination, use its row instead of creating a duplicate connection. If a channel is missing from OAuth, confirm your account has Manage Webhooks there.

2. Authorize and name the destination

Approve the OAuth request on Discord. Discord returns a credential and channel ID, but not a useful server and channel label for the Crontap UI. Crontap therefore asks you to give the destination a recognizable name after authorization, such as Acme #alerts.

A welcome embed appears in Discord, and the destination becomes active in settings.

Do not connect the same channel twice unless you deliberately want two Discord webhooks and two Crontap rows. Discord creates a fresh webhook each time, so duplicate connections can produce duplicate alert messages if both are selected.

3. Set defaults and overrides

Use the defaults matrix to enable Discord for:

  • Schedules, for failed scheduled API calls after configured retries.
  • Monitors, for uptime state changes.
  • Heartbeats, for missed, explicit failure, and recovery events.

Save the defaults, then leave ordinary entities on Use my defaults. Open an individual schedule, monitor, or heartbeat and choose Choose channels when it belongs somewhere else. Select Off to stop human alerts while keeping machine Integrations active.

One entity can route to Discord plus email, Slack, or Telegram. This is useful when Discord is the team workspace but email should remain a separate fallback.

4. Test the Discord embed

Open the destination menu and select Send test. Discord should receive a formatted embed, and Crontap should add a sent result to delivery history.

A missed Crontap heartbeat alert and its recovery in Discord

Real alerts identify the source and state, include relevant timing or error context, and link back to Crontap. Uptime and heartbeat recovery messages follow the same selected route. A schedule failure does not imply a later recovery event.

Safe routing with several channels

Select several destinations when more than one team owns the response, not simply because several buttons exist. A good baseline is the team's Discord channel plus email.

If the uptime monitor checks Discord itself or a dependency required to reach Discord, keep an independent destination enabled. Sending the only downtime alert into the service being checked is a neat circular dependency and a poor incident plan.

Rename, disconnect, and reconnect

The channel menu lets you send a test, review delivery history, rename the Crontap label, or disconnect.

Renaming changes the label in Crontap. It does not rename the Discord channel or webhook. Disconnecting removes the Crontap destination and its routing selection.

If the webhook is deleted in Discord, or Discord returns that it no longer exists, Crontap stops delivery and shows Reconnect needed. Reconnect to create a fresh Discord webhook, then remove any stale duplicate row.

Troubleshooting Discord alerts

Discord says I do not have permission

Ask a server or channel administrator for Manage Webhooks permission, or ask them to complete the connection. Ordinary message-posting permission is not enough to authorize an incoming webhook.

Why does Crontap ask me to name the channel?

The OAuth response gives Crontap the channel-bound webhook and IDs but not a human-readable server and channel name. The label helps you tell Production #alerts from Staging #alerts.

I receive every alert twice

Check notification settings for two rows pointing at the same Discord channel. Authorizing the same channel twice creates two webhooks. Keep one destination, update defaults or custom routes to use it, then disconnect the duplicate.

The row says Reconnect needed

The webhook was likely deleted or revoked. Reconnect the destination and send a test. Crontap does not silently continue retrying a credential Discord says is gone.

The test works but my monitor stays quiet

Open the monitor and inspect Notifications. Choose channels uses only its own checked list, even if Discord is enabled in global defaults. Also confirm the monitor actually emitted a state change and inspect delivery history.

Can Crontap post to a Discord thread or mention a role?

No. Thread targeting, bot commands, interactive incident controls, and role mentions are not part of v1.

Limits, plan behavior, and security

Discord alert delivery is a paid feature. If the account downgrades to Starter, Crontap keeps the destination and routing configuration but pauses chat delivery. Email remains available.

The channel-bound webhook credential is encrypted at rest. Delivery history exposes status and attempt timing, not the webhook URL.

Crontap is not an on-call or incident-management replacement. It does not provide SMS, calls, acknowledge actions, rotations, or escalation policies.

FAQ

How do I send cron job failure alerts to Discord?

Connect Discord in notification settings, enable it for Schedules, and leave the schedule on Use my defaults. Select a custom route if only that job should reach the channel.

Do I have to paste a Discord webhook URL?

No. Discord creates and returns the incoming webhook during OAuth. Manual webhook URLs remain appropriate when you are scheduling outbound Discord posts rather than configuring alerts.

Can different uptime monitors use different Discord channels?

Yes. Connect each destination once, then select Choose channels on a monitor and check the intended row.

Do recovered monitors notify Discord?

Yes, when an uptime monitor or heartbeat emits recovery. Schedule failures do not share that exact lifecycle.

Can one event notify Discord and Slack?

Yes. A default or custom route can include multiple active channels.

Related guides

From the blog

Read the blog

Guides, patterns and product updates.

Tutorials on scheduling API calls, webhooks and automations, plus deep dives into cron syntax, timezones and reliability.

Product Updates

Introducing AI Integrations

Transform a schedule's HTTP response with a plain-English prompt, return text or JSON, and forward it to Slack, Make, n8n, or your own endpoint. Test on any tier; saving is a Pro feature.

Alternatives

Vercel cron jobs: the Hobby once-per-day limit and how to beat it

Vercel Cron caps Hobby at one run per day, only guarantees timing within the hour, is UTC only, and ties every schedule change to a redeploy. Here is the external cron pattern teams use to ship per-minute, timezone-aware schedules and one dashboard across projects without paying $20/mo per user for Pro.

Alternatives

Cloud Run cron without Cloud Scheduler

Cloud Scheduler costs $0.10 per job per month after the first 3 and asks for OIDC plus IAM bindings on every target. Here is the IAM-free pattern Cloud Run teams use to fire their .run.app URLs on a clock with one bearer token and one dashboard across every GCP project.