alerts Β· alternative Β· mobile

Free Sentry Alternative: Telegram Alerts in 10 Lines

Sentry tells you why it broke. A free Telegram bot tells you that it broke, in two seconds, on your phone. How to build it, and when to keep both.

The Sentry logo, faded, with a curved arrow to the BoringPush logo
The Sentry logo, faded, with a curved arrow to the BoringPush logo Β· Photo: BoringPush

On 29 April 1852, at 8:25 in the evening, somebody in Boston used one of forty new black boxes bolted to the city's street corners.

The signal went down a wire to a central office, and from there out to the alarm bells. Nobody had to run through the streets to raise the alarm. The wire did the running.

It was the first fire alarm telegraph ever built for a city. It had been finished the day before.

Fire alarm telegraph instruments, 1852
Fire alarm telegraph instruments credited to William Francis Channing, 1852. Public domain, via Wikimedia Commons.

The man behind it was William Francis Channing, a Boston doctor. With the telegraph engineer Moses Farmer, he talked the city into paying $10,000 for 40 street boxes, 19 bells and one central office on Court Square.

Channing said the idea came from the human body. A city, he thought, should have a nervous system. A signal from anywhere should reach the brain at once.


The box only said one thing

Here's the part I love.

The fire box didn't tell anyone what was burning. Not the cause, not the size, not who started it. It tapped out one thing: its own number.

Box 432. That's it.

The number told the firemen where. They figured out why when they got there.

That one limit is why it worked. The message was so small it could not fail to arrive.

A Gamewell fire alarm call box, number 432
A Gamewell call box still on a street in Somerville, Massachusetts. Pull the hook and it sends one thing: 432. Photo: Decreasing volume, CC0, via Wikimedia Commons.

Your app needs the box, not the fire report

When your checkout breaks at 2 a.m., you need two different things.

  1. Someone has to know. Right now, on the phone in your pocket.
  2. Someone has to find out why. Stack trace, request, user, release.

Sentry is excellent at the second one. It's the fire report: what burned, where it started, which deploy lit it.

But most solo founders find out about the fire from an angry customer email the next morning. The report was sitting in a dashboard they didn't open.

Here's what Sentry costs today (checked 18 October 2026 on sentry.io/pricing):

Plan Price Errors / month Users Alerts
Developer $0 5,000 1 Email
Team $26/mo (billed yearly) 50,000 Unlimited Email, Slack and more
Business $80/mo (billed yearly) 50,000 Unlimited Plus advanced quota tools
Telegram bot $0 No quota You Phone buzz, ~2 seconds

Two honest notes before you cancel anything.

The free Sentry plan is real and generous for one person. And 5,000 errors goes fast: one noisy browser error on a busy page can use it up, and then you're blind when the real outage comes.

So this post isn't "Sentry bad." It's: build the fire box first. It's ten lines and it's free.


Step 1: make a bot (2 minutes)

  1. In Telegram, open @BotFather and send /newbot. Copy the token it gives you.
  2. Send any message to your new bot.
  3. Open https://api.telegram.org/bot<TOKEN>/getUpdates in a browser and copy the chat.id number.

Keep both as private settings on your server, never in git.

Step 2: the fire box

No SDK, no source maps. Node's built-in fetch does it:

export async function sendAlert(message, context = {}) {
  const token = process.env.BOT_TOKEN;
  const chatId = process.env.CHAT_ID;
  if (!token || !chatId) return;

  const text = `🚨 ${message}\n\n${JSON.stringify(context, null, 2)}`;
  const res = await fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ chat_id: chatId, text }),
  }).catch((err) => ({ ok: false, statusText: err.message }));
  if (!res.ok) console.error("Alert not delivered:", res.statusText);
}

Two choices in there are on purpose.

It sends plain text. Telegram's Markdown modes reject a message if your error text has a stray _ or * in it, and an alert that fails because of an underscore in a stack trace is the worst kind of silence.

And it checks res.ok. fetch doesn't throw on a 400. Without that line, a broken alert looks exactly like a sent one.

Step 3: mute the repeats

The classic mistake: a loop throws 400 errors in two minutes and your phone vibrates off the nightstand.

Mute repeats of the same alert for 60 seconds:

const lastSent = new Map();

export function isRepeat(key, windowMs = 60_000) {
  const now = Date.now();
  if (now - (lastSent.get(key) ?? 0) < windowMs) return true;
  lastSent.set(key, now);
  return false;
}

Call the check at the top of your alert function and return early if it's true.

Step 4: put boxes on the right corners

Boston put 40 boxes on street corners, not one in every room. Do the same.

Only alert on things that cost money or data right now:

try {
  await fulfillOrder(paymentRef);
} catch (err) {
  await sendAlert("Payment webhook failed", { paymentRef, error: err.message });
  throw err;
}

Good corners: payment webhooks, sign-in failures, the database refusing connections, a background job that died. Bad corners: every 404, every warning, every slow request. Those go in the fire report, not the bell.

A failed checkout reaches your phone on Telegram in about two seconds
The whole path: the webhook fails, the alert fires, repeats get muted, your phone knows in about two seconds.

So: replace Sentry, or keep it?

You are… Do this
Solo, pre-revenue Telegram bot only. Read server logs when it buzzes.
Solo, paying customers Telegram bot plus Sentry's free plan for stack traces.
Two or more people on call Sentry Team, with the bot as a backup that doesn't depend on Sentry being up.

The bot is the box on the corner. Sentry is the fire report. You almost always want the box first.

Know this first

The bot rings only where you put a box. Sentry catches everything on its own.

That's why they pair well.

The free Sentry plan is real and generous for one person. Five thousand errors goes fast.

The 60-second mute lives in memory, so a restart resets it. You get a few extra buzzes, never a missed one.

Why BoringPush is the way to do this

The box is already on the corner.

BoringPush alerts Telegram or Discord when a payment webhook fails or a sign-in breaks. Repeats are muted for a minute.

Add your bot details and your phone is wired in. No dashboard to remember to open.

Channing would have recognized the idea: a signal from anywhere reaches the person who can act on it, at once.

FAQ

Is a Telegram bot really free?

Yes. The Telegram Bot API has no paid tier for sending messages to yourself. There is a rate limit, but an alert bot with a 60-second mute never comes near it.

Why not just use Sentry's free plan alone?

You can. Its alerts go to email on the free plan, and email is the thing you check tomorrow. The bot puts the alert on your lock screen.

Will it catch errors I didn't wrap?

No, and that's the trade. Sentry catches everything on its own; the bot only rings where you put a box.

That's why it pairs with Sentry instead of fighting it.

Telegram or Discord?

Whichever app you already have notifications on for. BoringPush supports both through the same alert function.

Does it work on Vercel?

Yes. Keep the await on the alert call in serverless functions so the request isn't frozen before the message goes out.

The 60-second mute lives in memory, so it resets between cold starts. That means a few extra buzzes, not missed ones.

Keep reading

Get BoringPush β†’

+ all the boring stuff (analytics, auth, SQLite ↔ Supabase, full marketplace, webhooks)

The Agent-First Shipping Kit

Command from your phone.

Built so autonomous AI agents build what you want without breaking what's already paying you.

$199

Get BoringPush

One-time payment Β· Lifetime updates Β· Unlimited projects.

Keep reading