Documentation

A friendly, plain-English guide to webhooks and how Webhook helps you catch, inspect, and deliver them. No jargon, no assumptions. Start here even if you have never seen a webhook before.

What is a Webhook?

The Doorbell Analogy

Imagine you order a pizza. You could keep opening the front door every 30 seconds to check if the delivery person is there. That would be exhausting (and weird).

Instead, the delivery person rings your doorbell when they arrive. You only have to respond when something actually happens.

A webhook works exactly the same way. Instead of your app constantly asking another service "did anything happen yet?", that service sends your app a message the moment something happens. It rings your doorbell.

How It Looks in Practice

Here is the basic flow. A provider (like Stripe, GitHub, or Shopify) sends a message to Webhook, and Webhook delivers it to your app.

Provider
Stripe, GitHub, etc.
Webhook
Catches & inspects
Your App
Receives & acts

A Real-World Example

Say you use Stripe to accept payments. When a customer pays you $50, Stripe sends a small message (called a payload) to a URL you provide. That message says something like:

{
  "type": "payment_intent.succeeded",
  "data": {
    "amount": 5000,
    "currency": "usd",
    "customer_email": "jane@example.com"
  }
}

Your app receives this and can then send a receipt, update a database, or do whatever you need. You never have to ask Stripe "did someone pay?" -- Stripe tells you.

What Does Webhook Do?

Webhook sits between the services that send webhooks and your application. Think of it as a reliable, smart mailbox for your webhooks. Here is what it does in plain English:

  • Catches every webhook so you never miss one, even if your app is temporarily down.
  • Shows you exactly what was sent -- the full payload, headers, timestamps, everything. Great for debugging.
  • Forwards webhooks to your app automatically, so your code gets the data it needs.
  • Retries when delivery fails. If your server is down or returns an error, Webhook tries again using a sensible schedule. No events lost.
  • Helps you diagnose problems. See delivery status, response codes, and timing so you can figure out what went wrong fast.
  • Lets you replay events. Made a bug fix and need to re-process an event? One click and it is sent again.
In short: Webhook makes webhooks reliable, visible, and easy to debug. You focus on what to do with the data. Webhook handles getting it to you safely.

Getting Started

1 Sign Up or Log In

If you do not have an account yet, head to the homepage and create one. If you already have an account, just log in.

2 Create a Project

Go to Integrations and pick the provider you want to receive webhooks from (for example, Stripe or GitHub). Click Quick Setup. This creates a project and gives you a unique webhook URL.

3 Copy Your Webhook URL

After setup, you will see a URL that looks like this:

https://webhook.sdnbros.app/p/<your-unique-token>

Copy it. This is the address where your provider will send webhooks.

4 Paste It in Your Provider

Go to your provider's dashboard (e.g., Stripe, GitHub) and find their webhook settings. Paste your Webhook URL there. See the Provider Guides below for step-by-step instructions.

5 Send a Test

Most providers have a "Send test webhook" button. Click it and then come back to the Events page. The event appears after it is received and processed. You can also test with curl:

curl -X POST https://webhook.sdnbros.app/p/<your-token> \
  -H "Content-Type: application/json" \
  -d '{"test": true}'

6 Set Up Forwarding (Optional)

