Skip to main content
Together
Sign in

Set up webhooks

Get a signed HTTP callback every time something happens in your org - a donor crosses a threshold, a recurring gift fails, a checkout link is paid. Webhooks let your CRM, analytics, or Slack bot react in real time.

Outbound webhooks deliver a signed HTTP POST to a URL you choose every time a subscribed event fires in your organisation. Use them to push a donation into your reporting warehouse, ping #fundraising when a major gift lands, or trigger a thank-you sequence in your CRM the instant a donor confirms.

Before you start

You need:

Steps

1. Open the webhooks page

Go to Settings -> Integrations -> Webhooks. You'll see a list of existing endpoints (empty on first visit) and an Add endpoint button.

If you're on Free, the page shows an upgrade prompt instead of the form. Bump to Grow first.

2. Add an endpoint

Click Add endpoint and fill in:

Click Create endpoint.

3. Save the signing secret

Together generates a fresh signing secret per endpoint and shows it to you once. Copy it into your receiver's environment (e.g. TOGETHER_WEBHOOK_SECRET) before you close the dialog.

You can rotate the secret later (in case it leaks), but the rotation invalidates the previous secret on every subsequent delivery, so you must update your receiver atomically.

4. Verify signatures on your end

Every delivery carries three headers your receiver must check:

webhook-id: msg_2W3kZQ...
webhook-timestamp: 1716480000
webhook-signature: v1,<base64-hmac-sha256>

The Developer reference has copy-paste snippets for Node, Python, Ruby, and Go using the official standardwebhooks library. Do not trust an unsigned payload. A receiver that doesn't verify is vulnerable to anyone with the URL forging events.

5. Send a test event

The simplest sanity check is to trigger an event manually. The cheapest options:

If your receiver returns 2xx, the delivery is marked Delivered. Anything else (4xx, 5xx, timeout, network error) is marked Failed and retried with exponential backoff: 60s, 5m, 30m, 3h, 24h, then dead-lettered.

Watching deliveries

Click an endpoint's row at Settings -> Integrations -> Webhooks to open its detail page. The Recent deliveries table shows:

ColumnWhat it means
EventThe event type and message id (webhook-id header).
Sent atWhen Together attempted the delivery.
StatusDelivered (2xx response), Pending (in retry queue), Failed (gave up after 6 attempts), or in-flight.
HTTPYour receiver's response code, or the network error (timeout, DNS, TLS).
AttemptsHow many tries Together has made.

Click a row to see the full request body and response headers. This is the fastest way to diagnose a receiver that's parsing the payload wrong.

Common events to subscribe to

Pick what your integration actually needs. Subscribing to everything is rarely the right answer.

Fundraising operations

Donor data

Compliance signals (premium)

The Developer reference has the full event catalogue plus the schemas. The OpenAPI spec at /api/v1/openapi.json is the machine-readable source of truth.

Donor PII (email, name, organisation name) is included in event payloads so receivers can act without a follow-up API call. Treat your endpoints as PII egress: HTTPS only, terminate TLS on infrastructure you control, and don't point at a service you haven't done diligence on.

When to disable or rotate

What to do next