Webhooks
ReleaseRay uses GitHub webhooks to automatically capture pull requests and issues as they're merged and closed. This guide explains how webhooks work, what data we collect, and how to troubleshoot common issues.
Overview
Webhooks are automatic. When you install the ReleaseRay GitHub App, we automatically configure webhooks for you. You don't need to manually set up webhook URLs or manage secrets.
What Happens
- You merge a PR or close an issue in GitHub
- GitHub sends a webhook to ReleaseRay within seconds
- We process the data and store PR/issue metadata
- You generate release notes that include all merged PRs
This happens automatically in the background. No configuration needed.
How It Works
Installation Process
When you install the ReleaseRay GitHub App:
- GitHub creates webhooks for your selected repositories
- ReleaseRay receives events when PRs are merged, issues are closed, etc.
- Webhook secret is managed automatically by GitHub (you never see it)
- Events are verified using HMAC SHA-256 signatures
What Events We Subscribe To
ReleaseRay listens for these GitHub events:
- ✅ Pull Request (
pull_request)- Opened, edited, closed, merged
- We capture: title, body, labels, author, merge date, linked issues
- ✅ Issues (
issues)- Opened, edited, closed
- We capture: title, body, labels, author, close date
- ✅ Push (
push)- When commits are pushed (for tag detection)
- We capture: tags, commit messages
We do NOT subscribe to:
- ❌ Code content events (we never see your source code)
- ❌ Comments (we don't need PR/issue comments)
- ❌ Reviews (PR reviews aren't needed for release notes)
Webhook Security
HMAC Signature Verification
Every webhook GitHub sends includes a signature:
X-Hub-Signature-256: sha256=abc123...
ReleaseRay verifies this signature before processing any webhook. This ensures:
- ✅ Webhooks came from GitHub (not a malicious actor)
- ✅ Webhooks weren't tampered with in transit
- ✅ Your data is protected
If signature verification fails, the webhook is rejected with a 401 Unauthorized response.
IP Whitelisting (Optional)
GitHub webhooks come from specific IP ranges. If you have a corporate firewall, you may need to whitelist:
192.30.252.0/22
185.199.108.0/22
140.82.112.0/20
143.55.64.0/20
See GitHub's IP ranges for the current list.
Data Collection
What We Capture
From Pull Requests:
- PR number (e.g.,
#245) - Title (e.g., "Add OAuth2 PKCE support")
- Description/body (markdown text)
- Labels (e.g.,
feature,bug,breaking) - Author (GitHub username)
- Merge date and time
- Linked issues (detected from "closes #123" in description)
- State (open, closed, merged)
From Issues:
- Issue number (e.g.,
#123) - Title
- Description/body
- Labels
- Author
- Close date (if closed)
- State (open, closed)
From Push Events:
- Git tags (e.g.,
v1.2.0) - Tag dates
- Commit SHAs (for linking)
What We DON'T Capture
- ❌ Source code (we have no access to repository contents)
- ❌ File diffs or code changes
- ❌ PR/issue comments
- ❌ Review comments or approval status
- ❌ Commit contents (only metadata)
Webhook Processing
Processing Pipeline
GitHub Event → ReleaseRay API → Background Queue → Database
- Webhook arrives at
/api/webhooks/github - Signature verified (rejects if invalid)
- Event enqueued in Redis (BullMQ)
- Background worker processes the event
- Data stored in PostgreSQL
Processing Time
- Webhook receipt: Instant (< 100ms)
- Background processing: 1-5 seconds
- Data available: Within 10 seconds of merge
You can generate release notes immediately after merging a PR. The data will be there.
Rate Limiting
GitHub's Limits
GitHub rate limits webhooks to prevent abuse:
- 5000 events per hour per repository
- 50 events per minute per repository
If you exceed these limits, GitHub will queue events and deliver them later.
ReleaseRay's Limits
We rate limit webhook ingestion:
- 100 webhooks per minute per organization
- 1000 webhooks per hour per organization
This prevents runaway automation from overwhelming our system.
Webhook Failures
Why Webhooks Fail
Common reasons webhooks might fail:
-
Signature verification failed
- GitHub secret doesn't match
- Webhook was tampered with
- Clock skew between GitHub and ReleaseRay
-
Rate limit exceeded
- Too many events in a short time
- GitHub or ReleaseRay rate limits hit
-
Service downtime
- ReleaseRay API temporarily unavailable
- Scheduled maintenance
-
Invalid payload
- Malformed JSON
- Missing required fields
Webhook Retries
If a webhook fails, GitHub automatically retries:
- Retry 1: After 1 minute
- Retry 2: After 5 minutes
- Retry 3: After 15 minutes
- Retry 4: After 1 hour
- Retry 5: After 6 hours
After 5 retries, GitHub gives up and marks the webhook as failed.
Monitoring Webhooks
GitHub's Webhook Dashboard
Check webhook delivery status:
- Go to your GitHub organization settings
- Navigate to Installed GitHub Apps
- Click Configure next to ReleaseRay
- Click Advanced tab
- View Recent Deliveries
You'll see:
- ✅ Successful deliveries (HTTP 200)
- ⚠️ Failed deliveries (HTTP 4xx/5xx)
- 🔄 Pending retries
ReleaseRay Dashboard
Check ingestion status:
- Go to ReleaseRay dashboard
- Navigate to Settings → Webhooks
- View recent webhook activity
You'll see:
- Last webhook received
- Total webhooks processed
- Any errors or failures
Troubleshooting
"No PRs showing up"
Check:
- ✅ GitHub App is installed on the repository
- ✅ Repository is selected in ReleaseRay
- ✅ PRs are actually merged (not just closed)
- ✅ Webhook deliveries are succeeding (check GitHub dashboard)
Solution:
- Wait 10 seconds after merging
- Check webhook delivery status in GitHub
- Contact support if webhooks are failing
"Old PRs are missing"
Explanation: Webhooks only capture events that happen AFTER installation.
Solution:
- Use the "Backfill" feature in ReleaseRay
- Go to Settings → Repositories → Select repo → Click "Backfill Data"
- We'll fetch historical PRs via GitHub API
"Webhook signature verification failed"
Causes:
- GitHub App was reinstalled (new secret generated)
- Man-in-the-middle attack (rare)
- Clock skew (very rare)
Solution:
- Reinstall the GitHub App
- Check status.releaseray.com for incidents
- Contact support if issue persists
"Rate limit exceeded"
Causes:
- Merging >100 PRs per minute
- Automation scripts creating PRs too fast
Solution:
- Slow down PR creation/merging
- Webhooks will queue and process when rate limit resets
- Data won't be lost, just delayed
Webhook Payload Examples
Pull Request Merged
{
"action": "closed",
"pull_request": {
"number": 245,
"title": "Add OAuth2 PKCE support",
"body": "Implements PKCE flow for enhanced security. Closes #234",
"state": "closed",
"merged": true,
"merged_at": "2025-11-03T14:32:00Z",
"user": {
"login": "johndoe"
},
"labels": [{ "name": "feature" }, { "name": "security" }]
},
"repository": {
"full_name": "acme/myapp"
}
}
Issue Closed
{
"action": "closed",
"issue": {
"number": 234,
"title": "Add SSO support for enterprise customers",
"body": "We need OAuth2 PKCE for enterprise SSO...",
"state": "closed",
"closed_at": "2025-11-03T14:32:00Z",
"user": {
"login": "janedoe"
},
"labels": [{ "name": "enhancement" }, { "name": "enterprise" }]
},
"repository": {
"full_name": "acme/myapp"
}
}
Best Practices
PR Title Guidelines
Webhook data is only as good as your PR metadata. Write clear titles:
❌ Bad:
- "fix stuff"
- "update code"
- "changes"
✅ Good:
- "Fix race condition in webhook processor causing duplicate events"
- "Add OAuth2 PKCE support for enhanced security"
- "Update Stripe integration to latest API version"
ReleaseRay uses PR titles as the first line of your release notes. Make them count.
Use Labels
Labels help ReleaseRay categorize changes:
type: feature→ Features sectiontype: bug→ Bug Fixes sectiontype: breaking→ Breaking Changes sectionarea: auth→ Group by areapriority: high→ Prioritize in notes
Link Issues
Use "closes #123" in PR descriptions to link PRs to issues:
## Description
This PR adds OAuth2 PKCE support.
Closes #234
Fixes #235
Resolves #236
ReleaseRay will pull context from linked issues for richer release notes.
Webhook API Reference
Endpoint
POST https://app.releaseray.com/api/webhooks/github
Headers
X-Hub-Signature-256: sha256=<HMAC>
X-GitHub-Event: pull_request
X-GitHub-Delivery: <UUID>
Content-Type: application/json
Response Codes
- 200 OK: Webhook processed successfully
- 202 Accepted: Webhook queued for processing
- 400 Bad Request: Invalid payload
- 401 Unauthorized: Signature verification failed
- 429 Too Many Requests: Rate limit exceeded
- 500 Internal Server Error: Processing error (will retry)
Advanced: Manual Webhook Testing
Send Test Webhook
You can manually trigger a webhook from GitHub:
- Go to GitHub App settings → Advanced tab
- Find a recent delivery
- Click Redeliver
This is useful for testing webhook processing without creating real PRs.
Local Testing with ngrok
For development:
# Start ReleaseRay locally
pnpm dev
# In another terminal, start ngrok
ngrok http 3001
# Update GitHub App webhook URL to ngrok URL
# Example: https://abc123.ngrok.io/api/webhooks/github
See SETUP_GUIDE.md for detailed local development setup.
Compliance & Privacy
Data Retention
Webhook data is retained according to our Privacy Policy:
- Active repositories: PRs/issues retained for 12 months after last sync
- Inactive repositories: Data deleted 30 days after app uninstall
- Released notes: Retained indefinitely (you can delete)
GDPR Compliance
Webhook data is processed under legitimate interest (GDPR Article 6(1)(f)):
- We need PR/issue data to generate release notes (core service)
- Data is limited to what's necessary
- You can delete your data anytime
Data Processing Addendum
For enterprise customers, we offer a Data Processing Addendum (DPA) covering webhook data handling.
Contact sales@releaseray.com for details.
FAQ
Do I need to configure webhooks manually?
No. Webhooks are automatically configured when you install the GitHub App.
Can I disable webhooks for specific repositories?
Yes. Unselect repositories in your GitHub App installation settings. Webhooks will stop immediately.
What happens if I reinstall the GitHub App?
Webhooks are recreated automatically. Historical data is preserved (unless you explicitly delete it).
Can I see webhook payloads?
Yes. Check Recent Deliveries in GitHub App settings → Advanced tab. You can view full payloads and responses.
Do webhooks work with GitHub Enterprise?
Yes. ReleaseRay supports GitHub Enterprise Server 3.0+. Contact support for setup guidance.
Support
Need Help?
- Documentation: Full docs
- Email: support@releaseray.com
- Status: status.releaseray.com
Questions about webhooks? We're here to help!
Report Webhook Issues
If webhooks aren't working:
- Check GitHub's Recent Deliveries for errors
- Check our status page for incidents
- Email support with:
- Repository name
- Approximate time of issue
- Screenshot of failed delivery (if available)
We'll investigate and resolve within 24 hours.
Related Documentation
- Getting Started - Initial setup
- Integrations - Configure publishing channels
- API Reference - REST API documentation
- Dashboard Guide - Using the ReleaseRay dashboard