If you want Webhook to forward events to your own backend, go to Settings and enter a Destination URL (e.g., https://myapp.com/webhooks). Webhook will automatically send every incoming event to that address, with retries if it fails.

That is it. Your endpoint is configured to receive webhooks.

Provider Setup Guides

Click a provider below to see step-by-step instructions for connecting it to Webhook.

Stripe
  1. Log into your Stripe Dashboard.
  2. Go to Developers (top-right) and then click Webhooks.
  3. Click Add endpoint.
  4. Paste your Webhook URL: https://webhook.sdnbros.app/p/<your-token>
  5. Choose which events to listen for (or select "All events" to start).
  6. Click Add endpoint to save.

To test: On the webhook endpoint page, click Send test webhook, pick any event type, and click Send. Check your Events page to confirm it arrived.

GitHub
  1. Go to your repository on GitHub (or your organization settings for org-wide webhooks).
  2. Click Settings, then Webhooks in the left sidebar.
  3. Click Add webhook.
  4. In the Payload URL field, paste: https://webhook.sdnbros.app/p/<your-token>
  5. Set Content type to application/json.
  6. Choose events (or "Send me everything") and click Add webhook.

To test: GitHub automatically sends a ping event when you create the webhook. Check your Events page to see it.

Shopify
  1. Log into your Shopify admin panel.
  2. Go to Settings (bottom-left), then Notifications.
  3. Scroll down to Webhooks and click Create webhook.
  4. Choose an event (e.g., "Order creation"), set format to JSON.
  5. Paste your Webhook URL: https://webhook.sdnbros.app/p/<your-token>
  6. Click Save.

To test: Click Send test notification next to your webhook. You will see it appear on your Events page.

Twilio
  1. Log into the Twilio Console.
  2. Go to Phone Numbers and select the number you want to configure.
  3. Under Messaging (or Voice), find the "A message comes in" (or "A call comes in") webhook field.
  4. Paste your Webhook URL: https://webhook.sdnbros.app/p/<your-token>
  5. Click Save.

To test: Send a text message to your Twilio number. The webhook will show up in your Events page.

SendGrid
  1. Log into SendGrid.
  2. Go to Settings, then Mail Settings.
  3. Click Event Webhook.
  4. Toggle it on and paste your Webhook URL in the HTTP POST URL field: https://webhook.sdnbros.app/p/<your-token>
  5. Select the events you want (delivered, opened, clicked, bounced, etc.).
  6. Click Save.

To test: Click Test Your Integration on the Event Webhook page. Check your Events page to confirm.

Using the CLI

What is the CLI for?

The sdnbros CLI lets you manage webhook projects, inspect and replay events, forward webhooks to your local machine via tunnel, and more — all from your terminal.

Install

Run this in your terminal:

curl -sSL https://webhook.sdnbros.app/install.sh | bash

This downloads the latest sdnbros binary to /usr/local/bin. Works on Linux (amd64/arm64) and macOS (Intel & Apple Silicon).

Or install manually:

# Download the binary for your platform
curl -Lo sdnbros https://webhook.sdnbros.app/dl/v0.4.3-93762f3/sdnbros-linux-amd64
chmod +x sdnbros
sudo mv sdnbros /usr/local/bin/

Log In

Connect the CLI to your account:

sdnbros login

This opens a browser window for authentication. Once you approve, the CLI is connected. Check your session with:

sdnbros whoami

Manage Projects

sdnbros webhook projects                              # List all projects
sdnbros webhook projects create --name my-project      # Create a new project
sdnbros webhook projects show --project my-project     # Show project details
sdnbros webhook projects delete --project my-project   # Delete a project

View & Replay Events

sdnbros webhook events --project my-project              # List recent events
sdnbros webhook events --project my-project --state failed # Show only failed events
sdnbros webhook events inspect <event-id>                 # Full event detail (JSON)
sdnbros webhook events replay <event-id>                  # Re-deliver a failed event

Find event IDs on the Events page or from the list output above.

Local Tunnel (Forward to localhost)

Forward incoming webhooks to your local dev server:

sdnbros webhook tunnel --project my-project --port 8080 --path /webhook

Webhooks received by your project are forwarded to http://localhost:8080/webhook in real time. The tunnel auto-reconnects if the connection drops.

Set Destination

sdnbros webhook destination set --project my-project --url https://api.example.com/webhooks

Configure where webhooks are forwarded to in production.

Other Commands

sdnbros version                  # Check CLI version
sdnbros update                   # Update to latest version
sdnbros completion bash          # Generate shell completions
sdnbros logout                   # Clear stored credentials

Forwarding & Retries

How Forwarding Works

When you set a Destination URL in your project settings, Webhook forwards every incoming webhook to that URL. Your app receives the exact same payload and headers that the provider sent.

If your app responds with a 2xx status code (like 200 OK), the delivery is marked as successful. Anything else (or a timeout) is treated as a failure, and Webhook will retry.

The Retry Schedule

When delivery fails, Webhook does not give up. It tries again on this schedule:

Attempt 1
Fails
+30 sec
+2 min
+15 min
+1 hour
+4 hours

That is 6 total attempts spread over roughly 5.5 hours. If the last attempt still fails, the event is marked as failed. You can always replay it manually later.

What counts as success? Any HTTP response with a status code in the 200-299 range. For example: 200 OK, 201 Created, 204 No Content. Everything else triggers a retry.

Troubleshooting

"I don't see my webhook"

  • Check the URL. Make sure the URL you pasted in your provider exactly matches the one from your Webhook project. Even a small typo will break it.
  • Check your provider config. Some providers require you to select specific event types. Make sure you have at least one event type selected.
  • Try sending a test manually. Use the curl command from the Getting Started section. If that works, the issue is on the provider side.
  • Check the right project. If you have multiple projects, make sure you are looking at the correct one in the Events page.

"Delivery keeps failing"

  • Check your destination URL. Go to Settings and verify the forwarding URL is correct and reachable from the internet.
  • Is your server actually running? Try opening the destination URL in a browser or hitting it with curl. If it does not respond, Webhook cannot deliver to it either.
  • Check the response code. Click on a failed event in the Events page. The delivery details show the HTTP status code your server returned. A 500 means your server hit an error; a 404 means the URL path is wrong.
  • Check for timeouts. Webhook waits up to 30 seconds for your server to respond. If your processing takes longer, return 200 immediately and process in the background.

"I hit my event limit"

When you reach your monthly event limit, new webhooks get a 429 Too Many Requests response. Your existing events are safe. To fix this, upgrade your plan for a higher limit.

"How do I replay a failed event?"

Go to the Events page, click on the failed event, and hit the Replay button. Or use the CLI: sdnbros webhook events replay <event-id>. Replay is available on Pro and Business plans.

"Where are my old events?"

Events remain available in the product based on your plan: 3 days on Free, 7 days on Starter, 30 days on Pro, and 1 year on Business. Periodic cleanup removes expired primary event rows, but object-storage copies, backups, and some derived records may remain longer. See the Privacy Policy.

Plans & Pricing

Review currently available plans, included event limits, and retention on the Pricing page. Manage an existing subscription on the Billing page.

Frequently Asked Questions

What happens when I hit my event limit?
New incoming webhooks will receive a 429 Too Many Requests response. Your existing events and delivery configuration remain intact. Upgrade your plan to increase the limit.
Can I use multiple ingress URLs for the same project?
Each project gets one ingress URL. If you need to receive webhooks from multiple providers, create a separate project for each one. This also gives you better event classification and analytics per provider.
How do I replay a failed event?
On the Events page, click on a failed event and use the Replay button. You can also use the CLI: sdnbros webhook events replay <event-id>. Event replay is available on Starter ($19/mo) and above.
How is my webhook data protected?
Public SDNBros ingress uses TLS. Webhook payload bodies do not have application-layer encryption. Stored destination authorization headers and GitLab tokens use AES-256-GCM. See the Privacy Policy for storage and retention details.
Can I add team members to a project?
Yes. Go to Settings, select a project, and use the Team Members section to invite collaborators by email. Team members can view events and analytics for the shared project.
Do I need to respond to webhooks quickly?
Webhook waits up to 30 seconds for a response from your destination URL. If your processing takes longer than that, the best practice is to return a 200 response immediately and process the webhook payload in the background (e.g., using a job queue).
What is signature verification?
Many providers (like Stripe and GitHub) sign their webhooks with a secret key. This lets you verify the webhook actually came from them and was not faked by someone else. Add your provider's signing secret in Settings to enable automatic verification.
How do I delete my account?
Settings can delete an individual project. To request account deletion, email anton@sdnbros.com. We will confirm the request, its scope and timing, and any operational or legally required records that must be retained.
Can I forward the same webhook to multiple destinations?
Currently each project supports one destination URL. If you need to fan out to multiple endpoints, you can set up a lightweight proxy on your end that receives the webhook from Webhook and forwards it to multiple services.

Support

Email Support

anton@sdnbros.com

We typically respond within 24 hours.

CLI Bug Reports

Run sdnbros version and include the output when reporting CLI bugs via email.