Webhook Guides

Send Webhook Events to Discord Channels

A webhook to Discord workflow turns selected provider or internal events into Discord channel messages through a first-class FastHook DISCORD_WEBHOOK destination. It works well for incident alerts, release notes, community operations, support handoffs, and lightweight operational feeds.

Configure a Discord webhook URL, message template, optional username, avatar, embeds, components, polls, thread routing, and allowed mentions policy on the destination. Add filters before the destination so Discord receives useful messages instead of every raw event.

Discord source vs Discord destination

IntentFastHook patternPage
Receive Discord interaction callbacksDiscord source with Ed25519 signature verificationDiscord webhooks guide
Send provider events into a Discord channelDiscord Webhook destination using Discord execute webhookThis page

Discord notification use cases

  • Alert an engineering or support channel when a webhook delivery fails.
  • Post deployment, release, or workflow events from GitHub into a Discord server.
  • Notify community moderators about payment, signup, or moderation events.
  • Send selected Stripe, Shopify, GitHub, or custom events to a channel with readable templates.
  • Replay missed notifications after fixing a Discord webhook URL or embed template.

Create the Discord destination

Create a Discord webhook in the target channel and keep the webhook URL secret. Use one FastHook destination per channel or workflow so rate limits, replay, and pause controls stay easy to reason about.

Create Discord destination
curl -X POST "https://api.fasthook.io/v1/destinations" \
  -H "Authorization: Bearer fhp_xxx" \
  -H "x-team-id: tm_3b5335b627084a838b" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Discord incident feed",
    "type": "DISCORD_WEBHOOK",
    "config": {
      "webhook_url": "https://discord.com/api/webhooks/...",
      "content_template": "Webhook failed: {{payload.type}} for {{payload.customer.email}}",
      "username_template": "FastHook Alerts",
      "embeds_template": "[{\"title\":\"Webhook event\",\"description\":\"{{payload.type}}\",\"color\":15158332}]",
      "thread_id_template": "{{payload.discord_thread_id}}",
      "components_template": "[{\"type\":1,\"components\":[{\"type\":2,\"style\":5,\"label\":\"Open incident\",\"url\":\"https://dashboard.fasthook.io/requests/{{request_id}}\"}]}]",
      "files_template": "[{\"url\":\"{{payload.file_url}}\",\"filename\":\"incident-report.pdf\"}]",
      "suppress_notifications": true,
      "allowed_mentions_parse": [],
      "rate_limit": 1,
      "rate_limit_period": "second"
    }
  }'

Shape the Discord message

Discord accepts content, embeds, components, polls, and file uploads from public HTTPS URLs. Existing threads use thread_id_template; forum and media channels can create a new thread with thread_name_template. Configure only one thread field.

Discord message template
{
  "content_template": "Payment failed for {{payload.customer.email}}",
  "embeds_template": "[{\"title\":\"Payment failed\",\"fields\":[{\"name\":\"Invoice\",\"value\":\"{{payload.invoice_id}}\"}]}]",
  "components_template": "[{\"type\":1,\"components\":[{\"type\":2,\"style\":5,\"label\":\"Open invoice\",\"url\":\"https://example.com/invoices/{{payload.invoice_id}}\"}]}]",
  "files_template": "[{\"url\":\"{{payload.receipt_url}}\",\"filename\":\"receipt.pdf\"}]",
  "suppress_notifications": true,
  "allowed_mentions_parse": []
}

Route only Discord-worthy events

  • Send failures, approvals, reviews, releases, and incidents to Discord.
  • Avoid sending every successful webhook unless the channel is intentionally a live event feed.
  • Filter by provider event type, environment, severity, customer tier, or payload fields before delivery.
  • Use a staging Discord destination before replaying production failures into a real channel.
  • Keep allowed mentions empty unless pinging users, roles, or everyone is intentional.

Debug Discord delivery

  • 401, 403, or 404 usually means the Discord webhook URL is missing, revoked, incomplete, or belongs to another channel.
  • Embed failures usually mean the rendered embeds_template is not valid Discord embed JSON.
  • Unexpected pings usually mean allowed_mentions_parse permits users, roles, or everyone.
  • Forum or media channel failures usually mean neither thread_id_template nor thread_name_template rendered a valid value.
  • Components and poll failures usually mean the rendered JSON does not match Discord's request schema.
  • Rate limiting should be handled with pacing and narrow replay windows.
  • Inspect the FastHook destination attempt response before editing templates or replaying a batch.

Retries, replay, and logs

Discord messages are useful for team awareness, but FastHook remains the delivery record. Each Discord attempt keeps response status, latency, rendered delivery evidence, and retry context, so operators can fix the destination before replaying important missed notifications.

  • Retry temporary Discord API or network failures with backoff.
  • Replay only action-worthy missed notifications after fixing URL or embed configuration.
  • Use rate limits so replay does not flood active channels.
  • Keep high-volume event archives in FastHook, object storage, or Sheets rather than Discord history.

Related guides