EventSend × Replit

Slack, Discord and Telegram alerts for your Replit app. One prompt.

Replit builds it. EventSend tells you it's working: signups, payments and the failures Replit can't show you, delivered to Slack, Discord, Telegram or your phone. Paste the prompt, pick your channels, done.

2,500 events a month, free No credit card No code to write

The part your builder can't show you

Replit ships the feature. It doesn't tell you what happened next.

The signup at 2am, the card that got declined, the webhook that silently stopped. None of them show up in a preview window. All of them should show up where your team already looks.

Wins

Celebrate in the channel

A new signup or a payment lands in Slack or Discord the moment it happens, with the plan and amount attached. No dashboard to refresh.

Failures

Get paged for the quiet ones

Every catch block, declined payment and failed webhook becomes an event. Route the critical ones to Telegram or your phone; keep the rest in a channel.

Routing

One POST, every destination

Your app sends once. EventSend fans it out, filters by level and event name, retries each destination on its own schedule, and keeps the delivery log.

Why not paste a Slack webhook URL into the code? Because a bare webhook has no retries, no fan-out, no filters and no history — and the one time it fails is the time it matters.

How it works

Three steps. One of them is pasting.

  1. Step 1

    Create a route, copy its token

    Sign up, create a route in the dashboard, and copy the token that starts with es_. That token is the credential; it goes in an environment variable, never in code.

  2. Step 2

    Paste the prompt into Replit Agent

    Replit reads your codebase, writes a small server-side helper, and instruments every moment that matters — failure paths included. You write nothing.

  3. Step 3

    Point a topic at your channels

    Connect Slack, Discord or Telegram, or add your phone. A topic decides which events go where: everything to a channel, only critical ones to your pocket.

The prompt

Copy it, paste it, done.

Drop it into Replit Agent and let it do the wiring. It maps your app's real moments first, then instruments them server-side with the failure paths included.

eventsend-prompt.md
Add EventSend notifications to this app so I hear about what matters while it runs.

1. First, study what this app actually does. Read the codebase and list the moments
   worth knowing about in THIS product, not a generic checklist. Signups and payments
   are the baseline: a marketplace also cares about listings and orders, an AI app
   about generations and credits, a scheduler about jobs that ran or did not.
   Write that list down before you instrument anything.

2. Send events by POSTing JSON to https://eventsend.io/api/events with the header
   Authorization: Bearer <EVENTSEND_TOKEN> (read from an environment variable;
   never hardcode it, never ship it to the browser).
   Body: { "event": "<kebab-case name, 4-64 chars, e.g. user-signup>",
           "message": "<human-readable text, 4-500 chars>",
           "level": "<default | success | warning | error | critical>",
           "icon": "<one emoji>",
           "payload": { <ids, amounts, plan names; under 4 KB as JSON> },
           "unique_key": "<optional idempotency key, 4-128 chars>" }
   A 202 response means the event is queued. Anything else means it was not.

3. Create one small server-side helper (for example lib/eventsend.ts) wrapping this
   call. It must never throw, never block the response (fire-and-forget), and no-op
   when EVENTSEND_TOKEN is unset.

4. Instrument the moments from step 1, SERVER-SIDE ONLY:
   - Product moments, level "success" or "default": the app's own features being
     used, named in the product's own language ("order-placed", "export-finished").
   - Signups as "user-signup" (success). Payments and subscriptions as
     "payment-received", "subscription-created" (success) and
     "subscription-canceled", "payment-failed" (warning or error).
   - Failures, which matter most, level "error" or "critical": every catch block in
     API routes and server actions, webhook handlers that fail or fail signature
     verification, declined payments, cron jobs that throw or do not complete, and
     failed calls to external APIs.

5. Put a fitting emoji in "icon": 💰 revenue, 🎉 signup, ✅ success, ⚠️ warning, ❌ failure.

6. Put the user's email or id, amounts, plan names and object ids in "payload".
   Never log secrets, passwords, tokens or card numbers.

7. Set "unique_key" wherever the caller might retry: a webhook handler (the provider's
   event id), a CI job (the commit SHA), a queue consumer (the job id).

8. Where the app knows which customer a moment is about, set "user_id" to that
   customer's stable id (your account id, or the Stripe customer id; never the email),
   the same value from every place that reports on them. If the app knows when the
   thing actually happened, set "occurred_at" to that ISO-8601 timestamp; otherwise
   leave it out.

When done, list every file you changed and every event now tracked, with its name and
level, so I can create topics for them in EventSend.

Note: This is a Replit project. Store EVENTSEND_TOKEN in Replit Secrets, not in a file, and keep the calls in the server code.

Then it lands where you work

Not just the wins. The failed payment and the dead webhook too.

Each event goes through every topic its route feeds. A topic's rules decide the destinations, and each destination keeps its own delivery log.

user-signup Delivered

🎉 New user signed up: [email protected]

Slack
payment-received Delivered

💰 Payment received: 49.00 USD from [email protected]

Slack Discord
payment-failed Delivered

❌ Payment failed: card declined for [email protected]

Telegram Push
webhook-failed Delivered

❌ Stripe webhook failed: signature mismatch

Telegram Push Webhook

Questions

Good questions.

Where does my EventSend token live in a Replit app?
In Replit Secrets, never in a file in the workspace. The prompt tells Replit to read EVENTSEND_TOKEN from the environment, so it never appears in your code or in the browser. If it ever leaks, Regenerate Token on the route issues a new one and stops the old one immediately.
Do I need to write any code?
No. Paste the prompt into Replit and it writes the helper and the tracking calls, failure paths included. Where each event ends up is configured in the EventSend dashboard, not in code.
Will this slow my app down?
No. Events are fire-and-forget: the helper never blocks a response, never throws, and silently does nothing when the token is missing. Retries happen on EventSend's side, per destination, after the request has been accepted.
Why not just paste a Slack webhook URL?
Because a bare webhook has no retries, no fan-out, no filters and no history. EventSend takes one POST and delivers it to Slack, Discord, Telegram, your own webhook or your phone, retries each destination on its own schedule, filters by level and event name, and keeps a per-attempt delivery log.
Can my assistant read the events back?
Yes, from an assistant that supports MCP. EventSend has a read-only MCP server, on every plan including Free: claude.ai, ChatGPT and Claude Desktop connect with a sign-in, Claude Code and Cursor with a key from your organization's MCP settings. Replit builds the app; the questions go to the assistant, in plain language: did anything fail in checkout today, what did this customer do before cancelling, are deliveries to Slack failing. Nothing it does can change your account.

Get started

Know your Replit app actually works.

A free tier that stays free, no credit card required, one prompt to install.

Building with something else?