---
title: "Website down notification email via Resend | Logdash"
description: "Logdash has no native email alerts. Here is the 30-line relay that turns its webhook into an email through Resend or Postmark, and when UptimeRobot is simpler."
url: https://logdash.io/alerts/email
---

# Website down notification email

Logdash does not send email alerts itself, so a website down notification email means a Logdash webhook pointed at a 30-line Cloudflare Worker that mails each down and up alert through Resend or Postmark.

Honest version first: Logdash sends alerts to Telegram and to webhooks, and email is not one of them. If you want a website down email alert with zero code, UptimeRobot sends one on its free plan and is the better pick for that job. If you are already on Logdash, or want the email next to a Telegram ping, a small relay does it.

The relay needs Builder at $9 a month. The free Hobby webhook sends a GET with no body, so there is nothing to put in the email. Builder sends a POST with the monitor name, the new status, the URL, the status code and the error.

## The website down email alert relay

 worker.js 

```javascript
// worker.js - Logdash webhook in, email out through Resend.
// npx wrangler deploy worker.js --name logdash-email \
//   --compatibility-date 2026-01-01
// npx wrangler secret put RESEND_API_KEY --name logdash-email
// npx wrangler secret put RELAY_SECRET --name logdash-email
// npx wrangler secret put ALERT_TO --name logdash-email
// ALERT_TO takes one address or a comma separated list.
export default {
  async fetch(request, env) {
    const secret = request.headers.get('x-relay-secret');

    if (request.method !== 'POST' || secret !== env.RELAY_SECRET) {
      return new Response('forbidden', { status: 403 });
    }

    // { httpMonitorId, newStatus, name, url, statusCode, errorMessage? }
    const alert = await request.json();
    const lines = [
      `${alert.name} is ${alert.newStatus}`,
      `URL: ${alert.url}`,
      `Status code: ${alert.statusCode}`,
    ];

    if (alert.errorMessage) {
      lines.push(`Error: ${alert.errorMessage}`);
    }

    const sent = await fetch('https://api.resend.com/emails', {
      method: 'POST',
      headers: {
        authorization: `Bearer ${env.RESEND_API_KEY}`,
        'content-type': 'application/json',
      },
      body: JSON.stringify({
        from: 'Logdash alerts <onboarding@resend.dev>',
        to: env.ALERT_TO.split(',').map((address) => address.trim()),
        subject: `${alert.newStatus.toUpperCase()}: ${alert.name}`,
        text: lines.join('\n'),
      }),
    });

    return new Response(null, { status: sent.ok ? 204 : 502 });
  },
};
```

The `from` address `onboarding@resend.dev` works without a domain, but Resend only delivers it to the address on your own Resend account. For a solo founder that is enough. To mail anyone else, verify a sending domain in Resend and change `from` to an address on it. The Resend free plan covers 3,000 emails a month and 100 a day. An alert channel sends two per incident.

Prefer Postmark? Swap the URL for `https://api.postmarkapp.com/email`, send the key in an `X-Postmark-Server-Token` header instead of authorization, and add `Accept: application/json`, and rename the fields to `From`, `To`, `Subject` and `TextBody`. Postmark wants `To` as one comma separated string, and `From` must be a confirmed sender signature. Its free developer plan covers 100 emails a month, and until Postmark approves the account it only delivers to your own domain.

1. **Get a Resend API key** Create a Resend account and an API key with sending access. Note the email address on the account, since that is where the test domain can deliver.
2. **Deploy the relay** Run the four wrangler commands at the top of the file and paste the API key, a long random secret and your address when asked. The Cloudflare free plan allows 100,000 requests a day.
3. **Wire it and break it** Add a Logdash webhook channel with method POST, the workers.dev URL and an x-relay-secret header holding the same secret, attached to the monitor next to Telegram. Stop the app: the email goes out and the Telegram alert reaches your phone on the same check.

## What the email says

Subject `DOWN: API` or `UP: API`, then plain text: the name and new status, the URL, the status code and, on down, the error, which is either the first part of the response body or a network error such as `Timed out after 10s`. Plain text on purpose, because it reads the same in every mail client.

An inbox is where alerts go to be read later. A 3am outage email waits next to the newsletters until you next open mail, so it is the record, not the wake-up call. Keep Telegram attached to the same monitor for the ping that reaches you, and let the email be the thread you forward to a client or a co-founder.

## Uptime monitoring email alerts: Logdash vs UptimeRobot

### Email alerts: Logdash vs UptimeRobot

| Feature                  | Logdash                                       | UptimeRobot                       |
| ------------------------ | --------------------------------------------- | --------------------------------- |
| Email alerts             | Webhook plus a relay you deploy               | Built in on every plan            |
| Cheapest plan with email | Builder, $9/month, plus a free Resend account | Free                              |
| Free plan check interval | 5 minutes                                     | 5 minutes                         |
| Telegram alerts          | Free on Hobby                                 | From Solo, its cheapest paid plan |
| App logs and metrics     | Same service view, eight SDKs                 | Not offered                       |

### When UptimeRobot is the better pick

- Email is the channel you want and you do not want to deploy anything. UptimeRobot sends it on the free plan.
- You want the email only after the site has been down for a few minutes, with reminders until it is back. UptimeRobot has both from Solo, Logdash sends one alert per state change.
- You never want to own code in the alert path. A relay is one more thing that can break quietly.

### Does Logdash send a website down notification email? 

Not natively. Alerts go to Telegram or a webhook. The webhook plus the relay on this page sends the email through Resend or Postmark, and needs the Builder plan because the free webhook has no body.

### How do I set up a website down email alert? 

Deploy the Worker above with a Resend API key, a shared secret and your address, then add a POST webhook channel in Logdash with the same secret in an x-relay-secret header. The next failed check sends the email.

### Which uptime monitoring email alerts are free? 

UptimeRobot sends email alerts on its free plan, 5-minute checks included. Logdash does not, but its free Hobby plan sends Telegram alerts for 5 services at the same 5-minute interval.

### How fast does a website down email alert arrive? 

The webhook leaves Logdash on the check that flips the monitor, so the delay is your interval: up to 5 minutes on Hobby, 1 on Builder, 15 seconds on Pro. After that it is down to Resend and your inbox.

## Keep reading

[All alert channels](https://logdash.io/alerts): One page per channel, each with the setup, the code and what it cannot do yet.

[Uptime monitoring webhook](https://logdash.io/alerts/webhook): When a check flips between up and down, Logdash sends one HTTP request to your URL, and on POST, PUT or PATCH it carries a flat JSON body with the monitor id, new status, name, URL, status code and error.

[Website down alert on Telegram](https://logdash.io/alerts/telegram): Add @logdash\_uptime\_bot to a Telegram chat or group, send it the one-time passphrase Logdash shows you, and the bot posts a red-dot down message on the first failed check and a green-dot up message when the site recovers.

[Discord uptime monitoring bot](https://logdash.io/alerts/discord): Logdash has no Discord bot, so the working setup is a Discord channel webhook fed by a 30-line Cloudflare Worker that turns the Logdash webhook alert into a Discord message.

[Uptime monitoring](https://logdash.io/features/monitoring): HTTP checks as often as every 15 seconds. When one fails, Telegram tells you before your users do.
