Discord

Datafly Signal posts real-time notifications to a Discord channel using an Incoming Webhook. When a notify-worthy event happens on your site — an order, a sign-up, a new lead — Signal sends a message to your channel server-to-server. There is no client-side script and no bot to host.

Discord webhooks are a notification surface, not an advertising or identity API. Signal does not send hashed PII or consent signals to Discord — it sends a human-readable message describing the event. Keep low-volume, high-signal events mapped (orders, sign-ups, leads) so the channel stays useful.

Why route Discord through Datafly Signal

  • Alerts fire off the same event stream as everything else. No separate instrumentation, and no gap between what your destinations received and what Discord told you about.
  • Which events reach you is configuration, not code. The trigger conditions live in the pipeline alongside every other rule, so tuning what reaches Discord does not require an application release.
  • Alert volume is rate-limited. Signal applies the same rate limiting and retry behaviour it uses for any destination, so an incident that spikes your event rate does not flood the channel.

Prerequisites

You need Manage Webhooks permission on the Discord server (guild) where you want notifications to land.

Open the channel’s webhook settings

In Discord, go to the channel you want to post into, then Edit Channel (the gear icon) > Integrations > Webhooks. You can also reach this from Server Settings > Integrations > Webhooks.

Create a webhook

Click New Webhook. Give it a name (e.g. “Datafly Signal”) and, optionally, an avatar. Confirm it is pointed at the correct channel.

Copy the Webhook URL

Click Copy Webhook URL. The URL looks like:

https://discord.com/api/webhooks/123456789012345678/aBcDeFgHiJkLmNoPqRsTuVwXyZ...
⚠️

This URL contains the webhook token. Anyone who has it can post to your channel. Treat it as a secret — store it only in Signal, and rotate it (delete and recreate the webhook) if it leaks.

Configure in Signal

Configuration Fields

FieldRequiredDescription
webhook_urlYesThe full webhook URL you copied from Discord. Stored as a secret.

Management UI Setup

  1. Go to Integrations > Add Integration > Discord.
  2. Choose the Default preset and paste your webhook_url.
  3. Click Save.
⚠️

Turn on Only send mapped fields (strict_output_contract) for this integration. It is the default for integrations created since the strict contract became the default; an integration created before it, or one set to forward unmapped fields, also sends every property the blueprint did not map, which can include personal data added by identity enrichment (#1557).

API Endpoint

Signal delivers each event with the Discord Execute Webhook endpoint:

POST https://discord.com/api/webhooks/{webhook.id}/{webhook.token}

Authorization is the token in the URL. A successful send returns 204 No Content.

Identity Signals

Discord is a channel notification surface: Signal sends no identity data (no email, phone, name, IP or hashed identifier). allowed_mentions.parse is always empty, so no event value can ping @everyone, @here, a role or a user.

Event Mapping

Default preset

Signal eventMessage titleDetail linesDefault
purchaseNew orderOrder ID (transaction_id, else order_id); value and currency (value, else revenue; currency upper-cased)On
generate_leadNew leadLead type; value and currencyOn
sign_upNew sign-upSign-up method; planOn
subscription_startedNew subscriptionPlan; value and currencyOff
Every other event, page views includedDropped

A missing value shows as -, and an over-long value is truncated to Discord’s limits (2,000 characters of content, 1,024 per field value) so it cannot make Discord reject the message. No message carries the visitor’s email, phone, name or address.

Each message has a one-line content summary and one embed (embeds[0]) with a title, a colour and one inline field per detail line. Field values are always strings.

Example: purchase

{
  "username": "Datafly Signal",
  "allowed_mentions": { "parse": [] },
  "content": "New order | Order: ORD-001 | Value: 129.99 GBP",
  "embeds": [{
    "title": "New order",
    "color": 5814783,
    "fields": [
      { "name": "Order", "value": "ORD-001", "inline": true },
      { "name": "Value", "value": "129.99 GBP", "inline": true }
    ]
  }]
}

Testing

  1. Create a throwaway webhook in a private test channel and paste its URL into a test Signal integration.
  2. Trigger a purchase event on your site (or replay one from Signal’s event debugger).
  3. Confirm the message appears in the test channel within a second or two.
  4. Inspect the embed fields to verify your mappings produced the values you expect.
  5. When satisfied, point the integration at the real channel’s webhook URL.

Troubleshooting

ProblemSolution
Nothing arrives in the channelConfirm the webhook_url is complete and unedited. Check the webhook still exists in Discord (Channel > Integrations > Webhooks).
401 / 403 / 404 errorsThe webhook was deleted or its token rotated. Recreate the webhook in Discord and update webhook_url in Signal.
400 errorsThe message body was empty or exceeded a limit (content > 2000 chars, or embeds > 6000 chars combined). The Default preset truncates content to 2,000 characters and each field value to 1,024; a mapping you add must stay within the limits too.
Channel is too noisyMake sure only high-signal events are enabled. The Default preset drops page views and product events via defaults.action: drop; do not enable page.
Occasional delays / 429Discord rate-limits webhooks (~5 messages every 2 seconds). Signal throttles delivery and retries on 429. If you genuinely need higher volume, split across multiple webhooks/channels.