EventSend × Lovable
Slack, Discord and Telegram alerts for your Lovable app. One prompt.
Lovable builds it. EventSend tells you it's working: signups, payments and the failures Lovable can't show you, delivered to Slack, Discord, Telegram or your phone. Paste the prompt, pick your channels, done.
The part your builder can't show you
Lovable 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.
-
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.
-
Step 2
Paste the prompt into Lovable's chat
Lovable reads your codebase, writes a small server-side helper, and instruments every moment that matters — failure paths included. You write nothing.
-
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 Lovable's 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.
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 Lovable project. Put the calls in the backend functions, never in React components or anything that runs in the browser, and store EVENTSEND_TOKEN as a backend secret rather than in a file.
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.
❌ Stripe webhook failed: signature mismatch
Questions
Good questions.
- Where does my EventSend token live in a Lovable app?
- In a backend secret, never in the React code Lovable generates. The prompt tells Lovable 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 Lovable 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. Lovable 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 Lovable app actually works.
A free tier that stays free, no credit card required, one prompt to install.
Building with something else?