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
| Field | Required | Description |
|---|---|---|
webhook_url | Yes | The full webhook URL you copied from Discord. Stored as a secret. |
Management UI Setup
- Go to Integrations > Add Integration > Discord.
- Choose the Default preset and paste your
webhook_url. - 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 event | Message title | Detail lines | Default |
|---|---|---|---|
purchase | New order | Order ID (transaction_id, else order_id); value and currency (value, else revenue; currency upper-cased) | On |
generate_lead | New lead | Lead type; value and currency | On |
sign_up | New sign-up | Sign-up method; plan | On |
subscription_started | New subscription | Plan; value and currency | Off |
| Every other event, page views included | Dropped |
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
- Create a throwaway webhook in a private test channel and paste its URL into a test Signal integration.
- Trigger a
purchaseevent on your site (or replay one from Signal’s event debugger). - Confirm the message appears in the test channel within a second or two.
- Inspect the embed fields to verify your mappings produced the values you expect.
- When satisfied, point the integration at the real channel’s webhook URL.
Troubleshooting
| Problem | Solution |
|---|---|
| Nothing arrives in the channel | Confirm the webhook_url is complete and unedited. Check the webhook still exists in Discord (Channel > Integrations > Webhooks). |
401 / 403 / 404 errors | The webhook was deleted or its token rotated. Recreate the webhook in Discord and update webhook_url in Signal. |
400 errors | The 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 noisy | Make 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 / 429 | Discord 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. |