Never miss a server error again
Error e-mails drown in the inbox, dashboards only help if you open them. One line of code in your catch block, and every exception lands on your phone – with an alarm sound you recognize before you even look at the screen.
Error alerts from any catch block
Your endpoint is just a URL, so any language that can send an HTTP POST can page you – no SDK, no API key:
try {
await chargeCustomer(order);
} catch (err) {
await fetch("https://api.webhooky.app/YOUR_KEY", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
title: "🚨 chargeCustomer failed",
message: String(err).slice(0, 400),
}),
});
throw err;
}
title and message override the endpoint's defaults per request, so one “Errors” endpoint covers your whole backend – the notification itself tells you what broke and where. Enable store payload and the full error context is waiting in your in-app history.
The cha-ching for your own product
The same trick works for the good news. Fire a POST in your payment success handler and your phone plays a cash register for every sale; fire one on signup and new customers sound like a level-up:
await fetch("https://api.webhooky.app/SALES_KEY", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
title: "💰 New subscription",
message: `${plan.name} · €${plan.price} · ${customer.email}`,
}),
});
Why sounds matter
Create one endpoint per signal and give each its own sound: alarm for errors, cash register for sales, level-up for signups. After a day you stop looking at your phone – you hear whether your product just made money or just broke. That's the entire point.
Works everywhere your code runs
- Serverless functions – Cloud Functions, Lambda, Vercel, Cloudflare Workers.
- Cron jobs & scripts – one curl on failure (
|| curl -X POST …). - CI pipelines – a step with
if: failure(), see the GitHub & CI guide. - Anything else – if it speaks HTTP, it can reach your phone. API docs →