Alert Channels
HelloCron can notify you about monitor events (failures, missed runs, timeouts, recoveries) through several channels. You can configure any number of channels and choose which event types each channel receives.
All channels are managed in the panel under Settings -> Notification Channels. Every channel has a Test button that sends a test notification only to that channel, so you can verify the configuration before relying on it.
| Channel | Availability |
|---|---|
| all plans | |
| Telegram | all plans |
| Discord | all plans |
| Webhook | plan with webhook alerting |
| Slack | plan with Slack alerting |
| PagerDuty | plan with PagerDuty alerting |
The simplest channel. Leave the address field empty to use your account email, or enter a different address (for example a team alias).
Telegram
Telegram alerts are free and instant, and connecting takes one click.
- In the panel, add a channel of type Telegram and click Connect Telegram.
- Scan the QR code with your phone (or click Open in Telegram) and press Start in the chat that opens. For a group, use Add to a group instead and pick the group.
- The form fills in by itself and shows “Connected”. Save the channel and click Test.
Alerts are delivered by the official HelloCron bot. No tokens, no chat IDs, nothing to look up.
Advanced: your own bot. If you prefer alerts to come from a bot you control, expand Advanced: use your own bot in the form: create a bot via @BotFather (/newbot, copy the token in the 123456789:AAF... format), get the chat ID from https://api.telegram.org/bot<TOKEN>/getUpdates (group IDs are negative), and enter both fields. A channel with its own token always sends through that bot. HelloCron stores the token for delivery only and never includes it in logs.
Discord
Discord alerts use channel webhooks, no bot required.
- In Discord, open the target channel settings: Integrations -> Webhooks -> New Webhook.
- Copy the webhook URL (it starts with
https://discord.com/api/webhooks/). - In the panel, add a channel of type Discord and paste the URL.
- Click Test. Alerts arrive as embeds, green for recoveries and red for failures.
Slack
- Create an incoming webhook in your Slack workspace.
- In the panel, add a channel of type Slack and paste the webhook URL (starts with
https://hooks.slack.com/services/). - Click Test.
PagerDuty
PagerDuty alerts use the Events API v2, so failures open incidents and recoveries resolve them automatically.
- In PagerDuty, create a service (or open an existing one) and add an Events API v2 integration: Service -> Integrations -> Add integration -> Events API v2.
- Copy the Integration Key (also called a routing key, 32 characters).
- In the panel, add a channel of type PagerDuty and paste the key.
- Click Test.
How events map:
- Failed, Missed and Timeout trigger an incident with
criticalseverity; Degraded and Still failing usewarning. - Recovered resolves the incident opened for that monitor, using a shared deduplication key, so one flapping monitor never piles up incidents.
- Every incident carries a link back to the monitor in the HelloCron panel.
Webhook
Sends a JSON payload to any HTTP endpoint, useful for integrating with your own systems, on-call tools, or automation.
{ "id": 123, "type": "failed", "monitor_name": "db-backup", "message": "Monitor db-backup failed", "metadata": {}, "occurred_at": "2026-07-24T18:00:00+00:00"}- Method:
POST(default) orGET(payload as query parameters). - Custom headers: one per line as
Header-Name: value, for example anAuthorizationheader for your endpoint. - Slack and Discord webhook URLs are rejected here on purpose: their APIs expect a different payload format. Use the dedicated Slack or Discord channel type instead.
Variables
The payload above is the default. When the receiving system expects its own format, put variables in the URL, the body, or both:
| Variable | Value |
|---|---|
$MONITOR | Monitor name |
$STATUS | Event type: failed, recovered, missed, timeout, degraded, still_failing |
$MESSAGE | Alert message |
$ID | Notification id |
$TIME | Time of the event, ISO 8601 |
A custom body is sent exactly as written, so the receiving system decides the format, not us:
{"text": "$MONITOR is $STATUS", "detail": "$MESSAGE"}Variables also work in the URL, which is the only option for systems that accept alerts through query parameters and no request body:
https://example.com/hook?monitor=$MONITOR&status=$STATUSEscaping is handled per context and you do not need to think about it: values in the URL are percent-encoded, values in the body are escaped as JSON string content. A monitor named nightly backup & sync will not break the query string, and an error message containing quotes will not break the JSON.
Leave the body empty to keep the default payload.
Notification groups
A notification group is a named set of channels. A monitor assigned to a group alerts only that group’s channels; monitors without a group keep the default behaviour and alert every enabled channel on the account.
Typical setup: a “backups” group pointing at a dedicated Telegram chat and a “www” group pointing at the on-call webhook. Because an account can have several channels of the same type, each group can target its own Telegram chat.
Manage groups in Settings -> Notification channels -> Manage groups: create a group, tick its channels, and attach monitors (ping and HTTP/SSL checks alike) on the same page. You can also pick a group when editing a single monitor.
Two details worth knowing:
- A group with no channels silences its monitors outside the panel (the in-app bell still works). The panel warns about this.
- Deleting a group never deletes anything else: its monitors fall back to all account channels.
In config-as-code manifests the group travels as notification_group (the group’s name). Omitting the key detaches the group; unknown names are rejected with the error code notification_group_invalid.
Event types
Each channel subscribes to a subset of event types:
| Event | Meaning |
|---|---|
| Failed | the job reported a failure |
| Missed | an expected run did not arrive in time |
| Timeout | the job started but did not complete in time |
| Degraded | the check is failing intermittently |
| Recovered | the monitor is healthy again |
| Still failing | periodic reminder while a failure is ongoing |