Rovenue SDK
Integrations

Discord

Post real-time Rovenue revenue, subscription, funnel-session, and credit-ledger events to a Discord channel via an incoming webhook.

Discord

The Discord integration posts a short, human-readable message to a Discord channel for every Rovenue event you enable — revenue events (purchases, trial conversions, renewals, refunds, cancellations), subscription-lifecycle events (trials, grace period, billing issues, plan changes), funnel-session events (started, advanced, paid, completed, abandoned, dismissed, custom actions), and credit-ledger events. It's a notification channel, not a data pipeline — like Slack, it subscribes to all four Rovenue fanout topics and every one of the 30 public event keys, since there's no reason to scope a Discord alert to a single event family the way an analytics or attribution tool would. The message builder is the exact same one Slack uses (buildChatMessageText), so both channels format events identically — only the outer envelope differs ({ "text": "..." } for Slack, { "content": "..." } for Discord).


1. Create an incoming webhook in Discord

  1. In Discord, open the server settings for the channel you want events posted to, go to Integrations → Webhooks, and click New Webhook (or reuse an existing one) — see Discord's Execute Webhook documentation if you haven't done this before.
  2. Name the webhook and confirm the target channel.
  3. Click Copy Webhook URL — it looks like https://discord.com/api/webhooks/123456789012345678/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.

Treat this URL as a secret: anyone who has it can post messages to your channel.


2. Add the integration in Rovenue

  1. In the Rovenue dashboard, navigate to Apps (left sidebar).
  2. Find Discord under Communication & alerts and click it.
  3. The side drawer opens. Fill in the Credentials step:
    • Incoming webhook URL — paste the URL from step 1.
  4. Click Validate.

Validate posts a real message. Unlike a zero-footprint credential check, Rovenue confirms a Discord incoming webhook by actually posting Rovenue connected ✅ to the configured channel — the same way you'd confirm a Discord integration by hand. This is intentional (it's the standard way to prove a Discord webhook works) but it means clicking Validate again posts the message again; it is not deduplicated the way Amplitude's/Mixpanel's credential probes are.

  1. Choose which events to forward, optionally review the mapping step, then activate.

3. Event mapping

Discord has no vendor-specific event vocabulary of its own — every one of Rovenue's 30 public event keys, including the seven funnel.session.* keys, maps to itself. The mapping step exists only if you want to relabel what shows up in the connection's Delivery Log; it has no effect on the Discord message content.


4. Message format

Each event becomes a single Discord message ({ "content": "..." }, no embeds), prefixed with an emoji per event family:

Event familyPrefixExample
revenue.*:moneybag::moneybag: revenue.RENEWAL — 9.99 USD · prod_gold · subscriber sub_…
subscription.* (+ subscriber.identified):repeat::repeat: subscription.trial.started · subscriber sub_…
credit.ledger.appended:coin::coin: credit.ledger.appended · subscriber sub_…
funnel.session.*:footprints::footprints: funnel.session.started · subscriber sub_…

The subscriber segment shows only the first 4 characters of the Rovenue subscriber id, followed by an ellipsis — enough to recognize repeat activity from the same subscriber in a channel, without printing an identifier a reader could act on. A funnel.session.* message never shows an amount, even for .paid (money is only ever reported on revenue.*), and the subscriber segment follows the webhook's subscriberId. A native (device) event shows it whenever the device sent its Rovenue id, identified or anonymous. A web event shows it on funnel.session.completed only. A GDPR-erased subject's events never show it.

No PII ever appears in a Discord message. The message builder only ever reads the event key, amount, currency, product id, and (masked) subscriber id off the event — it never reads identityContext (email, phone, IP, user agent) or subscriber attributes (arbitrary host-app-set key/values), regardless of what a subscriber's profile carries.


5. At-least-once delivery and duplicate messages

Like Slack, Discord has no consumer-side dedup key, so the pipeline's at-least-once delivery can rarely duplicate a message (a crash between POST and status write) — accepted for a notification channel.


6. Verify events are arriving

  1. Trigger a real event from your app (a purchase, a trial start, a funnel session) and check the configured Discord channel — messages typically arrive within a few seconds.
  2. If messages are not appearing:
    • Check Apps → Discord → Delivery Log in Rovenue for HTTP status codes and error messages.
    • A 404 response (Discord's "Unknown Webhook") means the webhook was deleted in Discord — recreate it and update the connection's credentials.
    • A 401 or 403 response means the webhook's token is invalid or revoked — recreate the webhook and update the connection's credentials.
    • A 400 response means the request was malformed; this indicates a bug rather than a misconfiguration and should not recur on retry.
    • A 429 response means Discord is rate-limiting the webhook; Rovenue's delivery queue retries automatically with backoff.
    • Ensure the event type you're sending is included in the connection's enabled events.
    • Rovenue only ever POSTs to https://discord.com/api/webhooks/... or https://discordapp.com/api/webhooks/... — a webhook URL hosted anywhere else, or at any other path, is rejected at both credential-validation time and delivery time.

On this page