- Save a new connection even if the user closed the tab before reaching your callback (
connection.created). - Stop syncing data for a connection that was deleted (
connection.deleted). - Track when tokens are refreshed (
connection.refreshed). - Audit integration changes made in the dashboard (
integration.*).
How delivery works
When an event happens, BundleUp sends one signedPOST to every webhook in the workspace that subscribes to that event. Your endpoint verifies the signature, answers 2xx straight away, and does the real work afterwards. Because a failed delivery isn’t resent, a periodic reconciliation against the Platform API catches anything you missed.
Delivery details:
Setting up a webhook
You need the admin or owner role.- Open Settings → Webhooks in the dashboard and create a webhook.
- Enter a name (3 to 50 characters) and your endpoint’s Webhook URL. It must be publicly reachable; use HTTPS.
- Choose the events to receive.
- Copy the signing secret and store it with your server’s secrets. You need it to verify signatures.
GET, POST /v1/webhooks and GET, PATCH, DELETE /v1/webhooks/{id}. See the Platform API reference.
Request format
Headers:
Body:
Writing a reliable endpoint
- Verify the signature before trusting anything in the body. See Verifying signatures.
- Respond within 3 seconds. Return
200as soon as the signature checks out, then process the event asynchronously (a job queue is ideal). Slow endpoints time out and the event is lost. - Be idempotent. Handle the same event twice without side effects. Key your processing on
actionplusdata.idplus the relevant timestamp. - Treat webhooks as hints, not the source of truth. Since deliveries aren’t retried, run a periodic job that lists connections with
GET /v1/connections(filter withexternal_idorintegration_identifier) and reconciles them with your database. - Monitor your endpoint. Alert on errors and slow responses in your own logs, since BundleUp doesn’t report failed deliveries.
Testing locally
Your local machine isn’t reachable from the internet, so expose it with a tunnel (for examplengrok http 3000 or cloudflared tunnel) and register the tunnel URL as a webhook in your development workspace. Then connect an account to trigger connection.created.
