Forward GitHub Webhooks to Discord

Last updated: February 2026 · 4 min read

GitHub's native Discord integration exists, but it's all-or-nothing. You get every push, every PR, every issue comment. Your Discord channel becomes noise.

With Hookpipe, you control what gets forwarded. Only notify when code hits main. Transform the payload into Discord's format. If Discord has a blip, Hookpipe retries automatically.

The Goal

Setup

1Create your hook

curl -X POST https://hookpipe.app/api/hooks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "github-to-discord",
    "destinationUrl": "https://discord.com/api/webhooks/1234567890/abcdefg",
    "transformConfig": {
      "fieldMapping": {
        "content": "repository.full_name",
        "embeds[0].title": "head_commit.message",
        "embeds[0].description": "Pushed by {{sender.login}} to {{ref}}",
        "embeds[0].url": "repository.html_url"
      },
      "filters": [
        { "field": "ref", "operator": "equals", "value": "refs/heads/main" },
        { "field": "head_commit", "operator": "exists" }
      ]
    }
  }'

This hook:

2Configure GitHub

Go to your repository → Settings → Webhooks → Add webhook:

3Test it

Push to main. You should see an embed in Discord with the commit message and branch info.

Why not just use GitHub's Discord integration?

GitHub's integration can't filter by branch or transform the payload. You get every event or nothing. Hookpipe gives you control: filter, map fields, add static values, and retry on failure.

Other Events

Pull request opened:

{
  "fieldMapping": {
    "embeds[0].title": "pull_request.title",
    "embeds[0].description": "PR #{{number}} {{action}} by {{sender.login}}",
    "embeds[0].url": "pull_request.html_url"
  },
  "filters": [
    { "field": "action", "operator": "equals", "value": "opened" },
    { "field": "pull_request", "operator": "exists" }
  ]
}

Release published:

{
  "fieldMapping": {
    "embeds[0].title": "release.tag_name",
    "embeds[0].description": "{{release.body}}",
    "embeds[0].url": "release.html_url"
  },
  "filters": [
    { "field": "action", "operator": "equals", "value": "published" },
    { "field": "release", "operator": "exists" }
  ]
}

Cut the Noise

Only the events that matter, formatted the way you want.

Get Started →