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

Source: https://boringpush.com/blog/sentry-alternative-telegram-alerts

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](/blog/sentry-alternative-telegram-alerts/channing-fire-alarm-system-1852.jpg "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](/blog/sentry-alternative-telegram-alerts/gamewell-fire-alarm-box.jpg "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](https://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:

```js
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:

```js
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**:

```js
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](/blog/sentry-alternative-telegram-alerts/telegram-incident-alert.svg "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

- [Sentry vs Telegram Alerts for Indie Hackers](/blog/sentry-vs-telegram-alerts-indie)
- [Incident Alerts, Priced: PagerDuty and Opsgenie](/blog/incident-alerts-priced-pagerduty-opsgenie)
- [Pocket Incident Alerts on Discord](/blog/pocket-incident-alerts-discord)

[Get BoringPush →](https://boringpush.com/#get)
