EventSend × Cursor

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

Cursor builds it. EventSend tells you it's working: signups, payments and the failures Cursor 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

Cursor 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 Cursor's Agent chat

    Cursor 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 Cursor's Agent chat 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.

9. Add the EventSend MCP server to this tool so I can ask you what happened once
   events are flowing. It is read-only, and the key comes from Settings → MCP in
   EventSend, so treat it like EVENTSEND_TOKEN and never commit it:
   Add to ~/.cursor/mcp.json: {"mcpServers": {"eventsend": {"url": "https://eventsend.io/mcp", "headers": {"Authorization": "Bearer mcp_YOUR_KEY"}}}}

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 Cursor project. Run this in Agent mode so you can read the codebase and edit files. Put EVENTSEND_TOKEN in .env, add the variable name to .env.example without a value, and make sure the real token is never committed.

Then ask it what happened

Your events, answered in Cursor.

EventSend has a read-only MCP server. Connect it once, then ask in plain language: did anything fail in checkout today, what did this customer do before cancelling, are deliveries to Slack failing.

eventsend-mcp
Add to ~/.cursor/mcp.json: {"mcpServers": {"eventsend": {"url": "https://eventsend.io/mcp", "headers": {"Authorization": "Bearer mcp_YOUR_KEY"}}}}

The key comes from your organization's MCP settings, and nothing the server does can change your account. Every plan has it, Free included. Read the MCP docs

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 Cursor app?
In a .env file locally and your host's environment variables in production. The prompt tells Cursor 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 Cursor 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. EventSend has a read-only MCP server, on every plan including Free. Create a key on your organization's MCP settings, add the server to Cursor with the one line shown under the prompt on this page, and ask 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 Cursor app actually works.

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

Building with something else?