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 - 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.
- 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.
- 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.
- 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.